? 本文所有描述均為作者親自操作后總結(jié)出來(lái)的,如有疑問(wèn)可直接留言,將及時(shí)回復(fù),如本文理解或描述有誤的地方歡迎指出,將及時(shí)改正
本章主要描述redis集群的部署,若未搭建redis單機(jī)服務(wù)的朋友請(qǐng)移步redis(一)單機(jī)部署與應(yīng)用
參考文檔
redis官方集群指南:https://redis.io/topics/cluster-tutorial
redis官方集群規(guī)范:https://redis.io/topics/cluster-spec
redis中文集群指南:http://redisdoc.com/topic/cluster-tutorial.html
redis中文集群規(guī)范:http://redisdoc.com/topic/cluster-spec.html#cluster-spec
集群簡(jiǎn)介
?? ? redis 集群是一個(gè)可以在多個(gè) redis 節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)共享的設(shè)施(installation).
? ?? redis 集群有兩點(diǎn),一個(gè)是將數(shù)據(jù)分片存儲(chǔ),另外一個(gè)就是主從復(fù)制。一個(gè) redis 集群包含 16384 個(gè)哈希槽(hash slot), 數(shù)據(jù)庫(kù)中的每個(gè)鍵都屬于這 16384 個(gè)哈希槽的其中一個(gè)。
例如:一個(gè)集群可以有三個(gè)哈希槽, 其中:
? 節(jié)點(diǎn) A 負(fù)責(zé)處理 0 號(hào)至 5500 號(hào)哈希槽。
? 節(jié)點(diǎn) B 負(fù)責(zé)處理 5501 號(hào)至 11000 號(hào)哈希槽。
? 節(jié)點(diǎn) C 負(fù)責(zé)處理 11001 號(hào)至 16384 號(hào)哈希槽。
加入節(jié)點(diǎn)
若要加入新的機(jī)器節(jié)點(diǎn)D并為其指定900個(gè)哈希槽,那么只需要從節(jié)點(diǎn)A/B/C中拉取一定的槽移動(dòng)到D節(jié)點(diǎn)即可,如:A節(jié)點(diǎn)中移出0-300號(hào)哈希槽至D節(jié)點(diǎn),B節(jié)點(diǎn)移出5501-5801號(hào)哈希槽至D節(jié)點(diǎn),C節(jié)點(diǎn)同樣的移出11001-11301號(hào)哈希槽至D節(jié)點(diǎn),這樣就能完成哈希槽的分?jǐn)偣ぷ鳌?/p>
移除節(jié)點(diǎn)
若要移除節(jié)點(diǎn)A機(jī)器,同樣的將哈希槽轉(zhuǎn)移至B/C節(jié)點(diǎn),然后再刪除空白槽的節(jié)點(diǎn)機(jī)器即可。
注:經(jīng)試驗(yàn),改變哈希槽的歸屬不會(huì)造成節(jié)點(diǎn)阻塞,故不影響線上的功能使用,業(yè)務(wù)機(jī)器不會(huì)遇到任何異常。
集群環(huán)境
集群機(jī)器分配
要使redis集群正常工作至少需要3個(gè)master節(jié)點(diǎn),若要實(shí)現(xiàn)集群的高可用,每個(gè)master節(jié)點(diǎn)至少配置一個(gè)slave節(jié)點(diǎn),這里我將使用3個(gè)master和3個(gè)slave節(jié)點(diǎn)進(jìn)行操作,集群規(guī)劃如下:
總共6臺(tái)虛擬機(jī),分別為3臺(tái)master和3臺(tái)slave機(jī)器
單節(jié)點(diǎn)配置
注:按規(guī)劃在6臺(tái)機(jī)器中裝入redis服務(wù),且保證單機(jī)模式能夠正常運(yùn)行,并配置相應(yīng)端口防火墻,建議在配置時(shí)先修改一個(gè)文件, 再互相拷貝至6臺(tái)機(jī)器
集群節(jié)點(diǎn)描述
主機(jī)名 | IP | 服務(wù)端口(默認(rèn)為6379) | 集群通信端口 | 主/從 |
---|---|---|---|---|
lenovo1 | 192.168.2.10 | 6010 | 16010 | Master |
lenovo3 | 192.168.2.30 | 6030 | 16030 | Master |
lenovo4 | 192.168.2.40 | 6040 | 16040 | Master |
h1 | 192.168.2.101 | 6101 | 16101 | Slave |
h2 | 192.168.2.102 | 6102 | 16102 | Slave |
h3 | 192.168.2.103 | 6103 | 16103 | Slave |
集群配置參數(shù)
配置選項(xiàng) | 選項(xiàng)值 | 描述 |
---|---|---|
daemonize | yes | 是否作為守護(hù)進(jìn)程運(yùn)行,配置yes則產(chǎn)生pid文件 |
pidfile | /var/run/redis_6030.pid | 如開(kāi)啟了daemonize則需指定一個(gè)pid,默認(rèn)為redis_6379.pid |
port | 6030 | 監(jiān)聽(tīng)端口默認(rèn)6793 |
database | 1 | 可用數(shù)據(jù)庫(kù)數(shù),默認(rèn)為16,默認(rèn)數(shù)據(jù)庫(kù)存儲(chǔ)在DB0號(hào)ID庫(kù)中,無(wú)特殊要求建議設(shè)置一個(gè)數(shù)據(jù)庫(kù):database 1 |
cluster-enabled | yes | 打開(kāi)reids集群 |
cluster-config-file | nodes-6030.conf | 集群配置文件啟動(dòng)自動(dòng)生成不用認(rèn)為干涉 |
cluster-node-timeout | 5000 | 節(jié)點(diǎn)互聯(lián)超時(shí)時(shí)間,毫秒 |
appendonly | yes | 啟用aof持久化方式 |
配置
以6030端口機(jī)器為例
-
復(fù)制redis.conf為對(duì)應(yīng)端口.conf,如6030.conf
修改各機(jī)器端口為規(guī)劃端口
-
防火墻配置
//#redis 此處比單機(jī)要多集群通信端口的配置 -A INPUT -p tcp -m state --state NEW -m tcp --dport 6030 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 16030 -j ACCEPT
-
使用如下命令啟動(dòng)節(jié)點(diǎn)(后續(xù)啟動(dòng)都是如此)
192.168.2.10 /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6010.conf 192.168.2.30 /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6030.conf 192.168.2.40 /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6040.conf 192.168.2.101 /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6101.conf 192.168.2.102 /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6102.conf 192.168.2.103 /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6103.conf
-
使用命令查看各個(gè)節(jié)點(diǎn)是否啟動(dòng)成功
ps -ef | grep redis
-
查看redis目錄下自動(dòng)生成的nodes-xxx.conf文件
nodes-xxx.conf自動(dòng)生成文件,必須保證各機(jī)器上該文件的生成 -
此時(shí)各個(gè)節(jié)點(diǎn)啟動(dòng)后并未構(gòu)成一個(gè)集群,下面我們將各個(gè)節(jié)點(diǎn)構(gòu)成集群
,安裝ruby 和 rubygems(注意需要ruby的版本在1.8.7以上)//yum安裝 yum install ruby rubygems
ruby所有依賴(lài)文件在這里,有需要離線安裝的朋友可參考,我以將ruby依賴(lài)包上傳至redis集群ruby依賴(lài)包密碼:f0fj
//離線安裝步驟,yum安裝方式的朋友直接跳過(guò)
[grid@h3 ~]$ mkdir ruby
[grid@h3 ~]$ cd ruby/
[grid@h3 ruby]$ rz //選中所有依賴(lài)包后上傳
[root@h3 ruby]# rpm -iv *.rpm//使用root用戶(hù)安裝
軟件包準(zhǔn)備中...
ruby-libs-2.0.0.648-29.el7.x86_64
libyaml-0.1.4-11.el7_0.x86_64
ruby-irb-2.0.0.648-29.el7.noarch
ruby-2.0.0.648-29.el7.x86_64
rubygem-bigdecimal-1.2.0-29.el7.x86_64
rubygem-io-console-0.4.2-29.el7.x86_64
rubygem-json-1.7.7-29.el7.x86_64
rubygem-rdoc-4.0.0-29.el7.noarch
rubygems-2.0.14.1-29.el7.noarch
rubygem-psych-2.0.0-29.el7.x86_64
安裝完成后查看ruby版本
[root@h3 ruby]# ruby –v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
-
執(zhí)行redis集群創(chuàng)建命令(在一個(gè)節(jié)點(diǎn)執(zhí)行即可),將redis-trib.rb腳本文件復(fù)制到bin下并更換名稱(chēng)為redis-trib
[root@lenovo1 /]# cd /home/lenovo/install/redis-3.2.9/src [root@lenovo1 src]# cp redis-trib.rb ../bin/redis-trib [root@lenovo1 src]# cd ../bin/
使用redis-trib腳本程序的create命令創(chuàng)建集群,且復(fù)制節(jié)點(diǎn)為1,集群機(jī)器為這6臺(tái)機(jī)器
[root@lenovo1 bin]# redis-trib create --replicas 1 192.168.2.10:6010
192.168.2.30:6030 192.168.2.40:6040 192.168.2.101:6101
192.168.2.102:6102 192.168.2.103:6103
但此時(shí)卻報(bào)了如下異常
/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in
`require': cannot load such file -- redis (LoadError)
from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/lenovo/install/redis-3.2.9/bin/redis-trib:25:in `<main>
糾結(jié)了會(huì)發(fā)現(xiàn)我們似乎漏了些什么東西,ruby裝完了是干嘛的呢?
解決方案:安裝redis與ruby交互的接口
//在線安裝
[root@lenovo1 bin]# gem install redis
Fetching: redis-3.3.3.gem (100%)
Successfully installed redis-3.3.3
Parsing documentation for redis-3.3.3
Installing ri documentation for redis-3.3.3
1 gem installed
注:若需要離線安裝的同學(xué),我以將redis接口文件存放在ruby同級(jí)目錄下,直接在該目錄下執(zhí)行如下命令即可進(jìn)行安裝
//離線安裝-在線安裝的直接跳過(guò)
[root@h1 ruby]# gem install redis-3.3.3.gem
Successfully installed redis-3.3.3
Parsing documentation for redis-3.3.3
Installing ri documentation for redis-3.3.3
1 gem installed
-
重新啟動(dòng)redis服務(wù)(使用步驟3方式指定conf啟動(dòng),否則不會(huì)生成nodes-xxx.conf文件),然后再執(zhí)行創(chuàng)建集群的命令,查看結(jié)果
卻出現(xiàn)如下錯(cuò)誤>>> Creating cluster [ERR] Sorry, can't connect to node 192.168.2.30:6030
沃ri啊,相信你是崩潰的,誰(shuí)讓我們都是搞事情的呢,出了事情就得去解決
再將所有防火墻打開(kāi),保證集群通信端口能互通,再次創(chuàng)建集群
若此時(shí)不是你規(guī)劃的設(shè)置,請(qǐng)調(diào)整創(chuàng)建命令的機(jī)器順序,默認(rèn)前3個(gè)為主節(jié)點(diǎn)
若啟動(dòng)出現(xiàn)如下錯(cuò)誤,請(qǐng)將上一次創(chuàng)建集群失敗的cluster-config-file文件刪除,然后重新啟動(dòng)各節(jié)點(diǎn)
-
集群?jiǎn)?dòng)幾點(diǎn)保證
正確配置了配置文件,安裝了ruby環(huán)境和ruby與redis的接口,保證啟動(dòng)后生成了nodes-xxx.conf文件
若在創(chuàng)建集群中出現(xiàn)如下錯(cuò)誤:[ERR] Node 192.168.2.30:6030 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
則需要將上次啟動(dòng)生成的數(shù)據(jù)庫(kù)文件及節(jié)點(diǎn)配置刪除,或者修改6030.conf中的database數(shù)量
-
集群簡(jiǎn)單測(cè)試
使用redis-cli命令進(jìn)入集群環(huán)境
若使用如下命令進(jìn)入集群這時(shí)會(huì)出現(xiàn)如下錯(cuò)誤./redis-cli –c –p 6030 Could not connect to Redis at 127.0.0.1:6030: Connection refused
主要原因是配置了6030.conf中的bind,但若不配置bind又將出現(xiàn)找不到節(jié)點(diǎn)錯(cuò)誤,故下面加上-h參數(shù)
[root@lenovo3 bin]# ./redis-cli -c -h 192.168.2.30 -p 6030
-c是以集群方式登錄;
-h后跟主機(jī)號(hào) ;
-p后跟端口號(hào)。
若綁定了127.0.0.1則可以省略-h參數(shù)。不加-c則客戶(hù)端不自動(dòng)切換。
-
查看集群綁定的節(jié)點(diǎn)信息
[root@lenovo1 bin]# ./redis-cli -c -h 192.168.2.10 -p 6010 cluster nodes
-
集群使用
在30節(jié)點(diǎn)設(shè)置一個(gè)值
然后模擬30節(jié)點(diǎn)宕機(jī)后,然后再次查看所有節(jié)點(diǎn)信息
30節(jié)點(diǎn)宕機(jī)
繼續(xù)在其他節(jié)點(diǎn)獲取30宕機(jī)前的edu的值
30宕機(jī)后其自動(dòng)重定向至該從節(jié)點(diǎn)102
再次關(guān)停102從節(jié)點(diǎn),會(huì)發(fā)現(xiàn)該集群任何一個(gè)節(jié)點(diǎn)都將不提供服務(wù)
該集群停止服務(wù)
接下來(lái)嘗試重新啟動(dòng)102從節(jié)點(diǎn),看看能否繼續(xù)提供服務(wù)
繼續(xù)提供服務(wù)且未丟失數(shù)據(jù) - 總結(jié)
由以上實(shí)驗(yàn)可以得出,當(dāng)redis集群(3臺(tái))中的任何一臺(tái)master機(jī)器停止服務(wù)后,若存在slave節(jié)點(diǎn),則slave節(jié)點(diǎn)會(huì)直接頂替宕機(jī)的master并繼續(xù)提供服務(wù),若slave再次宕機(jī),則整個(gè)集群停止提供服務(wù),重啟該slave后其服務(wù)繼續(xù)執(zhí)行,且未損失任何數(shù)據(jù),說(shuō)明redis將該緩存持久化在數(shù)據(jù)庫(kù)中
redis集群部署配置就講到這里,另外關(guān)于redis更高級(jí)的配置這里不做說(shuō)明,大家可以自己花時(shí)間進(jìn)行學(xué)習(xí)