2014-09-06 45 views
1

我有以下的Redis /哨兵配置:如何切換此Redis Sentinel配置中的主設備?

  • Redis的主A + N奴隸
  • M哨兵看A,命名爲masterA
  • 客戶端應用程序查詢哨兵爲masterA,然後查詢和修改A

現在說A已過時,我想r通過一個名爲B的新Redis主站(最少停機時間/數據丟失)進行更換。在該操作結束時,我想這樣的:

  • Redis的主B + N
  • 客戶端應用程序查詢和修改B

我可以進行如下操作:

  1. 讓哨兵開始看B,命名爲masterB
  2. A每個從成爲B

奴隸從這裏,我堅持,因爲客戶端應用程序仍要求masterA交談的哨兵時。我有兩個問題:

  • 有沒有一種方法來切換大師的名字,這樣B出名作爲masterA的哨兵,因此客戶端應用程序呢?
  • 修改客戶端應用程序代碼以處理從舊主設備切換到新主設備會更好嗎?

回答

1

實現您的目標的一種方法是遵循「添加另一層間接」的舊時代解決方案。

一個特別有效的方法是讓您的客戶端與TCP代理(例如HAProxy)通信,並讓它將流量傳遞給當前主服務器。

要保持TCP代理同步,您可以執行類似於http://blog.haproxy.com/2014/01/02/haproxy-advanced-redis-health-check/的操作,這可以使HAProxy Sentinel知道。

該解決方案的主要優點是它使您的客戶端變得非常簡單 - 它們只連接到一個地方,流量總是被轉發到正確的Redis實例。

此解決方案的一個問題是,HAProxy的配置DSL無法處理Redis服務器重新啓動的時間段,並且在哨兵將其作爲從服務器之前最初宣佈爲主服務器。這將導致錯過的寫入和不一致的狀態,這取決於你的應用程序可能是好的或可能不是。

爲了解決這個問題,我開始開發一個「更智能」的守護進程來保持HAProxy與當前主服務器同步。我的解決方案是在https://github.com/mdevilliers/redishappy