redis sentinel 主從切換(failover)解決方案瓶摆,詳細配置

主從復(fù)制簡單來說就是把一臺redis數(shù)據(jù)庫中的數(shù)據(jù)同步到另一臺redis數(shù)據(jù)庫刊愚,并且按照數(shù)據(jù)流向,數(shù)據(jù)的發(fā)送者我們稱作master吩抓,數(shù)據(jù)的接受者我們稱作slave(master/slave的劃分并不是那么一定的涉茧,譬如B可以作為A的slave,但同時也可以作為C的master)疹娶,下面就從slave和master的角度分別說明主從復(fù)制流程伴栓。

首先是slave端,對于slave端來說雨饺,主從復(fù)制主要經(jīng)歷四個階段:

第一階段:與master建立連接

第二階段:向master發(fā)起同步請求(SYNC)

第三階段:接受master發(fā)來的RDB數(shù)據(jù)

第四階段:載入RDB文件

下面我們就通過一個圖來概述在每一個階段中钳垮,slave究竟做了些什么:

關(guān)于上圖,有一點說明下:redis接收到slaveof master_host master_port命令后并沒有馬上與master建立連接额港,而是當執(zhí)行服務(wù)器例行任務(wù)serverCron饺窿,發(fā)現(xiàn)自己正處于REDIS_REPL_CONNECT狀態(tài),這時才真正的向maser發(fā)起連接移斩,偽代碼:

Python代碼

defserverCron():

#?服務(wù)器處于REDIS_REPL_CONNECT狀態(tài)

ifredisServer.repl_state?==?REDIS_REPL_CONNECT:

#?向master發(fā)起連接

connectWithMaster()

#?其他例行任務(wù)(省略)...

接著我們來看下主從復(fù)制過程中肚医,master這邊的流程是如何绢馍,在具體看細節(jié)之前,我們先綜合來看master這邊主要做的幾件事情:

看完這個圖肠套,你也許會有以下幾個疑問:

1. 為什么在master發(fā)送完RDB文件后痕貌,還要定期的向slave發(fā)送PING命令?

2. 在發(fā)送完RDB文件之后糠排,master發(fā)送的“變更”命令又是什么,有什么用超升?

在回答問題之前1入宦,我們先回答問題2:

master保存RDB文件是通過一個子進程進行的,所以master依然可以處理客戶端請求而不被阻塞室琢,但這也導(dǎo)致了在保存RDB文件期間乾闰,“鍵空間”可能發(fā)生變化(譬如接收到一個客戶端請求,執(zhí)行"set name diaocow"命令)盈滴,因此為了保證數(shù)據(jù)同步的一致性涯肩,master會在保存RDB文件期間,把接受到的這些可能變更數(shù)據(jù)庫“鍵空間”的命令保存下來巢钓,然后放到每個slave的回復(fù)列表中病苗,當RDB文件發(fā)送完master會發(fā)送這些回復(fù)列表中的內(nèi)容,并且在這之后症汹,如果數(shù)據(jù)庫發(fā)生變更硫朦,master依然會把變更的命令追加到回復(fù)列表發(fā)送給slave,這樣就可以保證master和slave數(shù)據(jù)的一致性背镇!相關(guān)偽代碼:

Python代碼

defprocessCommand(cmd,?argc,?argv):

#?處理命令

call(cmd,?argc,?argv)

#?如果該命令造成數(shù)據(jù)庫鍵空間變化and當前redis是一個master咬展,則同步變更命令

ifredisServer.update_key_spaceandlen(redisServer.slaves)?>0:

replicationFeedSlaves(cmd,?argc,?argv)

defreplicationFeedSlaves(cmd,?argc,?argv):

#?把變更命令發(fā)送給每一個處于:REDIS_REPL_WAIT_BGSAVE_END狀態(tài)的slave節(jié)點

forslaveinredisServer.slaves:

ifslave.replstate?==?REDIS_REPL_WAIT_BGSAVE_START:

continue

slave.updateNotify(cmd,?argc,?argv)

由于在發(fā)送完RDB文件之后,master會不定時的給slave發(fā)送“變更”命令瞒斩,可能過1s破婆,也可能過1小時,所以為了防止slave無意義等待(譬如master已經(jīng)掛掉的情況)胸囱,master需要定時發(fā)送“钡灰ǎ活”命令PING,以此告訴slave:我還活著旺矾,不要中斷與我的連接

