1. 简介
由多个Redis服务器组成的分布式网络服务集群
每一个Redis服务器称为节点Node,节点之间会互相通信。两两相连
Redis集群无中心节点(无主模型)
redis3.x及以上版本支持
2. Redis集群节点复制
- Redis集群的每个节点都有两种角色可选:主节点master node、从节点slave node。其中主节点用于存储数据,而从节点则是某个主节点的复制品
- 当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能,因为Redis集群重用了单机Redis复制特性的代码,所以集群的复制行为和我们之前介绍的单机复制特性的行为是完全一样的
3. Redis集群故障转移
- Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移
- 集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel
4. Redis集群分片
集群将整个数据库分为16384个槽位slot,key的槽位计算公式为slot_number=crc16(key)%16384
,其中crc16为16位的循环冗余校验和函数
集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求
举例
三个主节点7000、7001、7002平均分片16384个slot槽位
节点7000指派的槽位为0到5460
节点7001指派的槽位为5461到10922
节点7002指派的槽位为10923到16383
4. 何时集群不能对外提供服务
- 过半的主节点挂掉,不能对外提供服务
- 其中任意一个节点主从都挂掉,不能对外提供服务
主节点过半机制判定一个主节点是否挂掉
5. Redis集群Redirect转向
- 由于Redis集群无中心节点,请求会发给任意主节点
- 主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误
- 客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求
6. Redis集群搭建
创建多个主节点
为每一个节点指派slot,将多个节点连接起来,组成一个集群
槽位分片完成后,集群进入上线状态
6个节点:3个主节点,每一个主节点有一个从节点
-
安装gcc、tcl、ruby以及rubygems
yum install gcc tcl -y
yum install ruby rubygems -y
-
下载redis3.0以及以上的tar包并解压
-
编译并安装
make
make install PREFIX=/opt/redis
-
编辑配置文件
拷贝源码目录中的redis.conf到/opt/redis/conf目录下,编辑bind 0.0.0.0 daemonize yes #注释放开就行了 cluster-enabled yes
-
redis-trib.rb拷贝到目录/opt/redis/
-
下载并安装redis.gem
https://rubygems.org/downloads/redis-3.0.0.gem
https://rubygems.org/gems/redis/versions/3.0.0
gem install redis-3.0.0.gem
-
其他节点相同操作
-
启动6台节点上的redis
cd /opt/redis
bin/redis-server conf/redis.conf
-
运行命令:
redis-trib.rb create --replicas 1 192.168.100.101:6379 192.168.100.102:6379 192.168.100.103:6379 192.168.100.104:6379 192.168.100.105:6379 192.168.100.106:6379
-
连接
cd /opt/redis
bin/redis-cli -c
-c表示集群连接,否则单机连接
添加节点107
./redis-trib.rb add-node <新节点ip:port> <集群中已存在的一个masterip:port>
./redis-trib.rb add-node 192.168.100.107:6379 192.168.100.101:6379
在客户端使用该命令CLUSTER NODES
查看节点信息
给新节点107分配hash slots 1000个
./redis-trib.rb reshard --from all --to <新节点ip:port> --slots <hash slots数> --yes <集群中已存在的一个masterip:port>
./redis-trib.rb reshard --from all --to 8ba4a99a6f4ee94b0db053eb2a1ec5577a80dd40 --slots 1000 --yes 192.168.100.101:6379
启动108,作为107的从节点加入集群:
./redis-trib.rb add-node --slave <新的从节点ip:port> <masterip:port>
./redis-trib.rb add-node --slave 192.168.100.108:6379 192.168.100.107:6379
移除107的从节点
./redis-trib.rb del-node <从节点ip:port> <从节点id>
./redis-trib.rb del-node 192.168.100.107:6379 8ba4a99a6f4ee94b0db053eb2a1ec5577a80dd40
删除主节点107:
-
迁移hash slots
./redis-trib.rb reshard --from <节点id> --slots <hash slots数> <masterip:port>
./redis-trib.rb reshard --from a7b2151e53b99456064614bedd341acc1dbc28d4 --to c7ed704c5289f8935b707bd26a52b5c8f52f1467 --slots 333 192.168.100.101:6379
./redis-trib.rb reshard --from a7b2151e53b99456064614bedd341acc1dbc28d4 --to 6b2225b705224870b498305ba3024024fea797e2 --slots 334 192.168.100.102:6379
./redis-trib.rb reshard --from a7b2151e53b99456064614bedd341acc1dbc28d4 --to 056a42e8b7489cb7e579cc1e0af936885d24ccaa --slots 333 192.168.100.103:6379
-
移除空的主节点
./redis-trib.rb del-node <masterip:port> <节点id>
./redis-trib.rb del-node 192.168.100.101:6379 a7b2151e53b99456064614bedd341acc1dbc28d4