Chinaunix首页 | 论坛 | 博客
  • 博客访问: 527818
  • 博文数量: 100
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-09-22 09:50
个人简介

一个守望数据库的老菜鸟

文章分类

全部博文(100)

文章存档

2019年(21)

2018年(17)

2017年(38)

2016年(24)

我的朋友

分类: NOSQL

2016-11-09 15:43:21

博客文章除注明转载外,均为原创。转载请注明出处。
本文链接地址:http://blog.chinaunix.net/uid-31396856-id-5754849.html


一、简述
     redis高可用方案有很多,比如:
(1)keepalived+redis主从方案,keepalived是主备模式;
(2)使用redis sentinel做redis高可用方案,用sentinel去做redis自动故障转移和信息监控;
(3)Codis 是一个分布式 Redis 解决方案
对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务;
(4)从redis 3.0开始,官方开始支持redis cluster的高可用解决方案;
Redis集群是一个分布式(distributed)、容错(fault-tolerant)的 Redis内存K/V服务, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子(subset),比如Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误。
Redis集群的几个重要特征:
(1).Redis 集群的分片特征在于将键空间分拆了16384个槽位,每一个节点负责其中一些槽位。
(2).Redis提供一定程度的可用性,可以在某个节点宕机或者不可达的情况下继续处理命令.
(3).Redis 集群中不存在中心(central)节点或者代理(proxy)节点, 集群的其中一个主要设计目标是达到线性可扩展性(linear scalability)。
      这里介绍redis cluster的组建,由于redis cluster至少需要3个主节点以保证正常运行,因此选用三主三从共六个节点作为测试的架构。 测试使用2台服务器,分别为:192.168.56.21,192.168.56.22.每个服务器创建3个节点。

二、创建redis节点
(1)下载
wget http://download.redis.io/releases/redis-3.2.5.tar.gz
(2)安装步骤:
tar -zxvf redis-3.2.5.tar.gz -C /opt
ln -s /opt/redis-3.2.5 /usr/local/redis
cd /usr/local/redis
make
make install
 
(3).配置redis节点
创建文件结构
mkdir -p /data/redis-cluster
在两个节点服务器上创建各自的相关目录
mkdir 7000 7001 7002
mkdir 7003 7004 7005
cp /usr/lcoal/redis/redis.conf /data/redis-cluster/7000
cp /usr/lcoal/redis/redis.conf /data/redis-cluster/7001
cp /usr/lcoal/redis/redis.conf /data/redis-cluster/7002
cp /usr/lcoal/redis/redis.conf /data/redis-cluster/7003
cp /usr/lcoal/redis/redis.conf /data/redis-cluster/7004
cp /usr/lcoal/redis/redis.conf /data/redis-cluster/7005

配置文件修改:
128行 :daemonize yes
150行 :pidfile  /var/run/redis_7000.pid 
84行:port  7000  
721行:cluster-enabled  yes 
729行: cluster-config-file nodes_7000.conf
735行:cluster-node-timeout  5000 
593行:appendonly  yes 

配置安装rediscls02节点(略)

(4).启动redis节点
[root@rediscls01 redis-cluster]# which redis-server 
/usr/local/bin/redis-server
[root@rediscls01 redis-cluster]# redis-server  redis.conf

