redis sentinel 구성 및 테스트

redis cluster 구성
로컬 장비에서 포트를 달리해 redis 노드들을 띄운다.

--cluster-replicas n 명시하지 않으면 마스터 노드로만 구성한다.
1 이면 master 당 slave 1개로 구성한다.
클러스터는 최소 3개의 마스터가 필요, 슬레이브까지 구성하려면 6개의 노드가 필요하다.
./redis/bin/redis-cli --cluster create --cluster-replicas 1 -a "ysoftmanPassword123" \
127.0.0.1:7001 \
127.0.0.1:7002 \
127.0.0.1:7003 \
127.0.0.1:7004 \
127.0.0.1:7005 \
127.0.0.1:7006

위와 같이 3개의 마스터 3개의 슬레이브로 구성된 클러스터를 확인
./redis/bin/redis-cli -p 7001 -a "ysoftmanPassword123" -c cluster nodes


#####


sentinel 구성
이제 sentinel 을 구성하면 모니터링, 알림, failover(slave->master변경)이 가능하다.
sentinel.conf 주요 설정

port 27001
protected-mode no
daemonize yes
pidfile "sentinel27001.pid"
logfile "sentinel27001.log"
# 마스터 노드 모두를 모니터링 한다.
# 3개의 sentinel 중 2개이상(quorum(정족수),과반수) 마스터 내려갔음을 인지해야 동작(slave->master승격)하도록 한다.
sentinel monitor redis1 127.0.0.1 7001 2
sentinel monitor redis2 127.0.0.1 7005 2
sentinel monitor redis3 127.0.0.1 7003 2
# redis master 접속에 암호가 필요한경우
sentinel auth-pass redis1 ysoftmanPassword123
sentinel auth-pass redis2 ysoftmanPassword123
sentinel auth-pass redis3 ysoftmanPassword123
# redis master 가 10 초동안 응답없으면 다운으로 인지
# 참고로 디폴트 30초,디폴트값이면 sentinel 시작시 .conf 재작성할때 이설정은 삭제된다.
sentinel down-after-milliseconds redis1 10000
sentinel down-after-milliseconds redis2 10000
sentinel down-after-milliseconds redis3 10000
# 장애조치(failover) 120초 동안 응답이 없으면 취소한다.
# 참고로 디폴트 180초,디폴트값이면 sentinel 시작시 .conf 재작성할때 이설정은 삭제된다.
sentinel failover-timeout redis1 120000
sentinel failover-timeout redis2 120000
sentinel failover-timeout redis3 120000
# redis 장애 인지시 노티에 사용할 스크립트
# sentinel notification-script redis1 sentinel-notify.sh

현재 마스터 노드의 포트 파악 후
./redis/bin/redis-cli -p 7001 -a "ysoftmanPassword123" -c cluster nodes | grep master | awk '{print $2}' | sed 's/.*://' | sed 's/@.*//' | tr '\n' ' '

설정에서 마스터 포트를 변경(명시)해서 sentinel 을 실행시킨다.
./redis/bin/redis-sentinel sentinel27001.conf
./redis/bin/redis-sentinel sentinel27002.conf
./redis/bin/redis-sentinel sentinel27003.conf


#####


sentinel 동작 테스트
7001, 7002, 7003 포트가 마스터 노드인 상황
7002 노드에 값을 저장한다.
./redis/bin/redis-cli -p 7001 -a "ysoftmanPassword123" -c
127.0.0.1:7001> set ysoftman orange
-> Redirected to slot [8041] located at 127.0.0.1:7002
OK
127.0.0.1:7002> get ysoftman
"orange"

7002 노드를 제거해 보자
kill -9 $(ps -ef | grep -E ".*redis.*:7002" | grep -v "grep" | awk '{print $2}')

