Redis版本要求:Redis 版本3.0+
Redis Cluster TCP ports
Redis集群的每一個(gè)節(jié)點(diǎn)需要兩個(gè)端口號,client port和cluster bus port,比如6379,16379
端口6379:用于redis client連接
端口16379:用于集群節(jié)點(diǎn)間的交流通信
cluster bus port = client port + 10000,這是固定的
Redis集群數(shù)據(jù)分片
Redis 集群有16384個(gè)哈希槽,每一個(gè)key通過CRC16算法對16384取模,得到相應(yīng)的槽位
假設(shè)集群有如下節(jié)點(diǎn):
- 節(jié)點(diǎn)A, 槽位0 ~ 5500
- 節(jié)點(diǎn)B, 槽位5501 ~ 11000
- 節(jié)點(diǎn)C, 槽位11001 ~ 16383
如果要增加一個(gè)節(jié)點(diǎn)D,則需要從其他節(jié)點(diǎn)A,B,C拿一些槽位給D;反之,如果要?jiǎng)h除節(jié)點(diǎn),則需要將自身的槽位轉(zhuǎn)移到其他節(jié)點(diǎn),才能刪除該節(jié)點(diǎn)
Redis集群參數(shù)配置
cluster-enabled <yes/no> 是否開啟集群模式
cluster-config-file <filename> 記錄集群配置,方便重啟
cluster-node-timeout <milliseconds> 超時(shí)時(shí)間
手動創(chuàng)建Redis集群
Redis集群最小配置文件 redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
最小集群最少需要三個(gè)master,建議3master,3slave
創(chuàng)建步驟如下:
- 首先執(zhí)行以下命令
mkdir cluster-test
cd cluster-test
mkdir 7001 7002 7003 7004 7005 7006
在每一個(gè)目錄下創(chuàng)建相應(yīng)的 redis.conf 文件
復(fù)制redis-server文件到 cluster-test 下
啟動每一個(gè)Redis實(shí)例
cd 7000
../redis-server ./redis.conf
創(chuàng)建集群
-
對于Redis5
復(fù)制redis-cli文件到 cluster-test 下
執(zhí)行以下命令
./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 表示 每一個(gè)master:slave,即一個(gè)主節(jié)點(diǎn)有一個(gè)從節(jié)點(diǎn)

查詢集群所有節(jié)點(diǎn)
./redis-cli -p 7001 cluster nodes

故障轉(zhuǎn)移測試
端口7001宕機(jī)
./redis-cli -p 7001 debug segfault
// 執(zhí)行結(jié)果
Error: Server closed the connection
再重啟7001端口,可以看到原先的端口7005從節(jié)點(diǎn)變成了主節(jié)點(diǎn)

擴(kuò)展一個(gè)主節(jié)點(diǎn)master
創(chuàng)建7007目錄
創(chuàng)建redis.conf文件
啟動redis實(shí)例 ../redis-server ./redis.conf
將7007節(jié)點(diǎn)加入集群
./redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7002

槽位分配
./redis-cli --cluster reshard 127.0.0.1:7005


增加一個(gè)從節(jié)點(diǎn)
// 127.0.0.1:7006 增加的從節(jié)點(diǎn)ip
redis-cli --cluster add-node 127.0.0.1:7006 \
127.0.0.1:7000 --cluster-slave \
--cluster-master-id \
// 主節(jié)點(diǎn)nodeId
3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
刪除一個(gè)節(jié)點(diǎn)
redis-cli --cluster del-node 127.0.0.1:7001 `<del-node-id>`
注意:
刪除一個(gè)master時(shí),其槽位必須為0