(6).服务验证
进程检查结果如下:
[root@rediscls01 redis-cluster]# ps -ef | grep redis
root      1834     1  0 11:32 ?        00:00:00 redis-server 127.0.0.1:7000 [cluster]           
root      1838     1  0 11:32 ?        00:00:00 redis-server 127.0.0.1:7001 [cluster]           
root      1842     1  0 11:32 ?        00:00:00 redis-server 127.0.0.1:7002 [cluster]           
root      1847  1626  0 11:33 pts/0    00:00:00 grep redis
服务端口检查
[root@rediscls01 redis-cluster]# netstat -tnlp | grep redis
tcp        0      0 127.0.0.1:7000              0.0.0.0:*                   LISTEN      1834/redis-server 1 
tcp        0      0 127.0.0.1:7001              0.0.0.0:*                   LISTEN      1838/redis-server 1 
tcp        0      0 127.0.0.1:7002              0.0.0.0:*                   LISTEN      1842/redis-server 1 
tcp        0      0 127.0.0.1:17000             0.0.0.0:*                   LISTEN      1834/redis-server 1 
tcp        0      0 127.0.0.1:17001             0.0.0.0:*                   LISTEN      1838/redis-server 1 
tcp        0      0 127.0.0.1:17002             0.0.0.0:*                   LISTEN      1842/redis-server 1 
22服务器结果如下:
[root@rediscls02 ~]# ps -ef | grep redis
root      1818     1  0 11:32 ?        00:00:00 redis-server 127.0.0.1:7003 [cluster]           
root      1824     1  0 11:32 ?        00:00:00 redis-server 127.0.0.1:7004 [cluster]           
root      1828     1  0 11:32 ?        00:00:00 redis-server 127.0.0.1:7005 [cluster]           
root      1832  1781  0 11:33 pts/0    00:00:00 grep redis
[root@rediscls02 ~]# netstat -tnlp | grep redis
tcp        0      0 127.0.0.1:7003              0.0.0.0:*                   LISTEN      1818/redis-server 1 
tcp        0      0 127.0.0.1:7004              0.0.0.0:*                   LISTEN      1824/redis-server 1 
tcp        0      0 127.0.0.1:7005              0.0.0.0:*                   LISTEN      1828/redis-server 1 
tcp        0      0 127.0.0.1:17003             0.0.0.0:*                   LISTEN      1818/redis-server 1 
tcp        0      0 127.0.0.1:17004             0.0.0.0:*                   LISTEN      1824/redis-server 1 
tcp        0      0 127.0.0.1:17005             0.0.0.0:*                   LISTEN      1828/redis-server 1 
redis节点安装完毕。

7.连接验证
[root@rediscls01 redis-cluster]# redis-cli -h 192.168.56.21 -p 7000
192.168.56.21:7000> 
192.168.56.21:7000> exit
[root@rediscls01 redis-cluster]# redis-cli -h 192.168.56.21 -p 7001
192.168.56.21:7001> exit
[root@rediscls01 redis-cluster]# redis-cli -h 192.168.56.21 -p 7002
192.168.56.21:7002> exit
[root@rediscls01 redis-cluster]# redis-cli -h 192.168.56.22 -p 7003
192.168.56.22:7003> 
192.168.56.22:7003> exit

[root@rediscls01 redis-cluster]# redis-cli -h 192.168.56.22 -p 7004
192.168.56.22:7004> exit
[root@rediscls01 redis-cluster]# 
[root@rediscls01 redis-cluster]# redis-cli -h 192.168.56.22 -p 7005
192.168.56.22:7005> exit

三、创建集群
怎么样把redis各个节点组合起来来搭建集群。官方提供的工具:redis-trib.rb(/usr/local/redis-3.2.1/src/redis-trib.rb) 是用ruby写的一个程序,因此还需要安装ruby.
1.配置安装工具
yum -y install ruby ruby-devel rubygems rpm-build

因为网络原因:gem install redis失败
只好手工下载安装:
wget https://rubygems.org/downloads/redis-3.3.1.gem
[root@rediscls01 ~]# gem install -l ./redis-3.3.1.gem 
Successfully installed redis-3.3.1
1 gem installed
Installing ri documentation for redis-3.3.1...
Installing RDoc documentation for redis-3.3.1...

2、创建redis cluster
在第一个服务器上运行
[root@rediscls01 redis-cluster]# /usr/local/redis/src/redis-trib.rb  create --replicas 1  192.168.56.21:7000 192.168.56.21:7001  192.168.56.21:7002 192.168.56.22:7003  
192.168.56.22:7004 192.168.56.22:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.56.22:7003
192.168.56.21:7000
192.168.56.22:7004
Adding replica 192.168.56.21:7001 to 192.168.56.22:7003
Adding replica 192.168.56.22:7005 to 192.168.56.21:7000
Adding replica 192.168.56.21:7002 to 192.168.56.22:7004
M: 04e1c93333ca47fe6f3e18ef73bc7f69e9d9a13a 192.168.56.21:7000
   slots:5461-10922 (5462 slots) master
S: e6678b43ea46f500cf6eacbe2295af6b91e54193 192.168.56.21:7001
   replicates 12f700e533e195cd7620112a80b5f2ba2af054aa
S: 2314d710c4ca4ad7baa2abdad9b97b9329aa7789 192.168.56.21:7002
   replicates 8cf406f09a89cede69ab2ae84899a679cc1c2981
