以下操作基於redis3.X版本:Redis集群存儲原理:Redis 集群使用數據分片(sharding),而非一致性哈希(consistency hashing)來實現,一個 Redis 集群包含 16384 個哈希槽,資料庫中的每個鍵都屬於這 16384 個哈希槽的其中一個,集群使用公式 CRC ...
以下操作基於redis3.X版本:
Redis集群存儲原理:Redis 集群使用數據分片(sharding),而非一致性哈希(consistency hashing)來實現,一個 Redis 集群包含 16384 個哈希槽,資料庫中的每個鍵都屬於這 16384 個哈希槽的其中一個,集群使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽,其中 CRC16(key) 語句用於計算鍵 key 的 CRC16 校驗和。
Redis使用redis-trib.rb腳本來進行集群的創建和管理操作,該腳本是用ruby編寫的,需要先安裝ruby支持:
1、yum install zlib ruby rubygems
2、安裝ruby的Redis插件:gem install redis
例:
redis-trib.rb create --replicate 1 server1:6379 server1:6380 server2:6379 server2:6380 server3:6379 server3:6380
--replicate 1: 一個副本的意思,上面整個命令的意思是創建三主三從的集群
註:
為真正實現集群的高可用,集群中的每個節點應位於不同的伺服器上
如果只是用3台伺服器創建6節點的集群,還是避免不了單台伺服器宕機或網路故障導致數據寫入不可用,從而導致系統不可用
添加主節點:
1)、添加節點:redis-trib.rb add-node new_server:port exists_server:exists_port
2)、重新分配哈希槽:redis-trib.rb reshard exists_master_server:exists_master_port,根據提示進行操作
3)、查看集群狀態:redis-cli -c -h server:port cluster nodes
添加從節點:
1)、添加節點:redis-trib.rb add-node new_server:port exists_server:exists_port
2)、指定主節點:redis-cli -c -h new_server:port -> cluster replicate master_uid
3)、查看集群狀態:redis-cli -c -h server:port cluster nodes
集群狀態的調整:
假如有3台伺服器搭建6節點的集群,集群狀態如下:
server1:6380 slaveof server1:6379
server2:6380 slaveof server3:6379
server3:6380 slaveof server2:6379
這種集群狀態是不合理的,合理的狀態是主從交叉配置,一定程度上提升了高可用
線上調整:server1:6380的主調整為server2:6379,server3:6380的主調整為server1:6379
1)、刪除server1:6380和server3:6380節點:redis-trib.rb del-node server1:6380 uid,redis-trib.rb del-node server3:6380 uid
2)、停止server1:6380和server3:6380節點:redis-cli -c -h server:port shutdown
3)、清空server1:6380和server3:6380節點的集群配置文件 cat /dev/null > server{1,3}:6380.conf
4)、開啟server1:6380和server3:6380節點:redis-server -c 6380.conf
5)、指定主節點:redis-trib.rb add-node --slave --master-id server2_uid server1:6380 server2:6379
redis-trib.rb add-node --slave --master-id server1_uid server3:6380 server1:6379
6)、查看集群狀態:redis-cli -c -h server:port cluster nodes
調整後的集群狀態如下:
server1:6380 slaveof server2:6379
server2:6380 slaveof server3:6379
server3:6380 slaveof server1:6379