상황
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
'Database > Redis' 카테고리의 다른 글
[Redis] 리눅스환경에서 JAVA 와 Jedis 로 Redis 접속하는 방법 (2) | 2020.12.20 |
---|---|
[Redis] 레디스 failover-abort-no-good-slave 오류 해결방법 (0) | 2020.11.22 |
[Redis] INFO 명령어로 조회되는 대상 의미 파악 (0) | 2020.07.17 |
[Redis] 클러스터 Failover 및 FailBack 하는 방법 (0) | 2020.04.05 |
[Redis] 현재 오픈되어 있는 슬롯, 없는 슬롯 확인 및 추가하는 방법 (0) | 2020.04.05 |