利用redis replication實現redis服務器熱遷移

利用redis replication實現redis服務器熱遷移

    文章開頭我先聲明:標題過於高大上,主要是爲了裝逼。

    某個月黑風高的夜晚,一隻運維攻城獅和一隻PHP程序猿在促膝長談,只見PHP程序猿雙眼目光呆滯的盯着眼前屏幕上的一坨坨代碼狀文本,突然問出一句:“這個你會搞嗎?”語氣中透着一股程序猿的傲嬌與對運維這一行業的輕蔑。攻城獅顯然感覺到了空氣中的那一縷殺氣,但爲了不給這個行業丟臉,攻城獅還是傲嬌的仰頭,冷冷的說:“我瞅瞅!”

    問題是這樣的,程序員他們公司最近要更換一臺redis服務器,但是更換的過程中還不能down機。根據網上提供的方法有兩種,一種是把數據庫down出來,然後在新的redis服務器上搞進去,然後切換。很明顯,大家對於這種方案的態度就倆字:呵呵!

    另外一種方法就是使用redis的主從同步方式來讓新的服務器實時同步舊的服務器,等數據同步完成後,在將所有的請求趁舊服務器一個不注意的時候,噶本兒!轉到新的服務器上,從此做一個毫無違和感的始亂終棄的服務器替換,小三在一片歡呼聲中成功上位,噢耶!

    想想如此跌宕起伏的劇情,攻城獅在夜裏興奮了,雄起了,然後果斷開機,開虛擬機,搞起!然後……這是個悲傷的故事,攻城獅百度了一堆文檔,發現redis主從同步配置竟然簡單到令人髮指!只需要在slave服務器的redis.conf配置文件中添加一行:

   slaveof <masterIP> <masterport>

這樣一條簡單的配置,攻城獅熟練的操作着虛擬機,他開機了!!他配IP地址了!!他遠程登錄了!!他用yum裝了redis了!!他開始配置redis了!!他那粗壯的手指在瘋狂的打壓鍵盤,他的嘴角開始微微揚起,他準備着迎接即將到來的勝利!!這個時候他感覺不是一個人!他的背後是整個運維行業的注視!!快看!!攻城獅啓動服務了!!他開始測試了!!然後,測試失敗了……

    呵呵,真是一個悲傷的故事!

    讓我們來看一下配置的過程和問題所在:

    兩臺虛擬機:

    master的IP是192.168.31.118,沒有做任何更改,啓動了redis服務

    slave的IP是192.168.31.200,在/etc/redis.conf文件中增加了一行配置:slaveof 192.168.1.118 6379

然後啓動了redis服務。

    測試的過程是在master服務器上,使用redis-cli客戶端登錄redis命令行界面,使用flushdb命令清空所有key(該過程只用於測試,真實環境中敲個這命令你就不用搞什麼熱遷移了),創建兩個鍵值對:

wKioL1VJ0uXykBqlAADcEp68pjI828.jpg

然後到slave服務器上,使用redis-cli命令登錄redis並使用命令key*來查看是否同步了數據,結果悲劇了:

wKioL1VJ1a_iwW-5AABkY5G2ROw495.jpg

想象中Duang~的一下就同步過來的數據卡殼了,數據不知道死哪去了!文檔中就是這麼寫的啊,腫麼搞不定了呢?

    無奈,查日誌唄,好在redis記錄了日誌,由於是slave沒有同步到數據且master沒做別的更改,那麼問題很有可能就出在slave上,查看slave上的redis日誌,以下是日誌內容:

wKioL1VJ1wnDM47yAAkCksV9oO4975.jpg看到了麼?多麼痛的領悟!居然鏈接被拒絕?!搞毛線啊??!明明是照着網上的文檔來的啊,而且不止一個文檔這麼配置啊,爲毛如此堅決的拒絕一個單身狗的合理要求?!怒摔!!

    攻城獅又一次被碾壓了,程序猿眼角那束光是怎麼回事?分明感到被歧視了呢!夜已深,第二天還得賣身的攻城獅含恨而睡去,睡夢中,攻城獅夢到了他成功解決問題的那一剎那,很美,很美……

    好吧,故事並沒有結束,就在第二天,攻城獅終於抽出了時間來解決別人公司的問題(老闆還好不看我博客,不然後果很嚴重啊!)攻城獅不愧爲攻城獅,他將目光轉向了master服務器,看來master什麼都不配置是不正確的。仔細觀看配置文件時,攻城獅終於眼前一亮!他看到了在配置文件中有一行這樣的配置:

    bind 127.0.0.1

    瞬間開竅,尼瑪啊,坑爹啊,這個配置是用來限制允許哪些IP訪問redis的啊,怎麼網上的文檔一致忽略這麼一個關鍵配置啊!尼瑪能不能少點轉載,寫文章的時候走走腦子啊喂!!這幫坑爹的小婊砸!!再次怒摔!!

    然後,攻城獅放了個大招,將這個配置更改爲:bind 0.0.0.0   是的,攻城獅開始瘋狂的報復這個社會了!!改完以後重啓redis,成功了,成功了!!!攻城獅那副大眼鏡框子後面閃爍出了點點的淚光,他呢喃道:“終於TM的通了,F**K!”主從終於配置成功了!

    你以爲故事就這樣結束了?!你還是太年輕!還有一條關鍵的配置配好嗎?那就是在redis2.6以上,默認slave服務器是不允許執行寫操作的,所以,這就註定了slave從工作的那一刻起就註定了是個備胎!哼哼,我們就是來拯救備胎的,所以果斷在slave的配置中修改如下配置:

slave-read-only no

允許slave上執行寫操作,沒錯,就是這麼任性!如此一來,備胎就可以準備上位了,剩下的事情就交給開發,讓其將redis服務器改到新的服務器上,改完後,在新的服務器上登錄redis並執行命令:

SLAVEOF no one

    至此,正式將slave從備胎扶上位!

    雖然這只是一個簡單的配置,但是作爲一個運維工程師,不正是靠着這種一點一滴的積累,一步一步慢慢走向大牛道路的嗎?運維說到底玩的不是技術,而是經驗!運維還是老的辣!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章