Redis版本要求:Redis 版本3.0+
Redis Cluster TCP ports
Redis集群的每一個節(jié)點需要兩個端口號差牛,client port和cluster bus port接校,比如6379,16379
端口6379:用于redis client連接
端口16379:用于集群節(jié)點間的交流通信
cluster bus port = client port + 10000,這是固定的
Redis集群數據分片
Redis 集群有16384個哈希槽骡楼,每一個key通過CRC16算法對16384取模,得到相應的槽位
假設集群有如下節(jié)點:
- 節(jié)點A秕磷, 槽位0 ~ 5500
- 節(jié)點B锈颗, 槽位5501 ~ 11000
- 節(jié)點C顷霹, 槽位11001 ~ 16383
如果要增加一個節(jié)點D,則需要從其他節(jié)點A击吱,B淋淀,C拿一些槽位給D;反之覆醇,如果要刪除節(jié)點绅喉,則需要將自身的槽位轉移到其他節(jié)點渠鸽,才能刪除該節(jié)點
Redis集群參數配置
cluster-enabled <yes/no> 是否開啟集群模式
cluster-config-file <filename> 記錄集群配置,方便重啟
cluster-node-timeout <milliseconds> 超時時間
手動創(chuàng)建Redis集群
Redis集群最小配置文件 redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
最小集群最少需要三個master柴罐,建議3master徽缚,3slave
創(chuàng)建步驟如下:
- 首先執(zhí)行以下命令
mkdir cluster-test
cd cluster-test
mkdir 7001 7002 7003 7004 7005 7006
在每一個目錄下創(chuàng)建相應的 redis.conf 文件
復制redis-server文件到 cluster-test 下
啟動每一個Redis實例
cd 7000
../redis-server ./redis.conf
創(chuàng)建集群
-
對于Redis5
執(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 表示 每一個master:slave,即一個主節(jié)點有一個從節(jié)點
查詢集群所有節(jié)點
./redis-cli -p 7001 cluster nodes
故障轉移測試
端口7001宕機
./redis-cli -p 7001 debug segfault
// 執(zhí)行結果
Error: Server closed the connection
再重啟7001端口革屠,可以看到原先的端口7005從節(jié)點變成了主節(jié)點
擴展一個主節(jié)點master
創(chuàng)建7007目錄
創(chuàng)建redis.conf文件
啟動redis實例 ../redis-server ./redis.conf
將7007節(jié)點加入集群
./redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7002
槽位分配
./redis-cli --cluster reshard 127.0.0.1:7005
增加一個從節(jié)點
// 127.0.0.1:7006 增加的從節(jié)點ip
redis-cli --cluster add-node 127.0.0.1:7006 \
127.0.0.1:7000 --cluster-slave \
--cluster-master-id \
// 主節(jié)點nodeId
3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
刪除一個節(jié)點
redis-cli --cluster del-node 127.0.0.1:7001 `<del-node-id>`
注意:
刪除一個master時凿试,其槽位必須為0