日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis主从哨兵集群模式概念以及搭建

發(fā)布時(shí)間:2024/3/26 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis主从哨兵集群模式概念以及搭建 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

?

前言

一、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 6379

master的話只需要添加前三條即可

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。