Redis版本要求:Redis 版本3.0+
Redis Cluster TCP ports
Redis集群的每一个节点需要两个端口号,client port和cluster bus port,比如6379,16379
端口6379:用于redis client连接
端口16379:用于集群节点间的交流通信
cluster bus port = client port + 10000,这是固定的
Redis集群数据分片
Redis 集群有16384个哈希槽,每一个key通过CRC16算法对16384取模,得到相应的槽位
假设集群有如下节点:
- 节点A, 槽位0 ~ 5500
- 节点B, 槽位5501 ~ 11000
- 节点C, 槽位11001 ~ 16383
如果要增加一个节点D,则需要从其他节点A,B,C拿一些槽位给D;反之,如果要删除节点,则需要将自身的槽位转移到其他节点,才能删除该节点
Redis集群参数配置
cluster-enabled <yes/no> 是否开启集群模式
cluster-config-file <filename> 记录集群配置,方便重启
cluster-node-timeout <milliseconds> 超时时间
手动创建Redis集群
Redis集群最小配置文件 redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
最小集群最少需要三个master,建议3master,3slave
创建步骤如下:
- 首先执行以下命令
mkdir cluster-test
cd cluster-test
mkdir 7001 7002 7003 7004 7005 7006
在每一个目录下创建相应的 redis.conf 文件
复制redis-server文件到 cluster-test 下
启动每一个Redis实例
cd 7000
../redis-server ./redis.conf
创建集群
-
对于Redis5
执行以下命令
./redis-cli --cluster create 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 \
--cluster-replicas 1
--cluster-replicas 1 表示 每一个master:slave,即一个主节点有一个从节点
查询集群所有节点
./redis-cli -p 7001 cluster nodes
故障转移测试
端口7001宕机
./redis-cli -p 7001 debug segfault
// 执行结果
Error: Server closed the connection
再重启7001端口,可以看到原先的端口7005从节点变成了主节点
扩展一个主节点master
创建7007目录
创建redis.conf文件
启动redis实例 ../redis-server ./redis.conf
将7007节点加入集群
./redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7002
槽位分配
./redis-cli --cluster reshard 127.0.0.1:7005
增加一个从节点
// 127.0.0.1:7006 增加的从节点ip
redis-cli --cluster add-node 127.0.0.1:7006 \
127.0.0.1:7000 --cluster-slave \
--cluster-master-id \
// 主节点nodeId
3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
删除一个节点
redis-cli --cluster del-node 127.0.0.1:7001 `<del-node-id>`
注意:
删除一个master时,其槽位必须为0