Redis-Cluster集群只有版本3.0之后才支持, 集群Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接,并且包含主从、哨兵等功能不需要另外去处理。
1、集群Redis-Cluster结构
1) 每个Redis-Cluster节点相互发送Pong-Ping来确认节点之间是畅通的
2) Redis集群预分好16384个哈希槽,分配给参与的节点(不一定平均分配)
3) 当键值写入时,根据键生成哈希值,写入到拥有该哈希槽的节点中
4) 当一半以上的节点反馈无法与某个节点连接时,才确认该节点fail
5) 节点需要奇数个,满足结构4)的离线反馈
2、Redis-Cluster的主从复制+哨兵模式
设置集群时,可以将某些节点设置从节点,从节点不参与分配哈希槽,只负责同步主节点的数据,当主节点断线时,从节点会接替主节点的哈希槽,并广播给其他的主节点,它接替主节点的哈希槽及其数据(类似Redis中的主从复制+哨兵模式的功能效果)
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
从图中可以看出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
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
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