2016-01-23 62 views
0

我有一個有三個Redis實例(一個主和兩個從屬)和三個Sentinel實例的體系結構。在它的前面有一個HaProxy。 一切正常,直到主Redis實例出現故障。新的主人是由Sentinel正確選擇的。但是,舊的主人(現在已經關閉)沒有重新配置爲從屬。因此,當這個事件再次發生時,我有兩個主人在短時間內(約11秒)。那段時間之後,那個被提升的實例被正確降級爲奴隸。Redis Sentinel master不立即降級爲奴隸

它不應該這樣工作,當主人倒下時,它立即降級到奴隸?有了它,當它再次起來時,它會立即成爲奴隸。 我知道(自Redis 2.8?以來)有CONFIG REWRITE功能,因此在Redis實例關閉時無法修改配置。

有兩個主人一段時間對我來說是一個問題,因爲HaProxy在短時間內沒有向一個主人Redis發送請求,而是在這兩個主人之間進行負載平衡。

是否有任何方法立即將發生故障的主設備降級爲從設備?

很明顯,我改變了Sentinel超時。

下面是哨兵和Redis的情況下,一些日誌的主下山後:

哨兵

81358:X 23 Jan 22:12:03.088 # +sdown master redis-ha 127.0.0.1      63797.0.0.1 26381 @ redis-ha 127.0.0.1 6379 
81358:X 23 Jan 22:12:03.149 # +new-epoch 1 
81358:X 23 Jan 22:12:03.149 # +vote-for-leader 6b5b5882443a1d738ab6849ecf4bc6b9b32ec142 1 
81358:X 23 Jan 22:12:03.174 # +odown master redis-ha 127.0.0.1 6379 #quorum 3/2 
81358:X 23 Jan 22:12:03.174 # Next failover delay: I will not start a failover before Sat Jan 23 22:12:09 2016 
81358:X 23 Jan 22:12:04.265 # +config-update-from sentinel 127.0.0.1:26381 127.0.0.1 26381 @ redis-ha 127.0.0.1 6379 
81358:X 23 Jan 22:12:04.265 # +switch-master redis-ha 127.0.0.1 6379 127.0.0.1 6381 
81358:X 23 Jan 22:12:04.266 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ redis-ha 127.0.0.1 6381 
81358:X 23 Jan 22:12:04.266 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ redis-ha 127.0.0.1 6381 
81358:X 23 Jan 22:12:06.297 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ redis-ha 127.0.0.1 6381 

Redis的

81354:S 23 Jan 22:12:03.341 * MASTER <-> SLAVE sync started 
81354:S 23 Jan 22:12:03.341 # Error condition on socket for SYNC: Connection refused 
81354:S 23 Jan 22:12:04.265 * Discarding previously cached master state. 
81354:S 23 Jan 22:12:04.265 * SLAVE OF 127.0.0.1:6381 enabled (user request from 'id=7 addr=127.0.0.1:57784 fd=10 name=sentinel-6b5b5882-cmd age=425 idle=0 flags=x db=0 sub=0 psub=0 multi=3 qbuf=14 qbuf-free=32754 obl=36 oll=0 omem=0 events=rw cmd=exec') 
81354:S 23 Jan 22:12:04.265 # CONFIG REWRITE executed with success. 
81354:S 23 Jan 22:12:04.371 * Connecting to MASTER 127.0.0.1:6381 
81354:S 23 Jan 22:12:04.371 * MASTER <-> SLAVE sync started 
81354:S 23 Jan 22:12:04.371 * Non blocking connect for SYNC fired the event. 
81354:S 23 Jan 22:12:04.371 * Master replied to PING, replication can continue... 
81354:S 23 Jan 22:12:04.371 * Partial resynchronization not possible (no cached master) 
81354:S 23 Jan 22:12:04.372 * Full resync from master: 07b3c8f64bbb9076d7e97799a53b8b290ecf470b:1 
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: receiving 860 bytes from master 
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: Flushing old data 
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: Loading DB in memory 
81354:S 23 Jan 22:12:04.467 * MASTER <-> SLAVE sync: Finished with success 
+0

這不是一個編程問題,而是一個系統/服務器管理員之一。 Serverfault是問這個問題的地方。 –

+0

確實如此。我將它移到Serverfault。 – Damian

+0

@Damian你找到一個解決您的問題。我也面臨同樣的問題。 – akipro

回答

0

在Redis的節點出現的事件當/如果恢復,它將恢復相同的role它已經下降。如果節點無法ping通節點,Sentinel無法重新配置該節點。所以,在節點恢復和Sentinel確認並重新配置它之間有一段短暫的時間。這解釋了多主控狀態。

如果您正在使用HAProxy的設置,一個解決方法是重新配置的Redis節點的角色開始的過程之前。只要redis.conf中存在SLAVEOF條目,Redis將作爲從服務器引導。此解決方法的主要問題是它不能解決網絡分區方案。

希望有所幫助。