Redis-Cluster集群只有版本3.0之后才支持, 集群Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接,并且包含主从、哨兵等功能不需要另外去处理。

redis-master-cluster-1.png

1、集群Redis-Cluster结构 

1) 每个Redis-Cluster节点相互发送Pong-Ping来确认节点之间是畅通的 

2) Redis集群预分好16384个哈希槽,分配给参与的节点(不一定平均分配) 

3) 当键值写入时,根据键生成哈希值,写入到拥有该哈希槽的节点中 

4) 当一半以上的节点反馈无法与某个节点连接时,才确认该节点fail 

5) 节点需要奇数个,满足结构4)的离线反馈


2、Redis-Cluster的主从复制+哨兵模式 

设置集群时,可以将某些节点设置从节点,从节点不参与分配哈希槽,只负责同步主节点的数据,当主节点断线时,从节点会接替主节点的哈希槽,并广播给其他的主节点,它接替主节点的哈希槽及其数据(类似Redis中的主从复制+哨兵模式的功能效果) 

redis-master-cluster-2.png


3、Redis集群搭建 

试验只有一台服务器,这里利用端口模拟多个Redis服务,由于节只能是奇数(上面结构有提到),所以开启6个Redis服务,3个做主节点,3个做从节,端口分别为6371, 6372, 6373, 6374, 6375, 6376 

1) 安装Redis-3.0以上版本

① 判断redis版本

[root@192 redis]# redis-server --version 

Redis server v=3.2.12 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=5da7308980e9b15

② 版本不足时,安装新的Redis, 下载地址: http://download.redis.io/releases/,这里选择redis-2.8.19.tar.gz,然后解压安装编译。


 2) 配置集群文件

redis安装在/usr/local/redis 

[root@192 redis]# cd /usr/local/redis/etc 

[root@192 redis]# mkdir 6371 

[root@192 redis]# cp redis.conf 6371 

[root@192 redis]# vim 6371/redis.conf

daemonize yes #后台启动 

port 6371 #修改端口号 

cluster-enabled yes #开启cluster,去掉注释 

cluster-config-file nodes.conf 

cluster-node-timeout 15000 

appendonly yes


根据6371为模板,复制5个目录及其文件,然后将文件夹内的redis.conf的端口修改成对应端口 

[root@192 redis]# cp -r 6371 6372 

[root@192 redis]# cp -r 6371 6373 

[root@192 redis]# cp -r 6371 6374 

[root@192 redis]# cp -r 6371 6375 

[root@192 redis]# cp -r 6371 6376


3) 安装集群的依赖ruby 

先确认redis/bin中有redis-trib.rb 

[root@192 redis]# yum install ruby -y 

[root@192 redis]# yum install rubygems -y 

安装redis-trib.rb运行依赖的ruby的包redis-3.2.2.gem 

[root@192 redis]#cd /usr/local/src 

[root@192 src]#wget https://rubygems.global.ssl.fastly.net/gems/redis-3.2.2.gem 

[root@192 src]# gem install redis-3.2.2.gem


4) 开启redis脚本 

[root@192 src]# vim start-redis.sh 

for I in `seq 1 6`; 

do 

 cd "/usr/local/redis/etc/637${I}" 

 /usr/local/redis/bin/redis-server ./redis.conf 

done

[root@192 src]# chmod +x start-redis.sh 

[root@192 src]# sh start-redis.sh 

[root@192 src]#ps -ef | grep redis 

root 4875 1 2 18:12 ? 00:00:00 redis-server 127.0.0.1:6371 [cluster] 

root 4881 1 1 18:12 ? 00:00:00 redis-server 127.0.0.1:6372 [cluster] 

root 4885 1 1 18:12 ? 00:00:00 redis-server 127.0.0.1:6373 [cluster] 

root 4889 1 1 18:12 ? 00:00:00 redis-server 127.0.0.1:6374 [cluster] 

root 4891 1 2 18:12 ? 00:00:00 redis-server 127.0.0.1:6375 [cluster] 

root 4873 1 2 18:12 ? 00:00:00 redis-server 127.0.0.1:6376 [cluster] 

root 4903 2888 0 18:12 pts/0 00:00:00 grep redis

执行以下操作可以关闭redis 

[root@192 src]#pkill -9 redis


5) redis-trib.rb创建集群

create是创建一个集群,--replicas=1是为每个主节点创建从节点

[root@192 src]#/usr/local/redis/bin/redis-trib.rb create --replicas 1 127.0.0.1:6371 127.0.0.1:6372 127.0.0.1:6373 127.0.0.1:6373 127.0.0.1:6374 127.0.0.1:6375 127.0.0.1:6376

redis-master-cluster-3.png

从图中可以看出127.0.0.1:6371、127.0.0.1:6372和127.0.0.1:6373是主节点,哈希槽分别为0-5460,5461-10922,10923-16383,从节点分别对应127.0.0.1:6374、127.0.0.1:6375和127.0.0.1:6376


5) 测试存储数据 

[root@192 src]#/usr/local/redis/bin/redis-cli -c -p 6371 

127.0.0.1:6371> set name 'smister' 

-> Redirected to slot [5798] located at 127.0.0.1:6372 

OK(可见name键被分配到127.0.0.1:6372的哈希槽中) 

127.0.0.1:6371> get name 

-> Redirected to slot [5798] located at 127.0.0.1:6372 

"smister"(也是通过127.0.0.1:6372读取) 

127.0.0.1:6371> exit


6) 关闭主节点127.0.0.1:6371,观察从节点127.0.0.1:6374是否成为新主节点 

[root@192 src]# ps aux | grep redis | grep 6371| grep -v 'grep' 

root 4061 0.3 0.8 135588 9776 ? Ssl 11:40 0:02 ./redis-server 127.0.0.1:6371 [cluster] 

[root@192 src]#kill -9 4061 

[root@192 src]# /usr/local/redis/bin/redis-trib.rb check 127.0.0.1:6371 

[ERR] Sorry, can't connect to node 127.0.0.1:6371 (找不到节点) 

[root@192 src]# /usr/local/redis/bin/redis-trib.rb check 127.0.0.1:6372 

redis-master-cluster-4.png

M: d6a2a9c770022bd22a5e7e72395fbba374e54ae0 127.0.0.1:6374

slots:0-5460 (5461 slots) master

可见127.0.0.1:6374成为了主节点,并且继承127.0.0.1:6371的哈希槽


7) 重启127.0.0.1:6371,并检测其状态 

[root@192 src]# cd /usr/local/redis/etc/6371 

[root@192 6371]# /usr/local/redis/bin/redis-server redis.conf 

[root@192 6371]# /usr/local/redis/bin/redis-trib.rb check 127.0.0.1:6371

redis-master-cluster-5.png

S: 600ed45486b808324b84b1a914581d04c8b85056 127.0.0.1:6371

slots: (0 slots) slave

replicates d6a2a9c770022bd22a5e7e72395fbba374e54ae0

节点127.0.0.1:6371重新启动变成了127.0.0.1:6374的从节点

版权声明:未经博主允许不得转载。http://smister.com/post-47/redis-cluster.html