M: 12f700e533e195cd7620112a80b5f2ba2af054aa 192.168.56.22:7003
   slots:0-5460 (5461 slots) master
M: 8cf406f09a89cede69ab2ae84899a679cc1c2981 192.168.56.22:7004
   slots:10923-16383 (5461 slots) master
S: 9c7a3a7f4a6d4515a52534624ce2e43de3de9fc2 192.168.56.22:7005
   replicates 04e1c93333ca47fe6f3e18ef73bc7f69e9d9a13a
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 192.168.56.21:7000)
M: 04e1c93333ca47fe6f3e18ef73bc7f69e9d9a13a 192.168.56.21:7000
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 8cf406f09a89cede69ab2ae84899a679cc1c2981 192.168.56.22:7004
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 2314d710c4ca4ad7baa2abdad9b97b9329aa7789 192.168.56.21:7002
   slots: (0 slots) slave
   replicates 8cf406f09a89cede69ab2ae84899a679cc1c2981
S: 9c7a3a7f4a6d4515a52534624ce2e43de3de9fc2 192.168.56.22:7005
   slots: (0 slots) slave
   replicates 04e1c93333ca47fe6f3e18ef73bc7f69e9d9a13a
M: 12f700e533e195cd7620112a80b5f2ba2af054aa 192.168.56.22:7003
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: e6678b43ea46f500cf6eacbe2295af6b91e54193 192.168.56.21:7001
   slots: (0 slots) slave
   replicates 12f700e533e195cd7620112a80b5f2ba2af054aa
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
如上cluster创建结果:
Master 7000 7004 7003
Slave 7002 7005 7001
至此,redis cluster集群创建完毕

四、集群信息:
127.0.0.1:7000> CLUSTER NODES
8cf406f09a89cede69ab2ae84899a679cc1c2981 192.168.56.22:7004 master - 0 1478674477648 5 connected 10923-16383
04e1c93333ca47fe6f3e18ef73bc7f69e9d9a13a 192.168.56.21:7000 myself,master - 0 0 1 connected 5461-10922
2314d710c4ca4ad7baa2abdad9b97b9329aa7789 192.168.56.21:7002 slave 8cf406f09a89cede69ab2ae84899a679cc1c2981 0 1478674477146 5 connected
9c7a3a7f4a6d4515a52534624ce2e43de3de9fc2 192.168.56.22:7005 slave 04e1c93333ca47fe6f3e18ef73bc7f69e9d9a13a 0 1478674478150 6 connected
12f700e533e195cd7620112a80b5f2ba2af054aa 192.168.56.22:7003 master - 0 1478674476140 4 connected 0-5460
e6678b43ea46f500cf6eacbe2295af6b91e54193 192.168.56.21:7001 slave 12f700e533e195cd7620112a80b5f2ba2af054aa 0 1478674476644 4 connected
集群状态检查
[root@rediscls01 ~]# redis-trib.rb check 192.168.56.21:7000
>>> Performing Cluster Check (using node 192.168.56.21:7000)
M: 04e1c93333ca47fe6f3e18ef73bc7f69e9d9a13a 192.168.56.21:7000
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: 8cf406f09a89cede69ab2ae84899a679cc1c2981 192.168.56.22:7004
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 2314d710c4ca4ad7baa2abdad9b97b9329aa7789 192.168.56.21:7002
   slots: (0 slots) slave
   replicates 8cf406f09a89cede69ab2ae84899a679cc1c2981
S: 9c7a3a7f4a6d4515a52534624ce2e43de3de9fc2 192.168.56.22:7005
   slots: (0 slots) slave
   replicates 04e1c93333ca47fe6f3e18ef73bc7f69e9d9a13a
M: 12f700e533e195cd7620112a80b5f2ba2af054aa 192.168.56.22:7003
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: e6678b43ea46f500cf6eacbe2295af6b91e54193 192.168.56.21:7001
   slots: (0 slots) slave
   replicates 12f700e533e195cd7620112a80b5f2ba2af054aa
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
五、redis cluster测试
1.连通性测试;
  登陆redis各节点进行验证。
2.数据库操作功能测试;
  对redis cluster 进行get 和 set数据的测试。
3.高可用测试;
  对各节点和服务器进行failover测试。
---The end
阅读(2212) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~