可參考官網文檔:redis集群配置
需要注意的是,集群中的每個節點都會涉及到兩個端口,一個是用於處理客戶端操作的(如下介紹到的6379/6380),另一個是10000+{監聽端口},用於集群各個節點間通信。
第一步 :環境准備
此處我准備了三台服務器(也可安裝三台虛擬機),其內網IP分別為:192.168.103.54 192.168.103.56 192.168.103.57,我們約定把192.168.103.54作為集群控制端。
第二步:安裝redis
可參考redis安裝與配置
第三步:修改配置、創建節點(此處我每台機器運行兩個redis節點)
次處我的redis安裝目錄為:/usr/data/redis-4.0.8
1、跳轉到redis安裝目錄
cd /usr/data/redis-4.0.8
2、創建一個新目錄:cluster (該目錄名稱、位置任意,此處我是建在了redis安裝目錄下)
mkdir cluster
3、在cluster目錄下,創建兩個目錄,分別是6379 6380(用於存儲redis配置文件)
備注:此處新建的目錄名必須與redis節點對應的端口號對應
cd cluster mkdir 6379 6380
4、添加redis節點對應的配置文件,此處我直接拷貝redis安裝目錄下的配置文件redis.conf再加以修改
cp redis.conf cluster/6379 cp redis.conf cluster/6380
5、修改redis配置文件(目錄6379、6380下的redis.conf),主要修改如下配置,
#綁定局域網ip,使得三台服務器可相互訪問 bind 192.168.103.54 protected-mode yes #redis節點監聽端口 port 6380 #以守護進程啟動 daemonize yes pidfile /var/run/redis_6380.pid dbfilename dump_6380.rdb #如下為集群配置 cluster-enabled yes #啟用集群 cluster-config-file nodes-6380.conf #集群配置文件,由redis自動更新,不需要手動配置 cluster-node-timeout 5000 #集群節點超時時間,即集群中主從節點斷開連接時間閾值,超過該值則認為主節點不可以,從節點將有可能轉為mastercluster-slave-validity-factor 10
#在進行故障轉移的時候全部slave都會請求申請為master,但是有些slave可能與master斷開連接一段時間了導致數據過於陳舊,不應該被提升為master。該參數就是用來判斷slave節點與master斷線的時間是否過長
(計算方法為:cluster-node-timeout *cluster-slave-validity-factor,此處為:5000 * 10 毫秒
)#cluster-migration-barrier 1
,才能提供服務cluster-require-full-coverage
yes
#集群中的所有slot(16384個)全部覆蓋
第四步:啟動三台機器上的6個節點
cd /usr/data/redis-4.0.8/src ./redis-server ../cluster/6379/redis.conf ./redis-server ../cluster/6380/redis.conf
第五步:創建集群
因為此處我是以192.168.103.54作為集群控制端,所有一下操作都在改機器上完成
gem install redis ./redis-trib.rb create --replicas 1 192.168.103.54:6379 192.168.103.54:6380 192.168.103.56:6379 192.168.103.56:6380 192.168.103.57:6379 192.168.103.57:6380
備注:執行gem install redis前,需先安裝ruby環境,如下通過yum安裝ruby:
yum -y install ruby rubygems
安裝完后再次執行gem還是會報錯:“redis requires Ruby version >= 2.2.2”
解決辦法為重裝高版本的ruby,此處我這里是以修改ruby yum源的方式重裝ruby
yum install centos-release-scl-rh //會在/etc/yum.repos.d/目錄下多出一個CentOS-SCLo-scl-rh.repo源 yum install rh-ruby23 -y //直接yum安裝即可 scl enable rh-ruby23 bash //必要一步 ruby -v //查看安裝版本
再次執行:gem install redis 成功
第六步:查看集群狀態
可連接集群中的任一節點,此處連接了集群中的節點192.168.103.54:6379
第七步:總結
redis集群實際上是通過hash slots 的方式實現負載均衡(總共16384個slot),采用了非一致hash,使得集群節點可動態增加或減少,通過key計算slot,然后將值存儲到對應的slot關聯的機器上。
擴展:
添加一個新的master
Adding a new node is basically the process of adding an empty node and then moving some data into it, in case it is a new master, or telling it to setup as a replica of a known node, in case it is a slave.
./redis-trib.rb add-node 192.168.103.58:6379 192.168.103.54:6379
當添加新的master后,需要從新分片redis,不然新的master由於沒有slot,所以不能提供服務
./redis-trib.rb reshard 192.168.103.54:6379
添加一個新的slave
./redis-trib.rb add-node --slave 192.168.103.58:6380 192.168.103.54:6379
移除集群中的一個節點
./redis-trib del-node 192.168.103.54:6379 `<node-id>`