Database/Redis

[Redis] 레디스 failover-abort-slave-timeout 오류 해결방법

꽁담 2020. 11. 22. 01:01

상황


2.8.4 버전에서 2.8.24 버전으로 업그레이드 후 발생하였습니다.

 

구조는 다음과 같습니다.

테스트 환경에서 재연에 필요한 인스턴스만 구성하였습니다.

 

업그레이드 작업 방법

단계 작업내용
1 Sentinel 인스턴스 다운
2 Redis Slave 인스턴스 다운
3 Redis Master 인스턴스 다운
4 redis / sentinel 바이너리 2.8.24 버전으로 교체
5 Redis Master 인스턴스 구동
6 Redis Slave 인스턴스 구동
7 Sentinel 인스턴스 구동
8 Sentinel 페일오버 테스트 진행 (오류 발생)

 

 

원인


Redis conf 파일에는 rename-command 의 옵션이 있었습니다.

이 옵션이 있는 경우, failover 시 아래와 같은 오류가 발생하는 것으로 보입니다. (확률적인듯 보입니다.)

 

확률적이라고 생각한 이유는 시나리오 아래에 작성하도록 하겠습니다.

 

 

시나리오 - 해결방법 포함


1. 업그레이드 된 버전 확인

root@psh-VirtualBox:~# redis-server -vRedis server v=2.8.24 

 

2. Redis conf 파일 확인

레디스 config 파일에는 rename-command 옵션이 있습니다.

6161 (Master) 6162 (Slave)
rename-command CONFIG __CONFIG__
rename-command DEBUG __DEBUG__
rename-command SHUTDOWN __SHUTDOWN__
rename-command FLUSHDB __FLUSHDB__
rename-command FLUSHALL __FLUSHALL__
rename-command CONFIG __CONFIG__
rename-command DEBUG __DEBUG__
rename-command SHUTDOWN __SHUTDOWN__
rename-command FLUSHDB __FLUSHDB__
rename-command FLUSHALL __FLUSHALL__

 

3. Sentinel 에서 Failover 진행

Failover 시 슬레이브 서버를 마스터 서버로 올리는 작업을 진행하려고 하다가 실패하게 됩니다.

센티넬 로그에는 failover-abort-slave-timeout 로그가 기록됩니다.

Executing user requested FAILOVER of 'TEST'
+new-epoch 12
+try-failover master TEST 192.168.56.101 6161
+vote-for-leader 8a448627767dd54c5f2ea89ecd514fc267cc76fd 12
+elected-leader master TEST 192.168.56.101 6161
+failover-state-select-slave master TEST 192.168.56.101 6161
+selected-slave slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161
+failover-state-send-slaveof-noone slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161
+failover-state-wait-promotion slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161
-failover-abort-slave-timeout master TEST 192.168.56.101 6161

 

4. Redis conf 파일에서 rename-command 를 주석처리

참고로 conf 파일 변경 시, 레디스를 재구동 해주었습니다.

6161 (Master) 6162 (Slave)
#rename-command CONFIG __CONFIG__
#rename-command DEBUG __DEBUG__
#rename-command SHUTDOWN __SHUTDOWN__
#rename-command FLUSHDB __FLUSHDB__
#rename-command FLUSHALL __FLUSHALL__
#rename-command CONFIG __CONFIG__
#rename-command DEBUG __DEBUG__
#rename-command SHUTDOWN __SHUTDOWN__
#rename-command FLUSHDB __FLUSHDB__
#rename-command FLUSHALL __FLUSHALL__

 

5. Sentinel 에서 Failover 진행

이번에는 센티넬에서 정상적으로 Failover 가 진행되었습니다.

Executing user requested FAILOVER of 'TEST'
+new-epoch 17
+try-failover master TEST 192.168.56.101 6162
+vote-for-leader 8a448627767dd54c5f2ea89ecd514fc267cc76fd 17
+elected-leader master TEST 192.168.56.101 6162
+failover-state-select-slave master TEST 192.168.56.101 6162
+selected-slave slave 192.168.56.101:6161 192.168.56.101 6161 @ TEST 192.168.56.101 6162
+failover-state-send-slaveof-noone slave 192.168.56.101:6161 192.168.56.101 6161 @ TEST 192.168.56.101 6162
+failover-state-wait-promotion slave 192.168.56.101:6161 192.168.56.101 6161 @ TEST 192.168.56.101 6162
+promoted-slave slave 192.168.56.101:6161 192.168.56.101 6161 @ TEST 192.168.56.101 6162
+failover-state-reconf-slaves master TEST 192.168.56.101 6162
+failover-end master TEST 192.168.56.101 6162
+switch-master TEST 192.168.56.101 6162 192.168.56.101 6161
+slave slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161
+convert-to-slave slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161

 

