Redis主从哨兵集群模式概念以及搭建
目錄
?
前言
一、Redis使用準(zhǔn)備工作
1.1、下載redis
1.2、安裝redis
二、Redis部署
2.1、單節(jié)點(diǎn)模式部署
2.2、主從模式部署
2.2.1 主從模式的感念:
2.2.2 主從模式的理解:
2.2.3 主從模式的缺點(diǎn):
2.2.4 配置主從模式:
2.3、哨兵模式部署
2.3.1 對(duì)哨兵模式(Sentinel)的理解:
2.3.2 Sentinel模式的好處:
2.3.3 Sentinel集群:
2.3.4 配置Sentinel模式
2.4、集群模式
2.4.1 對(duì)集群模式的理解
2.4.2 集群模式配置
2.4.3 集群過程
總結(jié):
前言
本文是我借鑒網(wǎng)上很多大神的總結(jié),并結(jié)合自己在項(xiàng)目中的使用歸納出的。如果發(fā)現(xiàn)有的地方與其他大神的文章有類似的地方,絕不是偶然。。。。
下面放上一些借鑒的文章鏈接:
https://new.qq.com/omn/20180126/20180126G00THE.html
http://www.cnblogs.com/yu421/p/8081544.html
?
一、Redis使用準(zhǔn)備工作
1.1、下載redis
據(jù)了解,redis官方只有l(wèi)inux版,沒有windows版的。
下面是微軟的windows版的redis,linux版的請(qǐng)自行去官網(wǎng)下載:
https://github.com/MSOpenTech/redis/releases
關(guān)于redis版本,一般情況下不會(huì)有問題,但是以后項(xiàng)目的依賴更新,有可能不兼容老版本的redis。
1.2、安裝redis
windows的版本直接解壓就可以了
Linux需要先通過解壓命令解壓:tar zxvf?redis-4.0.11.tar.gz
之后會(huì)出現(xiàn)一個(gè)解壓后的文件夾,然后進(jìn)入里面的src目錄下:cd?redis-4.0.11/src
然后進(jìn)行安裝命令:make install PREFIX=../
PREFIX后面跟的是想要安裝到的路徑,可以自定義,這里安裝到了src文件的上一級(jí)目錄
然后看到以下字樣證明安裝成功了
到這里安裝完成
二、Redis部署
2.1、單節(jié)點(diǎn)模式部署
單節(jié)點(diǎn)模式其實(shí)就是直接啟動(dòng)一個(gè)redis,一般小項(xiàng)目或者數(shù)據(jù)量不大的項(xiàng)目才有可能會(huì)用到。
直接進(jìn)入bin文件夾輸入命令啟動(dòng)即可:./redis-server
出現(xiàn)下面這張圖證明啟動(dòng)成功了
2.2、主從模式部署
2.2.1 主從模式的感念:
主從模式就是N個(gè)redis實(shí)例,可以是1主N從,也可以N主N從(N主N從則不是嚴(yán)格意義上的主從模式了,后續(xù)的集群模式會(huì)說到,N主N從就是N+N個(gè)redis實(shí)例。)
主從模式的一個(gè)作用是備份數(shù)據(jù),這樣當(dāng)一個(gè)節(jié)點(diǎn)損壞(指不可恢復(fù)的硬件損壞)時(shí),數(shù)據(jù)因?yàn)橛袀浞?#xff0c;可以方便恢復(fù)。
另一個(gè)作用是負(fù)載均衡,所有客戶端都訪問一個(gè)節(jié)點(diǎn)肯定會(huì)影響Redis工作效率,有了主從以后,查詢操作就可以通過查詢從節(jié)點(diǎn)來完成。
2.2.2 主從模式的理解:
這里引用網(wǎng)上大神總結(jié)的內(nèi)容,大神總結(jié)的非常到位
1.一個(gè)Master可以有多個(gè)Slaves,可以是1主N從。
2.默認(rèn)配置下,master節(jié)點(diǎn)可以進(jìn)行讀和寫,slave節(jié)點(diǎn)只能進(jìn)行讀操作,寫操作被禁止(readonly)。
3.不要修改配置讓slave節(jié)點(diǎn)支持寫操作,沒有意義,原因一,寫入的數(shù)據(jù)不會(huì)被同步到其他節(jié)點(diǎn);原因二,當(dāng)master節(jié)點(diǎn)修改同一條數(shù)據(jù)后,slave節(jié)點(diǎn)的數(shù)據(jù)會(huì)被覆蓋掉。
4.slave節(jié)點(diǎn)掛了不影響其他slave節(jié)點(diǎn)的讀和master節(jié)點(diǎn)的讀和寫,重新啟動(dòng)后會(huì)將數(shù)據(jù)從master節(jié)點(diǎn)同步過來。
5.master節(jié)點(diǎn)掛了以后,不影響slave節(jié)點(diǎn)的讀,Redis將不再提供寫服務(wù),master節(jié)點(diǎn)啟動(dòng)后Redis將重新對(duì)外提供寫服務(wù)。
6.特別說明:該種模式下,master節(jié)點(diǎn)掛了以后,slave不會(huì)競(jìng)選成為master。
對(duì)有密碼的情況說明一下,當(dāng)master節(jié)點(diǎn)設(shè)置密碼時(shí):
客戶端訪問master需要密碼,啟動(dòng)slave需要密碼,在配置中進(jìn)行配置即可。客戶端訪問slave不需要密碼
綜上,客戶端只需要配置一個(gè)密碼參數(shù),而redis配置文件中需要配置兩個(gè)參數(shù)。
分別是:
Redis服務(wù)端配置文件:
masterauth "chrdw,hdhxt!"
requirepass "chrdw,hdhxt!"
客戶端配置文件:
jedis-cluster.password=chrdw,hdhxt!
注意沒有引號(hào)。
2.2.3 主從模式的缺點(diǎn):
主從模式的缺點(diǎn)其實(shí)從上面的描述中可以得出:
master節(jié)點(diǎn)掛了以后,redis就不能對(duì)外提供寫服務(wù)了,因?yàn)槭O碌膕lave不能成為master
這個(gè)缺點(diǎn)影響是很大的,尤其是對(duì)生產(chǎn)環(huán)境來說,是一刻都不能停止服務(wù)的,所以一般的生產(chǎn)壞境是不會(huì)單單只有主從模式的。所以有了下面的sentinel模式。
2.2.4 配置主從模式:
首先復(fù)制3份redis目錄下的redis.conf文件,分別命名:
redis6379.conf
redis6380.conf
redis6381.conf
其中6379為master,剩下兩個(gè)為slave,并對(duì)3個(gè)文件進(jìn)行配置:
bind 127.0.0.1 port=6380 daemonize yes slaveof 127.0.0.1 6379master的話只需要添加前三條即可
daemonize yes表示后臺(tái)啟動(dòng),原值為no
然后啟動(dòng):
redis-server.exe redis6379.conf
redis-server.exe redis6380.conf
redis-server.exe redis6381.conf
打開master客戶端界面查看狀態(tài)
redis-cli.exe -h 127.0.0.1 -p 6379
info replication
可以看到master下有兩個(gè)slave,證明啟動(dòng)成功
關(guān)閉redis
可以通過命令:ps -ef|grep redis 來查看后臺(tái)運(yùn)行的redis進(jìn)程
可以通過:./redis-cli -h 127.0.0.1 -p 6380 shutdown 來指定要關(guān)閉的redis
2.3、哨兵模式部署
sentinel的中文含義是哨兵、守衛(wèi)。也就是說既然主從模式中,當(dāng)master節(jié)點(diǎn)掛了以后,slave節(jié)點(diǎn)不能主動(dòng)選舉一個(gè)master節(jié)點(diǎn)出來,那么我就安排一個(gè)或多個(gè)sentinel來做這件事,當(dāng)sentinel發(fā)現(xiàn)master節(jié)點(diǎn)掛了以后,sentinel就會(huì)從slave中重新選舉一個(gè)master。
2.3.1 對(duì)哨兵模式(Sentinel)的理解:
1.sentinel模式是建立在主從模式的基礎(chǔ)上,如果只有一個(gè)Redis節(jié)點(diǎn),sentinel就沒有任何意義。
2.當(dāng)master節(jié)點(diǎn)掛了以后,sentinel會(huì)在slave中選擇一個(gè)做為master,并修改它們的配置文件,其他slave的配置文件也會(huì)被修改,比如slaveof屬性會(huì)指向新的master。
3.當(dāng)master節(jié)點(diǎn)重新啟動(dòng)后,它將不再是master,而是作為slave接收新的master節(jié)點(diǎn)的同步數(shù)據(jù)
4.sentinel因?yàn)橐彩且粋€(gè)進(jìn)程有掛掉的可能,所以sentinel也會(huì)啟動(dòng)多個(gè)形成一個(gè)sentinel集群。
5.當(dāng)主從模式配置密碼時(shí),sentinel也會(huì)同步將配置信息修改到配置文件中,不需要擔(dān)心。
6.一個(gè)sentinel或sentinel集群可以管理多個(gè)主從Redis。
7.sentinel最好不要和Redis部署在同一臺(tái)機(jī)器,不然Redis的服務(wù)器掛了以后,sentinel也掛了。
8.sentinel監(jiān)控的Redis集群都會(huì)定義一個(gè)master名字,這個(gè)名字代表Redis集群的master Redis。
當(dāng)使用sentinel模式的時(shí)候,客戶端就不要直接連接Redis,而是連接sentinel的ip和port,由sentinel來提供具體的可提供服務(wù)的Redis實(shí)現(xiàn),這樣當(dāng)master節(jié)點(diǎn)掛掉以后,sentinel就會(huì)感知并將新的master節(jié)點(diǎn)提供給使用者。
2.3.2 Sentinel模式的好處:
1.如果只有一個(gè)sentinel進(jìn)程,如果這個(gè)進(jìn)程運(yùn)行出錯(cuò),或者是網(wǎng)絡(luò)堵塞,那么將無法實(shí)現(xiàn)redis集群的主備切換(單點(diǎn)問題)。
2.如果有多個(gè)sentinel,redis的客戶端可以隨意地連接任意一個(gè)sentinel來獲得關(guān)于redis集群中的信息。
3.sentinel集群自身也需要多數(shù)機(jī)制,也就是2個(gè)sentinel進(jìn)程時(shí),掛掉一個(gè)另一個(gè)就不可用了。
2.3.3 Sentinel集群:
和其他集群不同,你無須設(shè)置其他Sentinel的地址,Sentinel進(jìn)程可以通過發(fā)布與訂閱來自動(dòng)發(fā)現(xiàn)正在監(jiān)視相同主實(shí)例的其他Sentinel。當(dāng)一個(gè) Sentinel 發(fā)現(xiàn)一個(gè)新的 Sentinel 時(shí),它會(huì)將新的 Sentinel 添加到一個(gè)列表中,這個(gè)列表保存了 Sentinel 已知的,監(jiān)視同一個(gè)主服務(wù)器的所有其他Sentinel。
Sentinel集群中的Sentinel不會(huì)再同一時(shí)刻并發(fā)去failover(故障切換or故障轉(zhuǎn)移)同一個(gè)master,第一個(gè)進(jìn)行failover的Sentinel如果失敗了(上文配置的failover-timeout),另外一個(gè)才會(huì)重新進(jìn)行failover,以此類推。
當(dāng)Sentinel將一個(gè)slave選舉為master并發(fā)送SLAVE OF NO ONE后,即使其它的slave還沒針對(duì)新master重新配置自己,failover也被認(rèn)為是成功了。
上述過度過程中,若此時(shí)重啟old master,則redis集群將處于無master狀態(tài),此時(shí)只能手動(dòng)修改配置文件,然后重新啟動(dòng)集群.(生產(chǎn)情況下千萬不要做如此愚蠢的操作,否則你會(huì)導(dǎo)致整個(gè)應(yīng)用集群都啟動(dòng)失敗。)
Master-Slave切換后,Sentinel會(huì)改寫master,slave和sentinel的conf配置文件。
一旦一個(gè)Sentinel成功地對(duì)一個(gè)master進(jìn)行了failover,它將會(huì)把關(guān)于master的最新配置通過廣播形式通知其它sentinel,其它的Sentinel則更新對(duì)應(yīng)master的配置。
Sentinel模式基本可以滿足一般生產(chǎn)的需求,具備高可用性。但是當(dāng)數(shù)據(jù)量過大到一臺(tái)服務(wù)器存放不下的情況(這個(gè)一般是內(nèi)存瓶頸,本人進(jìn)行過Redis的壓力測(cè)試,Redis在高并發(fā)、大數(shù)據(jù)量的情況下CPU等資源的消耗不高,主要壓力是內(nèi)存。)時(shí),主從模式或sentinel模式就不能滿足需求了,這個(gè)時(shí)候需要對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行分片,將數(shù)據(jù)存儲(chǔ)到多個(gè)Redis實(shí)例中,就是下面要講的。
2.3.4 配置Sentinel模式
首先依然是先復(fù)制3個(gè)哨兵的配置文件
sentinel26379.conf
sentinel26380.conf
sentinel26381.conf
修改其中的配置
port?26379?//?當(dāng)前Sentinel服務(wù)運(yùn)行的端口??
sentinel?monitor?mymaster?127.0.0.1?6379?2? ?//?去監(jiān)視一個(gè)名為mymaster的主redis實(shí)例,這個(gè)主實(shí)例的IP地址為本機(jī)地址127.0.0.1,端口號(hào)為6379,而將這個(gè)主實(shí)例判斷為失效至少需要2個(gè)?Sentinel進(jìn)程的同意,只要同意Sentinel的數(shù)量不達(dá)標(biāo),自動(dòng)failover就不會(huì)執(zhí)行
sentinel?down-after-milliseconds?mymaster?5000? //?指定了Sentinel認(rèn)為Redis實(shí)例已經(jīng)失效所需的毫秒數(shù)。當(dāng)?實(shí)例超過該時(shí)間沒有返回PING,或者直接返回錯(cuò)誤,那么Sentinel將這個(gè)實(shí)例標(biāo)記為主觀下線。只有一個(gè)?Sentinel進(jìn)程將實(shí)例標(biāo)記為主觀下線并不一定會(huì)引起實(shí)例的自動(dòng)故障遷移:只有在足夠數(shù)量的Sentinel都將一個(gè)實(shí)例標(biāo)記為主觀下線之后,實(shí)例才會(huì)被標(biāo)記為客觀下線,這時(shí)自動(dòng)故障遷移才會(huì)執(zhí)行
sentinel?parallel-syncs?mymaster?1? //?指定了在執(zhí)行故障轉(zhuǎn)移時(shí),最多可以有多少個(gè)從Redis實(shí)例在同步新的主實(shí)例,在從Redis實(shí)例較多的情況下這個(gè)數(shù)字越小,同步的時(shí)間越長,完成故障轉(zhuǎn)移所需的時(shí)間就越長
sentinel?failover-timeout?mymaster?15000 //?如果在該時(shí)間(ms)內(nèi)未能完成failover操作,則認(rèn)為該failover失敗
daemonize yes //添加此條可以后臺(tái)啟動(dòng)
?
然后啟動(dòng)即可:
./redis-server ./config/sentinel26379.conf --sentinel
./redis-server ./config/sentinel26380.conf --sentinel
./redis-server ./config/sentinel26381.conf --sentinel
可以利用redis客戶端查看
如圖,證明啟動(dòng)成功
2.4、集群模式
2.4.1 對(duì)集群模式的理解
cluster的出現(xiàn)是為了解決單機(jī)Redis容量有限的問題,將Redis的數(shù)據(jù)根據(jù)一定的規(guī)則分配到多臺(tái)機(jī)器。對(duì)cluster的一些理解:
一個(gè) Redis 集群包含 16384 個(gè)哈希槽(hash slot),數(shù)據(jù)庫中的每個(gè)鍵都屬于這 16384 個(gè)哈希槽的其中一個(gè),集群中的每個(gè)節(jié)點(diǎn)負(fù)責(zé)處理一部分哈希槽。
例如一個(gè)集群有三個(gè)主節(jié)點(diǎn),其中:
節(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)的做法使得用戶可以很容易地向集群中添加或者刪除節(jié)點(diǎn)。例如:如果用戶將新節(jié)點(diǎn) D 添加到集群中, 那么集群只需要將節(jié)點(diǎn) A 、B 、 C 中的某些槽移動(dòng)到節(jié)點(diǎn) D 就可以了。
如果用戶要從集群中移除節(jié)點(diǎn) A , 那么集群只需要將節(jié)點(diǎn) A 中的所有哈希槽移動(dòng)到節(jié)點(diǎn) B 和節(jié)點(diǎn) C , 然后再移除空白(不包含任何哈希槽)的節(jié)點(diǎn) A 就可以了。
這里需要注意的是,集群如果是5主5從,主節(jié)點(diǎn)也是16384個(gè)hash slot,而不會(huì)因?yàn)橹鞴?jié)點(diǎn)的增多slot也增多。我們?cè)诜植鄣臅r(shí)候,盡量把槽平均分給主節(jié)點(diǎn)。因?yàn)橐粋€(gè)key落在哪個(gè)槽里面,是根據(jù)key的CRC16值模上16384得出的值來計(jì)算的。
2.Redis 集群對(duì)節(jié)點(diǎn)使用了主從復(fù)制功能: 集群中的每個(gè)節(jié)點(diǎn)都有 1 個(gè)至 N 個(gè)復(fù)制品(replica), 其中一個(gè)復(fù)制品為主節(jié)點(diǎn)(master), 而其余的 N-1 個(gè)復(fù)制品為從節(jié)點(diǎn)(slave)。
我們知道集群模式下,1主N從時(shí),當(dāng)主節(jié)點(diǎn)掛掉時(shí),從節(jié)點(diǎn)通過心跳監(jiān)聽機(jī)制,會(huì)競(jìng)選成為主節(jié)點(diǎn)(這時(shí)設(shè)置的readonly會(huì)失效),所以在部署的時(shí)候,主從節(jié)點(diǎn)應(yīng)該部署在不同的機(jī)器上,這個(gè)時(shí)候如果主節(jié)點(diǎn)的服務(wù)器宕機(jī),從節(jié)點(diǎn)競(jìng)選成功后會(huì)繼續(xù)承擔(dān)讀寫的任務(wù)。
3.Redis 集群的節(jié)點(diǎn)間通過Gossip協(xié)議通信。
4.當(dāng)前Redis集群不支持NAT環(huán)境或者IP,端口重新映射的環(huán)境。
cluster這種模式適合數(shù)據(jù)量巨大的緩存要求,當(dāng)數(shù)據(jù)量不是很大使用sentinel即可。
5.以上四條全是網(wǎng)上大神總結(jié)的,所以我自己再加一條哈哈哈
2.4.2 集群模式配置
安裝ruby環(huán)境:
普通Linux下:
? ???yum install ruby?
? ? ? ? ? ? ? ? yum install rubygems??
? ? ? ? ? ? ? ? gem install redis
Ubuntu下:
? ? Ubuntu的話安裝東西都需要獲得管理員權(quán)限,所以跟Linux下不太一樣
? ? sudo apt-get install ruby
? ? sudo apt-get install rubygems
? ? sudo gem install redis
創(chuàng)建6個(gè)集群文件:
? ? redis6379.conf
? ? redis6380.conf
? ? redis6381.conf
? ? redis6382.conf
? ? redis6383.conf
? ? redis6384.conf
修改配置:
? ? cluster-enabled yes? --開啟集群
? ? cluster-config-file nodes-6382.conf --集群配置文件名,每個(gè)實(shí)例配置的要不同,redis會(huì)根據(jù)文件名自動(dòng)新建
? ? 這里要注意:
? ? ? ? 如果你沿用了上面的6379,6380和6391的話,需要注釋掉之前的slaveof 127.0.0.1 6379。因?yàn)閮蓚€(gè)模式無法兼容。
啟動(dòng)集群:
? ? 進(jìn)入redis文件夾下的src目錄,執(zhí)行命令:
? ? ? ??./redis-trib.rb create --replicas 1 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6379
? ? 這里的節(jié)點(diǎn),前三個(gè)表示master,后三個(gè)表示對(duì)應(yīng)的slave。
? ? 如圖:
? ? 出現(xiàn)以上內(nèi)容,輸入yes,集群就搭建完畢了。
? ??登錄任一臺(tái)redis,執(zhí)行 info cluster,提示cluster_enabled:1
2.4.3 集群過程
首先redis-trib.rb會(huì)以客戶端的形式嘗試連接所有的節(jié)點(diǎn),并發(fā)送PING命令以確定節(jié)點(diǎn)能夠正常服務(wù)。如果有任何節(jié)點(diǎn)無法連接,則創(chuàng)建失敗。同時(shí)發(fā)送 INFO 命令獲取每個(gè)節(jié)點(diǎn)的運(yùn)行ID以及是否開啟了集群功能(即cluster_enabled為1)。 準(zhǔn)備就緒后集群會(huì)向每個(gè)節(jié)點(diǎn)發(fā)送 CLUSTER MEET命令,格式為 CLUSTER MEET ip port,這個(gè)命令用來告訴當(dāng)前節(jié)點(diǎn)指定ip和port上在運(yùn)行的節(jié)點(diǎn)也是集群的一部分,從而使得6個(gè)節(jié)點(diǎn)最終可以歸入一個(gè)集群。
然后redis-trib.rb會(huì)分配主從數(shù)據(jù)庫節(jié)點(diǎn),分配的原則是盡量保證每個(gè)主數(shù)據(jù)庫運(yùn)行在不同的IP地址上,同時(shí)每個(gè)從數(shù)據(jù)庫和主數(shù)據(jù)庫均不運(yùn)行在同一IP地址上,以保證系統(tǒng)的容災(zāi)能力
3主3從,當(dāng)1個(gè)主故障,大家會(huì)給對(duì)應(yīng)的從投票,把從立為主,若沒有從數(shù)據(jù)庫可以恢復(fù)則redis集群就down了。
總結(jié):
以上就是本文的全部內(nèi)容,再次感謝網(wǎng)上大神們的總結(jié)。歡迎各位留言評(píng)論指出本文的不足。謝謝!
總結(jié)
以上是生活随笔為你收集整理的Redis主从哨兵集群模式概念以及搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统架构设计笔记(16)——局域网与广域
- 下一篇: mysql去重复查询 性能_MySQL中