現(xiàn)在我們就看下蔑鹦,當master接受到slave發(fā)送的sync同步命令后究竟發(fā)生了哪些事:

上圖看似分支復(fù)雜,但我們抓住以下幾點即可:

1.保存RDB文件是在一個子進程中進行的箕宙;

2.如果master已經(jīng)在保存RDB文件嚎朽,但是沒有客戶端正在等待這次BGSAVE,新添加的slave需要等到下次BGSAVE柬帕,而不能直接使用這次生成的RDB文件(原因圖中已經(jīng)說明)

3.master會定期檢查RDB文件是否保存完畢(時間事件serverCron)哟忍;

接下來我們看下狡门,master是如何給每一個slave發(fā)送RDB文件的:

好了,至此我們已經(jīng)分析完在主從復(fù)制過程中锅很,master和slave兩邊分別是怎么一個處理流程;最后其馏,我繪制了一個圖,綜述了主從復(fù)制這一過程(我們可以邊看圖爆安,邊回憶其中的具體細節(jié)):

PS:在主從復(fù)制過程中叛复,任何一步發(fā)生錯誤,都會導(dǎo)致整個過程重頭開始扔仓,所以若RDB文件很大又或是此時正處在業(yè)務(wù)高峰期褐奥,對系統(tǒng)性能將會有非常大的影響!

總結(jié):

1. 了解主從復(fù)制master和slave的概念翘簇;

2. 了解主從復(fù)制執(zhí)行過程撬码,特別是其中關(guān)鍵的幾步;

3. 了解目前主從復(fù)制過程中尚存的不足之處版保;

查看圖片附件

oyhk 學(xué)習(xí)筆記

網(wǎng)站的訪問量慢慢上來了呜笑。為了網(wǎng)站的性能方面,開始用了Redis做緩存策略彻犁。剛開始的時候叫胁,redis是一個單點,當一臺機器巖機的時候袖裕,redis的服務(wù)完全停止曹抬,這時就會影響其他服務(wù)的正常運行。費話不多說了急鳄,下面利用redis sentinel做一個主從切換的集群管理谤民。做這個集群管理的時候,查過很多資料才完全了解疾宏,他是怎么做的张足。

Java客戶端請看:

http://blog.mkfree.com/posts/52b146e6479e5a64742fddd0

參考資料:http://redis.io/topics/sentinel我也是看這篇文章。

環(huán)境配置:

由于我這次配置沒有太多的機器坎藐,我用了vagrant 去開了多臺虛擬機为牍。然后搭好了環(huán)境。

redis的安裝請參考:redis 簡單官方腳本安裝方法(linux)

集群配置最少需要三臺機器岩馍,那么我就三臺虛擬機,三臺虛擬機分別安裝同樣的redis的環(huán)境

ip分別:

192.168.9.17 ?(redis sentinel 集群監(jiān)控)

192.168.9.18 ?(redis 主)

192.168.9.19 ?(redis 從)

redis配置:

主的redis配置文件,使用默認的配置文件就可以了碉咆,如果你需要設(shè)計其他參數(shù)

從的redis配置文件,添加

#從的redis配置文件蛀恩,需要添加vim/etc/redis/6379.confslaveof192.168.9.186379

啟動主從redis

#啟動主redis(192.168.9.18)/etc/init.d/redis_6379.conf start#啟動從redis(192.168.9.19)/etc/init.d/redis_6379.conf start

查看主redis信息

#查看主redis的信息redis-cli-h192.168.9.18infoReplication#Replicationrole:master#代表192.168.9.18:6379這臺redis是主connected_slaves:1slave0:192.168.9.18,6379,online

查看從redis信息

#查看主redis的信息redis-cli-h192.168.9.19infoReplication#Replicationrole:slave#代表192.168.9.18:6379這臺redis是主master_host:192.168.9.18master_port:6379master_link_status:up

master_last_io_seconds_ago:4master_sync_in_progress:0slave_priority:100slave_read_only:1connected_slaves:0

配置redis sentinel集群監(jiān)控服務(wù)

1.添加一份redis sentinel 配置文件

vim/etc/redis/sentinel.conf##redis-0##sentinel實例之間的通訊端口port26379#master1

sentinel monitor master1192.168.9.1863791sentinel down-after-milliseconds master15000sentinel failover-timeout master1900000sentinel can-failover master1 yes