결론


레디스 로그레벨을 debug 로 설정하고 확인, tcpdump 명령어로 들어오는 패킷을 확인하여

원인을 명확히 확인해보려고 했으나 오래된 버전이어서 그런건진 모르겠지만,

남는게 없어서 원인 분석에는 실패하였습니다.

 

지금 상황에서는 레디스의 rename-command 옵션관련 버그가 있지 않았나 잠정결론 도출입니다.

 

 

확률적이라고 생각하는 이유


똑같은 방식으로 2.8.4 에서 2.8.24 업그레이드 하면서 테스트를 몇번 더 실행해 보았고,

바로 성공한 케이스도 있었기 때문입니다.

 

Redis conf 내용

6161 (Master) 6162 (Slave)
rename-command CONFIG __CONFIG__
rename-command DEBUG __DEBUG__
rename-command SHUTDOWN __SHUTDOWN__
rename-command FLUSHDB __FLUSHDB__
rename-command FLUSHALL __FLUSHALL__
rename-command CONFIG __CONFIG__
rename-command DEBUG __DEBUG__
rename-command SHUTDOWN __SHUTDOWN__
rename-command FLUSHDB __FLUSHDB__
rename-command FLUSHALL __FLUSHALL__

sentinel log ( loglevel 은 DEBUG 로 설정한 상태 )

성공시

+new-epoch 2 
+try-failover master TEST 192.168.56.101 6162 
+vote-for-leader c77d5edb3278fb0b3ae2e1247120ad3a6e5cffde 2 
+elected-leader master TEST 192.168.56.101 6162 
+failover-state-select-slave master TEST 192.168.56.101 6162 
+selected-slave slave 192.168.56.101:6161 192.168.56.101 6161 @ TEST 192.168.56.101 6162 
+failover-state-send-slaveof-noone slave 192.168.56.101:6161 192.168.56.101 6161 @ TEST 192.168.56.101 6162 
+failover-state-wait-promotion slave 192.168.56.101:6161 192.168.56.101 6161 @ TEST 192.168.56.101 6162 
+promoted-slave slave 192.168.56.101:6161 192.168.56.101 6161 @ TEST 192.168.56.101 6162 
+failover-state-reconf-slaves master TEST 192.168.56.101 6162 
+failover-end master TEST 192.168.56.101 6162 
+switch-master TEST 192.168.56.101 6162 192.168.56.101 6161 
+slave slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161 
+cmd-link master TEST 192.168.56.101 6161 
+pubsub-link master TEST 192.168.56.101 6161 
+cmd-link slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161 
+pubsub-link slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161 
-role-change slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161 new reported role is master

실패시

loglevel 이 default 였으나 기록된 세부로그 없음

+new-epoch 10
+try-failover master TEST 192.168.56.101 6161
+vote-for-leader e02c0e5a31ca307c2ddd08b5aafbc2e3b0801320 10
+elected-leader master TEST 192.168.56.101 6161
+failover-state-select-slave master TEST 192.168.56.101 6161
+selected-slave slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161
+failover-state-send-slaveof-noone slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161
+failover-state-wait-promotion slave 192.168.56.101:6162 192.168.56.101 6162 @ TEST 192.168.56.101 6161
-failover-abort-slave-timeout master TEST 192.168.56.101 6161

 

참고

2.8.4 에서 2.8.24 버전으로 업그레이드 했을 때 - Failover 실패 (확률적)

처음부터 2.8.4 버전으로 구성 - Failover 성공

처음부터 2.8.24 버전으로 구성 - Failover 성공

 

 

 

 

 

 

레디스 failover-abort-slave-timeout

Redis failover-abort-slave-timeout

센티넬 failover-abort-slave-timeout

Sentinel failover-abort-slave-timeout