7002 master 노드 fail 상태, 7005 slave -> master 변경됨
./redis/bin/redis-cli -p 7001 -a "ysoftmanPassword123" -c cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
34b867023af79468bf4f2926b060eca5741455b1 127.0.0.1:7003@17003 master - 0 1635090090468 3 connected 10923-16383
972b73d32638376b59cb5e6609b217e3d3286f44 127.0.0.1:7002@17002 master,fail - 1635090070264 1635090063193 2 disconnected
6c3507cbc50ee1cae5bba336ff1168f1b92be67d 127.0.0.1:7004@17004 slave 06948db08ba4f8a59dc3b717f1325151ffe2fc8e 0 1635090091476 1 connected
92640be3b64770324a700418acacb7c770fd8b93 127.0.0.1:7005@17005 master - 0 1635090090000 7 connected 5461-10922
b8939e0cf3c49d6b62172fc2cfcd20225fbefd79 127.0.0.1:7006@17006 slave 34b867023af79468bf4f2926b060eca5741455b1 0 1635090092488 3 connected
06948db08ba4f8a59dc3b717f1325151ffe2fc8e 127.0.0.1:7001@17001 myself,master - 0 1635090091000 1 connected 0-5460

3개의 sentinel.log 에 7002 -> 7005 로 마스터 노드를 변경해 failover 처리 되었음을 알 수 있다.
57677:X 25 Oct 2021 00:41:26.895 # +switch-master redis2 127.0.0.1 7002 127.0.0.1 7005
57677:X 25 Oct 2021 00:41:26.896 * +slave slave 127.0.0.1:7002 127.0.0.1 7002 @ redis2 127.0.0.1 7005
57677:X 25 Oct 2021 00:41:36.935 # +sdown slave 127.0.0.1:7002 127.0.0.1 7002 @ redis2 127.0.0.1 7005

7005는 slave 였을때 7002 의 백업을 하고 있었고
이제 master 가 된 7005 에서 7002 에 저장 했던 값을 찾을 수 있다.
./redis/bin/redis-cli -p 7001 -a "ysoftmanPassword123" -c
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:7001> get ysoftman
-> Redirected to slot [8041] located at 127.0.0.1:7005
"orange"
127.0.0.1:7005>

죽은 7002 노드를 시작하면
./redis/bin/redis-server redis7002.con

7002 는 slave 로 동작한다.
./redis/bin/redis-cli -p 7001 -a "ysoftmanPassword123" -c cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
34b867023af79468bf4f2926b060eca5741455b1 127.0.0.1:7003@17003 master - 0 1635090263000 3 connected 10923-16383
972b73d32638376b59cb5e6609b217e3d3286f44 127.0.0.1:7002@17002 slave 92640be3b64770324a700418acacb7c770fd8b93 0 1635090262960 7 connected
6c3507cbc50ee1cae5bba336ff1168f1b92be67d 127.0.0.1:7004@17004 slave 06948db08ba4f8a59dc3b717f1325151ffe2fc8e 0 1635090262353 1 connected
92640be3b64770324a700418acacb7c770fd8b93 127.0.0.1:7005@17005 master - 0 1635090263364 7 connected 5461-10922
b8939e0cf3c49d6b62172fc2cfcd20225fbefd79 127.0.0.1:7006@17006 slave 34b867023af79468bf4f2926b060eca5741455b1 0 1635090264374 3 connected
06948db08ba4f8a59dc3b717f1325151ffe2fc8e 127.0.0.1:7001@17001 myself,master - 0 1635090263000 1 connected 0-5460

7002 노드의 replication 정보를 보면 7005 를 master 로 바라보고 있음을 알 수 있다.
./redis/bin/redis-cli -p 7002 -a "ysoftmanPassword123" info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:7005
... 생략 ...

redis 장애 발생시 sentinel 로 slave->master 로 변경은 해주지만,
sentinel 알림(스크립트)을 통해 장애를 인지하고
redis 노드를 다시 띄우거나 상황에 따라 구성을 변경해야 할 필요는 있다.

# redis sentinel 테스트 내용

comments:

댓글 쓰기