Redis Cluster
Redis3.0版本之前,可以通過Redis Sentinel(哨兵)來實現高可用 ( HA ),從3.0版本之後,官方推出了Redis Cluster,它的主要用途是實現數據分片(Data Sharding),不過同樣可以實現HA,是官方當前推薦的方案
雖然主從複製和哨兵模式完美的解決了Redis的單機問題,但是Redis仍然存在着以下兩個問題:
1、所有的寫操作都集中到主服務器上,主服務器CPU壓力比較大
2、不管是主服務器還是從服務器,它們都同樣保存了redis的所有數據,隨着數據越來越多,可能會出現內存不夠用的問題
在Redis Sentinel模式中,每個節點需要保存全量數據,冗餘比較多,而在RedisCluster模式中,每個分片只需要保存一部分的數據,對於內存數據庫來說,還是要儘量的減少冗餘。在數據量太大的情況下,故障恢復需要較長時間,另外,內存實在是太貴了
RedisCluster的具體實現細節是採用了Hash槽的概念,集羣會預先分配16384個槽,並將這些槽分配給具體的服務節點,通過對Key進行CRC16(key)%16384運算得到對應的槽是哪一個,從而將讀寫操作轉發到該槽所對應的服務節點。當有新的節點加入或者移除的時候,再來遷移這些槽以及其對應的數據。在這種設計之下,我們就可以很方便的進行動態擴容或縮容
操作流程
添加新節點
加偶數個節點(一主一備),避免單點故障
server1
mkdir /usr/local/redis_cluster
mkdir 700{1..6}
cd 7001
vim redis.conf
port 7001
端口7001,7002,7003,7004,7005,7006
cluster-enabled yes
開啓集羣
cluster-config-file nodes.conf
集羣的配置,配置文件首次啓動自動生成 7001,7002,7003,7004,7005,7006
cluster-node-timeout 15000
請求超時 默認15秒,可自行設置
appendonly yes
aof日誌開啓 有需要就開啓,它會每次寫操作都記錄一條日誌
daemonize yes
redis後臺運行
redis-server ./redis.conf
目錄 7002--7006 上述7001操作,編寫配置文件
ps aux
可查看到 7001--7006 全部開啓
創建redis-cluster集羣
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 1yes
redis-cli --cluster check 127.0.0.1:7001
檢查所有node
server2爲masker
server4爲slave
server2
redis-cli -p 7002
shutdown
redis-cli --cluster check 127.0.0.1:7001
slave節點server4自動變爲新的master
如果所保存的數據在server2的哈希槽點上,則我們在server4上面也能查找到數據
如果server4也shutdown,則數據不再顯示
如需要顯示所存在數據,則需要開啓server2或server4
或者從新分配哈希槽點,數據會分配在新的server節點上
指定分配哈希槽數量
server1
redis-cli --cluster reshard 127.0.0.1:7001
100(自定義數量)
指定數量
redis-cli --cluster check 127.0.0.1:7001
查看分配數量
注意:
哈希槽數量大小分配不均勻,可能會導致數據同步不一致
平均分配哈希槽數量
server1
redis-cli --cluster rebalance --cluster -threshold 1 --cluster-use-empty-masters 127.0.0.1:7001
redis-cli --cluster check 127.0.0.1:7001
redis-cli -c -p 7001
info
get dataname
查看數據