Redis server主從之間的斷開重連

來源:互聯網
上載者:User

最近某項目,用了開源的 key-value 儲存 Redis server,同事提出來用的。

會部署一個master和若干個slave。slave和master同步。

開發完了上線。第二天,發現slave與master斷開了。master和slave放在不同機房的。進程都還在,只是沒有同步,資料沒有更新,因為master顯示串連的slave少了。

 

這太嚇人了,不會簡單的斷開重連都沒實現吧,redis。

 

進一步分析,一開始如果slave沒連上master,是會一直重試串連的。中間如果重啟master進程或是殺掉,slave也會有不斷地重連嘗試的。

 

那就怪了。

後來發現,在redis master那端,用netstat查看tcp串連,跟slave的串連是沒有了的,斷開的。而在slave端查看tcp 串連,顯示跟master的串連是Established狀態的。也就是說,master端檢測到TCP串連斷開,所以log顯示少了一個slave;而slave端因為某種原因,TCP串連無聲無息斷開,不能用了,但系統沒檢測到...而重連是由slave發起的,因為不知道串連壞了所以沒有重連。

 

我就提出來兩種解決辦法:

第一種呢,Redis自己在應用程式層實現心跳機制,或者說ping。隔段時間ping一次,幾個ping逾時可以認為master與slave串連已經斷開。

第二種,利用TCP只有的keepalive機制,不斷得重新整理TCP串連,也可以檢測串連 實際斷開形式還established的情況。

 

 

後來,同事在Redis網頁上找到一個patch

http://code.google.com/p/redis/issues/detail?id=224

 

 

它就是對socket設定TCP Keepalive來解決的。

 

這個patch在最新的2.0的代碼裡已經有,不過前幾天下載的就還沒有這個patch。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.