要想搭建一個最簡單的Redis集羣,那麼至少須要6個節點:3個Master和3個Slave。爲何須要3個Master呢?若是你瞭解過Hadoop/Storm/Zookeeper這些的話,你就會明白通常分佈式要求基數個節點,這樣便於選舉(少數服從多數的原則)。php
Redis集羣模型node
這裏,我將採用一種「偷懶」的方式,在一個Linux虛擬機上搭建6個節點的Redis集羣。(由於開啓6個Linux虛擬機,個人電腦徹底扛不住)git
實際上,思路很簡單,我將在一臺節點上開啓6個Redis實例,而且這6個Redis各自有本身的端口。這樣的話,至關於模擬出了6臺機器了。而後在以這6個實例組建Redis集羣就能夠了。github
第一步:爲這6個實例建立好各自存放的目錄redis
想想,爲何要這樣作呢?ruby
第二步:既然是要啓動6個Redis實例,天然須要準備各自的配置文件分佈式
拷貝redis.conf 6份ide
6個Redis實例的具體配置oop
具體來講,須要注意下:因爲在一臺機器(192.168.99.121)上,所以每一個實例應該有不一樣的端口;同時,每一個實例顯然會有本身的存放數據的地方;開啓AOF模式(持久化);開啓集羣配置;開啓後臺模式;ui
注: 若該節點的配置文件(redis.conf)指定cluster-require-full-coverage爲no的話, 其餘節點掛了, 仍能夠查詢當前節點所負責slots中的數據。
第三步:實際上,Redis集羣的操做在後文你能夠看到是經過Ruby腳原本完成的,所以咱們須要安裝Ruby相關的RPM包,以及Redis和Ruby的接口包。
yum install ruby
yum install rubygems
gem install redis
第四步:讓Redis集羣工做起來!
啓動6個Redis實例
接下來,咱們要經過Ruby腳原本建立集羣了。
redis-trib.rb是操做Redis集羣的腳本
[root@mydream121 bin]# ./redis-trib.rb create --replicas 1 192.168.99.121:8001 192.168.99.121:8002 192.168.99.121:8003 192.168.99.121:8004 192.168.99.121:8005 192.168.99.121:8006
create redis cluster
redis cluster info
首先,咱們來看一下建立集羣命令中 --replicas 1,這個表明什麼意思呢?1其實表明的是一個比例,就是主節點數/從節點數的比例。那麼想想,在建立集羣的時候,哪些節點是主節點呢?哪些節點是從節點呢?答案是將按照命令中IP:PORT的順序,先是3個主節點,而後是3個從節點。這一點能夠經過上面的2張圖片印證。
其次,注意到圖中slot的概念。slot對於Redis集羣而言,就是一個存放數據的地方,就是一個槽。對於每個Master而言,會存在一個slot的範圍,而Slave則沒有。在Redis集羣中,依然是Master能夠讀、寫,而Slave只讀。數據的寫入,其實是分佈的存儲在slot中,這和之前1.X的主從模式是不同的(主從模式下Master/Slave數據存儲是徹底一致的),由於Redis集羣中3臺Master的數據存儲並不同。這一點將在後續的實驗中獲得驗證。
第五步:驗證Redis集羣搭建是否成功
cluster info/cluster nodes
搭建起來的Redis集羣
到這裏,Redis集羣的搭建就完畢了
數據分佈性
從上面的操做,你能夠看到,當存儲某一個數據的時候,會分配一個slot,而這個slot從屬於某一個Master,也就是說你須要明白,數據是分佈的存儲在Redis集羣當中的。
Redis Cluster有一個很是重要的特色就是能夠在線的添加節點,實現不影響業務的水平擴容。在這裏,我將會在原來6個redis節點上,再添加2個redis節點。作法和之前一致,注意修改redis.conf,而後在啓動800七、8008這2個redis實例。
修改redis.conf配置
啓動新添加的2個redis實例
集羣狀態
其實,目前雖然啓動了新加的2個redis實例,可是它們是不屬於集羣的。下面,咱們來讓它們加入集羣中。
add-node命令
./redis-trib.rb add-node 192.168.99.121:8007 192.168.99.121:8006
./redis-trib.rb add-node 新節點 集羣中已經存在的節點
在往集羣中添加節點A的時候,須要提供一個在集羣中已經存在的節點B的信息。由於知道了B的信息,就知道了整個集羣的信息。爲何這麼說呢,來,咱們看一個文件,你就知道了。
nodes-xxx.conf
要知道集羣中的每個節點都有這麼一個文件,存儲着集羣中每個節點的信息:節點的角色、節點的ID、鏈接狀態、slot範圍、IP/PORT信息等。仔細觀察圖中,你能夠發現,新加入的8007節點,實際上被默認爲master節點,而且沒有slot分配!這說明,新加入的節點如今還不能夠存儲數據,所以咱們要爲新節點分配slot槽。
[root@mydream121 bin]# ./redis-trib.rb reshard 192.168.99.121:8001
要知道slot都分配在master上,所以其實咱們要作的就是從集羣的masters上進行從新分配。上面的命令須要指定一個master節點進行reshard分片。
slot從新分配
圖中要爲新加入的節點8007分配500個slot,並且分配的方式是"all",all是什麼意思呢?all表明從已經存在的全部的master上均勻的分配一部分slot給8007。固然你能夠經過"done"來指定某一個master進行分配。注意分配給8007是經過節點ID來指定的。
分配後的集羣信息
按照上面的操做,我將8008節點也加入集羣中,個人想法是讓8008成爲8007的從節點。既然是從節點,就不須要分配slot槽。注意到add-node方式加入的節點,默認就是master節點,所以這裏咱們得利用replicate指定主節點。
[root@mydream121 bin]# ./redis-trib.rb add-node 192.168.99.121:8008 192.168.99.121:8001
爲從節點指定主節點
那麼到如今,咱們就在線完成了對Redis集羣的水平擴容。那麼如何刪除節點呢?刪除節點時,數據怎麼辦呢?對於從節點,刪除就刪除了,並沒關係,關鍵是主節點,由於主節點上有slot。所以,在刪除主節點前,咱們要對主節點的slot進行從新分配,完成數據的遷移。
通常用predis足矣
https://github.com/nrk/predis
https://www.zybuluo.com/phper/note/248555