在redis集羣,好比有三個redis實例,redis集羣會把key按照必定的算法,分佈到這三個redis實例中,達到了水平擴展的功能,同時,也支持在這三個redis中配置slave節點,在master出現故障的時候,自動的切換到slave節點,因此他集合了主從和哨兵的兩個功能,一樣的,redis集羣也不保證數據的一致性,數據從master到slave的過程的異步的,這個和redis - 哨兵(數據丟失的處理)同樣。
每一個集羣除了正常的TCP端口,好比6379,還須要另一個端口,正常是在前面的端口加1000,也就是16379端口,這個端口是用來故障檢測、配置更新、故障轉移受權等,爲了讓redis集羣的正常運行,這個端口的訪問權限是須要開放的。node
在redis中,並無用一致性哈希來作數據分片的,而是用哈希槽。redis中有16384個哈希槽,因此每一個key經過CRC16計算後,對16384進行取模,而後落入相應的哈希槽,redis集羣的每一個節點都有對應的哈希槽集合,好比節點A包含從0到5500的哈希槽,節點B包含從5501到11000的哈希槽,節點C包含從11001到16383的哈希槽。
經過這種方式,新增或者移除節點就很是方便了。好比想加一個節點D,咱們只須要移動相應的哈希槽就行了。一樣的,當咱們減小一個節點時,只要把他的哈希槽移動到其餘的節點就行了。由於將哈希槽從一個節點移動到另外一個節點不須要中止操做,因此添加和刪除節點,或者改變節點持有哈希槽的百分比,不須要任何停機時間。redis
配置信息以下:算法
port 7000 #端口 cluster-enabled yes #開啓集羣 cluster-config-file nodes_7000.conf#存儲此節點配置的文件 cluster-node-timeout 5000 # 超時時間
另外還有7100,7200,7001,7101,7201的配置,跟上面的配置同樣,改了相應的端口和cluster-config-file的文件名。
進入src目錄,執行如下目錄,啓動每一個節點。segmentfault
./redis-server ../conf/cluster_7000.conf & ./redis-server ../conf/cluster_7001.conf & ./redis-server ../conf/cluster_7100.conf & ./redis-server ../conf/cluster_7101.conf & ./redis-server ../conf/cluster_7200.conf & ./redis-server ../conf/cluster_7201.conf &
成功後打印信息以下:
因爲沒有node.conf文件,每一個節點都建立了本身的id,好比上面截圖的id爲7f466898761e66fdf84cac1e73660766e22d32c8。這個ID將被這個特定的實例永遠使用,以便該實例在集羣上下文中具備惟一的名稱。每一個節點記住使用這個id的其餘節點,而不是經過IP或端口。IP地址和端口可能會改變,可是惟一的節點標識符在節點的整個生命週期中不會改變。咱們稱這個標識符爲節點ID。
我當前的版本是6.0.8,因此直接使用redis-cli開啓集羣功能,若是是3或4版本,就須要使用redis-trib.rb命令。create後面是6個地址,因爲設置cluster-replicas爲1,因此是一主一從,那六個地址中,前面3個就是master,後面是對應的slave,好比7000對應着7001,後面以此類推。異步
./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7100 \ 127.0.0.1:7200 127.0.0.1:7001 127.0.0.1:7101 127.0.0.1:7201 \ --cluster-replicas 1
咱們也能夠不用上面那樣,啓動每一個節點,而後再用redis-cli開啓集羣功能,好比使用下面這些命令:spa
`create-cluster start` `create-cluster create` `create-cluster stop`.
使用redis-cli命令,進入7000端口的redis,開始執行其餘命令3d
./redis-cli -c -p 7000
第一次set name的時候,因爲對應的槽是5798,因此會到7100裏執行。
第二次set hello的時候,因爲對應的槽是866,因此會到7000裏執行。
第三次get name的時候,因爲對應的槽是5798,因此會到7100裏執行。code
127.0.0.1:7000> set name zhangsan -> Redirected to slot [5798] located at 127.0.0.1:7100 OK 127.0.0.1:7100> set hello world -> Redirected to slot [866] located at 127.0.0.1:7000 OK 127.0.0.1:7000> get name -> Redirected to slot [5798] located at 127.0.0.1:7100 "zhangsan"
從新分片,咱們能夠用如下的命令,好比咱們想給7000這個節點多1000個槽,那2的位置就輸入1000,說明要移動1000個槽,3的位置輸入的是7000的id,說明這1000的目標是7000,4這個有兩種,這邊是all,說明其餘因此節點都分一些槽出來給7000。第四個步驟執行完輸入yes。server
./redis-cli --cluster reshard 127.0.0.1:7000
輸入如下命令查看當前各個節點的狀況blog
./redis-cli --cluster check 127.0.0.1:7000
此時7000有6501的槽,7200有4889的槽,7100有4994的槽。
再演示一個,從7200拿6個槽給7100,與上面的差別是第四個步驟先輸入7200的id,而後再輸入done。
輸入如下命令查看當前各個節點的狀況
./redis-cli --cluster check 127.0.0.1:7000
除了從新分片,還有其餘命令以下(仍是已6.0.8版本爲例):
新增master節點,第一個地址是新增的節點,第二個地址是已經在集羣中的隨機節點。
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
新增slave節點,第一個地址是新增的節點,第二個地址是已經在集羣中的隨機節點。此時並無他指定master節點,redis集羣將從slave節點較少的master做爲新增slave的master節點。
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave
固然也能夠直接指定master節點:
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
爲某個master新增slave還有其餘方式,新增新的slave節點,在這個節點中執行如下命令:
cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
第一個參數只是集羣中的一個隨機節點,第二個參數是要刪除的節點的ID。在刪除以前,要確保他的槽是空的。
redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`