搭建一個redis Cluster至少須要兩個redis實例,我使用的是 127.0.0.1:7000 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 六個redis實例
node
打開全部實例的redis.conf,修改如下配置項並啓動全部的實例。redis
port 7001 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
//集羣(cluster)shell
CLUSTER INFO 打印集羣的信息ruby
CLUSTER NODES 列出集羣當前已知的全部節點(node),以及這些節點的相關信息。app
//節點(node)命令行
CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點添加到集羣當中,讓它成爲集羣的一份子。3d
CLUSTER FORGET <node_id> 從集羣中移除 node_id 指定的節點。code
CLUSTER REPLICATE <node_id> 將當前節點設置爲 node_id 指定的節點的從節點。ip
CLUSTER SAVECONFIG 將節點的配置文件保存到硬盤裏面。hash
//槽(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)。
//鍵 (key)
CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪一個槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。
鏈接到其中的一個redis實例(127.0.0.1:7000),執行如下命令
127.0.0.1:7000>cluster meet 127.0.0.1:7001 127.0.0.1:7000>cluster meet 127.0.0.1:7002 127.0.0.1:7000>cluster meet 127.0.0.1:7003 127.0.0.1:7000>cluster meet 127.0.0.1:7004 127.0.0.1:7000>cluster meet 127.0.0.1:7005
再執行如下語句,查看當前的節點數目
127.0.0.1:7000> cluster nodes 8eff8fd6273daa6c030a4239f7d5cffb025b720c 127.0.0.1:7000 myself,master - 0 0 3 connected cbbc8039fed4eb699fa60d4205b463cabc15d95c 127.0.0.1:7001 master - 0 1461222806314 5 connected aab79155d3b4f12346bd64f0f24c954d62f75a55 127.0.0.1:7002 master - 0 1461222805312 4 connected 9bffed9df65bb085af540d907cc35e2bf6b313a6 127.0.0.1:7003 master - 0 1461222807316 1 connected f21c7d98f3858c0528e93f998a3ba4c19c0db280 127.0.0.1:7004 master - 0 1461222804308 0 connected a4616441a6f54fdd82971e9b109f02db4522b165 127.0.0.1:7005 master - 0 1461222806815 2 connected
有myselef master標示的是當前節點
127.0.0.1:7000>cluster addsolts 0 1 2...
採用命令行的方法進行槽分配時,有一點不太友好,就是你如須要一一指出分配給改節點的全部槽,這一點太麻煩了,要是改節點分配的槽過多,有好幾百的話,就會很麻煩。可是還有一種簡便的方法,就是修改nodes.conf的槽區間。
redis-trib運行在ruby環境中,須要安裝ruby。安裝的過程以下。依次執行以下命令,便可完成安裝。
[root@redis1 src]# yum install ruby [root@redis1 src]# yum install rubygems [root@redis1 src]# gem install redis
[root@redis1 src]#./src/redis-trilb.rdb create --replicas 1 127.0.0.1:7000 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
選項–replicas 1 表示咱們但願爲集羣中的每一個主節點建立一個從節點
[root@redis1 redis-3.0.0]# ./src/redis-trilb.rdb add-node 127.0.0.1:7006 127.0.0.1:7000
127.0.0.1:7006是新增的節點
127.0.0.1:7000是集羣中的任意一個節點。
經過查看cluster nodes list 能夠發現此時新增的節點(192.168.6.4:7000)尚未分配槽。
[root@redis1 src]#./src/redis-trib.rb reshard 127.0.0.1:7006
輸入以上內容後,在客戶端會出現如下信息
How many slots do you want to move (from 1 to 16384)? 1000 //設置slot數1000 What is the receiving node ID? 03ccad2ba5dd1e062464bc7590400441fafb63f2 //新節點node id Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1:all // all 表示所有節點從新洗牌,也能夠輸入你須要從新分配的節點id 再輸入 done Do you want to proceed with the proposed reshard plan (yes/no)? yes //確認從新分
完成以上操做後,一個新的並能夠正常使用的節點就添加到集羣中去了。
[root@redis1 redis-3.0.0]#./src/redis-trib.rb add-node --slave --master-id 711e17d3f8b0a107d9b4b88ce920c06e4e3a85cb 127.0.0.1:7007 127.0.0.1:7000
711e17d3f8b0a107d9b4b88ce920c06e4e3a85cb 是前面添加的節點,能夠經過cluster nodes 查看
127.0.0.1:7007 是新增的從節點
127.0.0.1:7000爲集羣中任意一個節點便可
[root@redis1 redis-3.0.0]#./src/redis-trib.rb del-node 127.0.0.1:7007 '0f4c5f090f573d9465a7c0542e9632ecd831080b'
127.0.0.1:7007 待刪除的節點
0f4c5f090f573d9465a7c0542e9632ecd831080b 待刪除的節點id
刪除主節點以前,須要從新分配槽,把待刪除節點的槽移動到別的節點上去
[root@redis1 redis-3.0.0]#./src/redis-trib.rb reshard 127.0.0.1:7006 (待刪除節點的)
輸入以上命令後控制檯會出現如下內容
How many slots you want to move (from 1 to 16384)? 1000 //被刪除master的全部slot數量 What is the receiving node ID? 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 //接收6378節點slot的master Please enter all the source node IDs. Type 'all' all the nodes source nodes the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1:03ccad2ba5dd1e062464bc7590400441fafb63f2 //被刪除master的node-id Source node #2:done Do you want to proceed with the proposed reshard plan (yes/no)? yes //取消slot後,reshard
[root@redis1 redis-3.0.0]# ./src/redis-trib.rb del-node 127.0.0.1:7006 '711e17d3f8b0a107d9b4b88ce920c06e4e3a85cb'
127.0.0.1:7006 待刪除的主節點
711e17d3f8b0a107d9b4b88ce920c06e4e3a85cb 待刪除的節點id
經過如下命令能夠檢測當前集羣的分佈狀態
[root@redis1 redis-3.0.0]# ./src/redis-trib.rb check 127.0.0.1:7000
127.0.0.1:7000集羣中的任意節點