一、方案
1. 介紹
- redis3.0及以上版本實現,集群中至少應該有奇數個節點,所以至少有三個節點,官方推薦三主三從的配置方式
- 使用哈希槽的概念,Redis 集群有16384個哈希槽,每個key通過CRC16校驗后對16384取模來決定放置哪個槽。集群的每個節點負責一部分hash槽。
- 使用主從復制模型,每個節點都會有N-1個slave。如果master不可用,會選舉slave為新的master繼續服務;如果同個節點的master和slave都失效,整個集群將不可用。
2. 集群的不足:
- Redis集群並不支持處理多個key的操作,因為這需要在不同的節點間移動數據,從而達不到像Redis那樣的性能,在高負載的情況下可能會導致不可預料的錯誤。舉例來說,當兩個set映射到不同的redis實例上時,你就不能對這兩個set執行交集操作。
- 涉及多個key的redis事務不能使用。
二、集群的搭建
1. 准備配置文件
創建cluster目錄,並創建6個配置文件

2. 修改配置文件
port 7000 //端口7000,7002,7003..
daemonize yes //redis后台運行
pidfile ./redis_7000.pid //pidfile文件對應7000,7001,7002
cluster-enabled yes //開啟集群 把注釋#去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次啟動自動生成 7000,7001,7002
cluster-node-timeout 15000 //請求超時 默認15秒,可自行設置
appendonly yes //aof日志開啟 有需要就開啟,它會每次寫操作都記錄一條日志
//若設置密碼,master和slave需同時配置下面兩個參數:
masterauth "12345678" //連接master的密碼
requirepass "12345678" //自己的密碼
3. 啟動、測試所有redis實例
- 創建啟動文件:vi start-all.sh
- 賦予權限:chmod u+x start-all.sh
- 啟動:./start-all.sh

4. 安裝redis-trib所需的 ruby腳本
ruby redis-trib.rb //測試是否安裝成功,若已經安裝過,可跳過此步

安裝
cp /usr/andy/redis/redis-3.2.0/src/redis-trib.rb .
yum install ruby
yum install rubygems
gem install redis-3.2.2.gem //需下載redis-3.2.2.gem
5. 使用redis-trib.rb創建集群
執行下面命令創建集群(需為真實ip,不然外網無法訪問):
./redis-trib.rb create --replicas 1 192.168.0.217:7000 192.168.0.217:7001 192.168.0.217:7002 192.168.0.217:7003 192.168.0.217:7004 192.168.0.217:7005

可以看到:
- 7003是7000主節點的從節點,管理槽0-5460
- 7004是7001主節點的從節點,管理槽5461-10992
- 7005是7002主節點的從節點,管理槽10992-16383
三、測試
1、測試存取值

登錄從節點,查看

2、主從切換
結束主節點7000進程,發現7003成了master,而7000節點的狀態為fail

恢復7000節點,發現變成了7003的slave

四、集群常用命令
1. 集群客戶端命令(redis-cli -c -p port)
集群
cluster info :打印集群的信息
cluster nodes :列出集群當前已知的所有節點( node),以及這些節點的相關信息。
節點
cluster meet ip port:將 ip 和 port 所指定的節點添加到集群當中,讓它成為集群的一份子。 cluster forget <node_id> :從集群中移除 node_id 指定的節點。 cluster replicate <node_id> :將當前節點設置為 node_id 指定的節點的從節點。 cluster saveconfig :將節點的配置文件保存到硬盤里面。
槽(slot)
cluster addslots <slot> [slot ...] :將一個或多個槽( slot)指派( assign)給當前節點。 cluster delslots <slot> [slot ...] :移除一個或多個槽對當前節點的指派。 cluster flushslots :移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。 cluster setslot <slot> node <node_id> :將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那么先讓另一個節點刪除該槽>,然后再進行指派。 cluster setslot <slot> migrating <node_id> :將本節點的槽 slot 遷移到 node_id 指定的節點中。 cluster setslot <slot> importing <node_id> :從 node_id 指定的節點中導入槽 slot 到本節點。 cluster setslot <slot> stable :取消對槽 slot 的導入( import)或者遷移( migrate)。
鍵
cluster keyslot <key> :計算鍵 key 應該被放置在哪個槽上。 cluster countkeysinslot <slot> :返回槽 slot 目前包含的鍵值對數量。 cluster getkeysinslot <slot> <count> :返回 count 個 slot 槽中的鍵
2. redis-trib.rb命令詳解
- 查看redis-trib.rb的參數: ./redis-trib.rb或ruby redis-trib.rb help
- 命令格式:./redis-trib.rb <參數> ip:port
下面是常用的參數:
1、create:創建集群
2、check:檢查集群
3、info:查看集群信息
4、fix:修復集群
5、reshard:在線遷移slot
6、rebalance:平衡集群節點slot數量
7、add-node:將新節點加入集群
8、del-node:從集群中刪除節點
9、set-timeout:設置集群節點間心跳連接的超時時間
10、call:在集群全部節點上執行命令
11、import:將外部redis數據導入集群
