Redis 集群是redis官方提供的一種集群方案,從3.0開始提供穩(wěn)定版,應(yīng)用也已經(jīng)比較廣泛,也經(jīng)受住了時(shí)間考驗(yàn),個(gè)人感覺(jué)完全可以取代codis,tweemproxy等集群方案。
cluster原理介紹
cluster是使用數(shù)據(jù)分片的形式實(shí)現(xiàn)的,一個(gè) Redis cluster集群包含 16384 個(gè)哈希槽, 任意一個(gè)key都可以通過(guò) CRC16(key) % 16384 這個(gè)公式計(jì)算出應(yīng)當(dāng)屬于哪個(gè)槽。每個(gè)槽應(yīng)當(dāng)落在哪個(gè)節(jié)點(diǎn)上,也是事先定好。這樣,進(jìn)行任一操作時(shí),首先會(huì)根據(jù)key計(jì)算出對(duì)應(yīng)的節(jié)點(diǎn),然后操作相應(yīng)的節(jié)點(diǎn)就可以了。
所以說(shuō),其實(shí)cluster跟單點(diǎn)相比,只是多了一個(gè)給key計(jì)算sharding值的過(guò)程,并沒(méi)有增加多少?gòu)?fù)雜度,完全可以放心使用。
在這樣的設(shè)計(jì)下,一些對(duì)節(jié)點(diǎn)的操作也很方便,操作過(guò)程中對(duì)client端也不會(huì)有影響。
1. 增加節(jié)點(diǎn):將原有節(jié)點(diǎn)的某些slot轉(zhuǎn)移到新節(jié)點(diǎn)上
2. 刪除節(jié)點(diǎn): 將節(jié)點(diǎn)上的槽轉(zhuǎn)移到其他節(jié)點(diǎn)上以后,移除空節(jié)點(diǎn)
3. 節(jié)點(diǎn)故障:落到故障節(jié)點(diǎn)上的操作會(huì)失敗,而集群其他部分可以正常訪問(wèn),這樣就不會(huì)出現(xiàn)一致性哈希方案的“雪崩”問(wèn)題。單點(diǎn)的故障也可以通過(guò)配置slave解決,節(jié)點(diǎn)故障時(shí)可以由對(duì)應(yīng)的slave頂替
4. 節(jié)點(diǎn)重啟: 正常重啟即可,節(jié)點(diǎn)會(huì)自動(dòng)讀之前的配置然后加入集群中。
安裝操作流程
然后,我們可以實(shí)際安裝一次,由于只是測(cè)試,裝個(gè)兩三個(gè)節(jié)點(diǎn)就可以,而如果是生產(chǎn)使用的話,至少需要3個(gè)master節(jié)點(diǎn),也推薦同時(shí)至少有3個(gè)slave節(jié)點(diǎn)才能使用。
安裝redis
到redis官網(wǎng)(https://redis.io/download)上下載最新的stable版本。
以3.2.8為例,下載完以后執(zhí)行以下命令
$ tar xzf redis-3.2.8.tar.gz
$ cd redis-3.2.8
$ make
然后解壓縮,make就可以了.
redis配置與啟動(dòng)
make之后會(huì)在redis的src目錄下多出幾個(gè)命令,包括redis-server, redis-cli等,可以把他們拷到/usr/local/bin下,這樣就可以在任意路徑下執(zhí)行。也可以自己指到src目錄下進(jìn)行操作。
啟動(dòng)之前需要先修改一下配置,redis的根目錄下有一個(gè)redis.conf文件,可以直接改它,也可以拷到別的路徑下進(jìn)行修改。
主要就是把cluster模式打開,然后配一下cluster配置文件。
cluster-enabled yes
cluster-config-file nodes.conf
其他的配置,port,bind,protect-mode之類的,可以根據(jù)需求改一下,不改也沒(méi)關(guān)系。如果是想在一臺(tái)機(jī)器上啟動(dòng)多個(gè)實(shí)例的話,需要給每個(gè)實(shí)例一個(gè)配置文件, port, cluster-config-file這些配置也需要區(qū)分一下。
然后執(zhí)行以下命令,分別指定不同的配置文件啟動(dòng)。
redis-server redis-6379.conf &
redis-server redis-6380.conf &
開啟cluster
需要的節(jié)點(diǎn)都啟動(dòng)以后,就可以開始配置cluster了。推薦的辦法是使用官方提供的redis-trib.rb工具包,這個(gè)具體操作可以參考官方文檔。我們?cè)谶@里試一下手動(dòng)操作,這樣其實(shí)可以加深對(duì)cluster原理的理解。
首先通過(guò)redis-cli命令進(jìn)入任意一個(gè)redis實(shí)例中,然后一次對(duì)其他幾個(gè)節(jié)點(diǎn)執(zhí)行meet命令。
Cluster meet xxx:6380
然后執(zhí)行cluster nodes命令就可以看到節(jié)點(diǎn)被加入到集群中了。
這之后還有一步是分配slot, 可以使用cluster setslot命令,不過(guò)由于slot比較多,分配起來(lái)很麻煩。還有另外一種方式是修改nodes.conf這個(gè)配置文件。
Nodes.conf這個(gè)配置包含了cluster相關(guān)的幾乎所有信息,一般情況下無(wú)需自己去操作,redis會(huì)自動(dòng)生成,可以打開看一下,里邊每個(gè)節(jié)點(diǎn)都對(duì)應(yīng)一行,一行是類似這種格式:
8301106a1a0b7472650f22503abea23024df17fb 127.0.0.1:6379 myself,master - 0 0 1 connected
然后slot的分配情況是加在最后
8301106a1a0b7472650f22503abea23024df17fb 127.0.0.1:6379 myself,master - 0 0 1 connected 0-8000
需要注意的是,全部16384(0-16383)個(gè)slot都要分配出去,不能留空;集群中每個(gè)節(jié)點(diǎn)都對(duì)應(yīng)一個(gè)Nodes.conf文件,每個(gè)文件里的slot配置要一致。
改完以后重啟所有節(jié)點(diǎn),在redis-cli中執(zhí)行cluster info 命令,可以看到一些關(guān)鍵信息
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:2
cluster_size:1
所有slot已經(jīng)分配出去,Cluster stat也變成了ok. 這樣一個(gè)cluster就算搭建完畢了。