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