sentinel parallel-syncs master12#master2可以添加多組主從的redis監(jiān)聽.......

2.有配置文件了疫铜,那么啟動redis sentinel做redis集群監(jiān)聽

redis-sentinel sentinel.conf--sentinel

好了,所有環(huán)境都搭好了双谆。下面開始正式的演示

1.正常演示壳咕。

把主的redis啟動

把從的redis啟動

把redis sentinel 集群監(jiān)聽啟動

觀察redis sentinel 日志信息

這里很清楚地看到席揽,從的redis加入了集群

[4925]15Oct03:42:21.889*+slave slave192.168.9.19:6379192.168.9.196379@master1192.168.9.186379

執(zhí)行以下命令,查看redis主從信息

[root@localhost vagrant]#redis-cli-h192.168.9.17-p26379infoSentinel#Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0master0:name=master1,status=ok,address=192.168.9.18:6379,slaves=1,sentinels=1

那么表示一切都正常了谓厘。你的redis sentinel集群已經(jīng)配置成功幌羞!

2.故障演示

2.1當主的redis 服務(wù)器巖機了,會發(fā)生什么情況呢竟稳?

執(zhí)行以下命令使用主的redis服務(wù)停止

redis-cli-h192.168.9.18-p6379shutdown#表示把192.168.9.18這臺redis關(guān)閉

關(guān)閉后属桦,我們再查看redis sentinel 的日志情況

這張圖片很清晰地反應(yīng)到,redis sentinel 監(jiān)控到主的redis服務(wù)停止他爸,然后自動把從的redis切換到主地啰。

再執(zhí)行以下命令,查看redis主從信息

[root@localhost vagrant]#redis-cli-h192.168.33.111-p26379infoSentinel#Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0master0:name=master1,status=ok,address=192.168.9.19:6379,slaves=1,sentinels=1

把從已經(jīng)升為主了讲逛。那么自動切換就已經(jīng)成功了!

2.2 當我們已經(jīng)發(fā)現(xiàn)岭埠,一臺redis發(fā)生故障了盏混,可能會收到一些故障信息,那么再把服務(wù)已關(guān)閉的redis恢復(fù)服務(wù)狀態(tài)惜论,會發(fā)生怎么樣的情況呢许赃?

redis sentinel 集群服務(wù),會把上次主redis重新加入服務(wù)中馆类,但是他再以不是主的redis了混聊,變成從的reids。

哈.....完成了乾巧。句喜。。下篇會寫關(guān)于沟于,客戶端調(diào)用主從集群自動切換使用例子咳胃。我會以java為使用客戶端.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市旷太,隨后出現(xiàn)的幾起案子展懈,更是在濱河造成了極大的恐慌,老刑警劉巖供璧,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件存崖,死亡現(xiàn)場離奇詭異,居然都是意外死亡睡毒,警方通過查閱死者的電腦和手機来惧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吕嘀,“玉大人违寞,你說我怎么就攤上這事贞瞒。” “怎么了趁曼?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵军浆,是天一觀的道長。 經(jīng)常有香客問我挡闰,道長乒融,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任摄悯,我火速辦了婚禮赞季,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奢驯。我一直安慰自己申钩,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布瘪阁。 她就那樣靜靜地躺著撒遣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪管跺。 梳的紋絲不亂的頭發(fā)上义黎,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音豁跑,去河邊找鬼廉涕。 笑死,一個胖子當著我的面吹牛艇拍,可吹牛的內(nèi)容都是我干的狐蜕。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼卸夕,長吁一口氣:“原來是場噩夢啊……” “哼馏鹤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娇哆,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤湃累,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碍讨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體治力,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年勃黍,在試婚紗的時候發(fā)現(xiàn)自己被綠了宵统。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖马澈,靈堂內(nèi)的尸體忽然破棺而出瓢省,到底是詐尸還是另有隱情,我是刑警寧澤痊班,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布勤婚,位于F島的核電站,受9級特大地震影響涤伐,放射性物質(zhì)發(fā)生泄漏馒胆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一凝果、第九天 我趴在偏房一處隱蔽的房頂上張望祝迂。 院中可真熱鬧,春花似錦器净、人聲如沸型雳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽四啰。三九已至,卻和暖如春粗恢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欧瘪。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工眷射, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人佛掖。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓妖碉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親芥被。 傳聞我的和親對象是個殘疾皇子欧宜,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容