본문 바로가기
오픈소스/Redis

[Redis] 레디스 장애 복구를 위한 Sentinel 구성

by sangyeon 2021. 10. 29.
728x90

이번 글에서는 레디스의 Sentinel을 구성해보려고 한다.

먼저 개념부터 확인하기로 한다.

 

1. 레디스 센티널(Sentinel)이란?

운영환경에서 레디스는 일반적으로 마스터와 복제(Slave)로 구성된다..

운영중 예기치 않게 마스터가 다운되었다면, 관리자가 이를 감지해서 복제를 마스터로 올리고 클라이언트들이 새로운 마스터에 접속할 수 있도록 해 주어야 하는데, 

센티널은 마스터와 복제를 감시하고 있다가 마스터가 다운되면 이를 감지해서 관리자의 개입없이 자동으로 복제를 마스터로 올려준다.

 

센티널의 주요기능은 다음과 같다.

- 모니터링 : 센티널은 레디스 마스터와 복제들이 제대로 동작하는지 지속적으로 감시한다.

- 자동 장애조치(Automatic Failover) : 센티널은 레디스 마스터가 예기치 않게 다운될 경우 복제를 새로운 마스터로 승격시킨다.

- 알림 :  그림 1-1을 보면 센티널은 감시하고 있는 레디스 인스턴스들이 failover되었을 때 Pub/Sub으로 어플리케이션(클라이언트)에게 알리거나 shell script로 관리자에게 이메일이나 SMS로 알릴 수 있다.

 

 

그림 1-1. 출처 : https://ichi.pro/ko/redis-sentinel-mich-spring-lettuce-keullaieonteuleul-tonghan-go-gayongseong-173327786572930

 

2. 센티널 구성

센티널 구성시에 반드시 따라야 하는 원칙이 있다.

센티널의 경우 마스터가 장애인 상황을 판단할 경우 센티널 노드들의 결정을 따르게 되는데, 이때 센티널 개수를 3개 이상으로 하는 것을 권고한다. 

그 이유는 하나의 센티널의 오판으로 복제노드를 마스터로 승격할 수 있기 때문이다. 그렇기 때문에 반드시 센티널 구성 시 3개 이상의 홀수 인스턴스를 띄워서 과반수 이상의 센티널이 "OK"해야 비로소 마스터 노드의 장애 판단 및 복제 노드의 마스터 승격이 이루어 질 수 있도록 해야 한다.

ex) 만약 네트워크의 잠깐의 오버타임때문에 마스터가 죽었다고 생각하는 하나의 Sentinel이 있을 수 있다고 가정할 때, 과반수 이상의 Sentinel이 "OK" 해야 비로소 그 마스터 노드는 죽은 것이고, 그때서야 Slave 노드에서 마스터 노드를 선출하게 된다. 

 

 

2-1. 센티널 설정 파일 구성

기존의 sentinel.conf 파일을 이용하여 구성 파일을 생성한다.

[root@sydev /]# cd /home/redis/redis-stable
[root@sydev redis-stable]# cp sentinel.conf sentinel.conf..org
[root@sydev redis-stable]# vi sentinel.conf

2-1-1. 센티널 프로세스의 리슨-포트를 지정

19 # port <sentinel-port>
20 # The port that this sentinel instance will run on
21 port 11001

 

2-1-2. 센티널이 감시할 마스터 노드의 정보를 입력

82 # Note: master name should not include special characters or spaces.
83 # The valid charset is A-z 0-9 and the three characters ".-_".
84 sentinel monitor mymaster 127.0.0.1 6379 2

sentinel monitor mymaster <redis master host> <redis master port> <quorum>

마지막에 quorum(default: 2)의 의미는 의사결정 및 진행에 필요한 센티널 노드 수를 의미합니다. 

예를 들어, 센티널이 3대일 때 quorum값이 2이라고 가정하면, 

2대 이상의 센티널이 마스터 노드가 죽었다고 판단했을 경우에만 실제로 failover하여 복제 노드를 마스터 노드로 승격시키는 작업을 진행하게 된다.

 

2-1-3. pid 파일과 로그 파일명을 설정

31 pidfile /var/run/redis-sentinel_11001.pid
32 
33 # Specify the log file name. Also the empty string can be used to force
34 # Sentinel to log on the standard output. Note that if you use standard
35 # output for logging but daemonize, logs will be sent to /dev/null
36 logfile /var/log/sentinel_11001.log

 

2-1-4. 마스터 패스워드 설정

센티널이 마스터에 접속할 수 있게 마스터 패스워드를 설정해준다.

86 # sentinel auth-pass <master-name> <password>
87 sentinel auth-pass mymaster foobared
125 # Default is 30 seconds.
126 sentinel down-after-milliseconds mymaster 30000

> 센티널이 마스터 인스턴스와 접속이 끊겼다고 판단하는 timeout 값(디폴트 : 30초))

 

2-1-5. failover 작업시간의 timeover 설정

225 # Default is 3 minutes.
226 sentinel failover-timeout mymaster 180000

 

2-1-6. 마스터로부터 동기화하는 복제노드 개수 설정

200 # time while performing the synchronization with the master.
201 sentinel parallel-syncs mymaster 1

이 값이 너무 크면 마스터에 가해지는 부하도 커진다.

 

 

2-1-7. 설정 파일 복제

[root@sydev redis-stable]# cp sentinel.conf sentinel_11001.conf
[root@sydev redis-stable]# cp sentinel.conf sentinel_11002.conf
[root@sydev redis-stable]# cp sentinel.conf sentinel_11003.conf

설정 파일을 3개 만들고 포트 및 파일명을 수정해준다.

 

 

2-2. 복제(slave)노드 설정 변경

[root@sydev redis-stable]# cd /etc/redis/
vi 6379.conf
vi 6380.conf
vi 6381.conf

masterauth foobared
requirepass foobared

센티널 환경에서는 모든 노드가 마스터가 될 수 있기 때문에 masterauth값과 requirepass값을 가져야 한다.

마스터 장애로 인한 페일오버로 다수결 정책으로 인해 복제노드가 마스터가 될 수 있기 때문.

 

 

2-3. 센티널 기동 

[root@sydev redis-stable]# redis-sentinel /home/redis/redis-stable/sentinel_11001.conf & redis-sentinel /home/redis/redis-stable/sentinel_11002.conf & redis-sentinel /home/redis/redis-stable/sentinel_11003.conf &


기동 후 프로세스 확인

root     23760     1  1 13:24 pts/1    00:00:00 redis-sentinel *:11001 [sentinel]
root     23761     1  1 13:24 pts/1    00:00:00 redis-sentinel *:11002 [sentinel]
root     23762     1  1 13:24 pts/1    00:00:00 redis-sentinel *:11003 [sentinel]

 

2-4. 센티널 기동 정지 및 센티널 접속

[root@sydev redis]# redis-cli -p 11001 shutdown
[root@sydev redis]# redis-cli -p 11002 shutdown
[root@sydev redis]# redis-cli -p 11003 shutdown

센티널 접속은 아래와 같이..

[root@sydev redis]# redis-cli -p 11001
[root@sydev redis]# redis-cli -p 11002
[root@sydev redis]# redis-cli -p 11003

 

2-5. 센티널 정보 확인

[root@sydev redis]# redis-cli -p 11001
127.0.0.1:11001> info
# Server
redis_version:6.2.6
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:9f95da7f14951a9f
redis_mode:sentinel
os:Linux 4.14.35-1818.3.3.el7uek.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
...(생략)

센티널 접속 후 info 명령어로 확인

 

 

3. 센티널 Fail-Over 테스트

# 테스트 시나리오

1) 마스터 Shutdown. Slave1, Slave2 마스터 찾지 못하고 에러 발생

2) down-after-millisecond 설정에 의해 30초 뒤에 센티널에서 투표 진행

3) 과반수 이상 득표한 노드가 새로운 마스터로 승격

4) Slave에서 마스터로 승격한 노드의 역할 확인

5) Shutdown 했던 6379 노드 재기동

 

센티널 & 마스터 & 슬레이브 모두 기동 후 
마스터 기동 중지

###### 6380 로그 ######

23433:S 29 Oct 2021 13:39:00.577 # Connection with master lost.
23433:S 29 Oct 2021 13:39:00.577 * Caching the disconnected master state.
23433:S 29 Oct 2021 13:39:00.577 * Reconnecting to MASTER 127.0.0.1:6379
23433:S 29 Oct 2021 13:39:00.577 * MASTER <-> REPLICA sync started
23433:S 29 Oct 2021 13:39:00.577 # Error condition on socket for SYNC: Connection refused
23433:S 29 Oct 2021 13:39:00.735 * Connecting to MASTER 127.0.0.1:6379
23433:S 29 Oct 2021 13:39:00.735 * MASTER <-> REPLICA sync started
23433:S 29 Oct 2021 13:39:00.735 # Error condition on socket for SYNC: Connection refused
......
(중략))
......

23433:M 29 Oct 2021 13:39:30.998 * Discarding previously cached master state.
23433:M 29 Oct 2021 13:39:30.999 # Setting secondary replication ID to 6ddf5dba5fd205a966ef01f56c5484f66aa99f2e, valid up to offset: 155816. New replication ID is f431e8570dfcb59f87ca5a84b7ca7a05298353cc
23433:M 29 Oct 2021 13:39:31.000 * MASTER MODE enabled (user request from 'id=11 addr=127.0.0.1:34886 laddr=127.0.0.1:6380 fd=9 name=sentinel-483e0b9e-cmd age=531 idle=0 flags=x db=0 sub=0 psub=0 multi=4 qbuf=188 qbuf-free=40766 argv-mem=4 obl=45 oll=0 omem=0 tot-mem=61468 events=r cmd=exec user=default redir=-1')
23433:M 29 Oct 2021 13:39:31.005 # CONFIG REWRITE executed with success.
23433:M 29 Oct 2021 13:39:31.374 * Replica 127.0.0.1:6381 asks for synchronization

=============================================
30초 뒤에 6380 인스턴스가 마스터로 승격 됨.


###### 6381 로그 ######
23443:S 29 Oct 2021 13:39:31.370 * REPLICAOF 127.0.0.1:6380 enabled (user request from 'id=11 addr=127.0.0.1:57470 laddr=127.0.0.1:6381 fd=9 name=sentinel-483e0b9e-cmd age=532 idle=0 flags=x db=0 sub=0 psub=0 multi=4 qbuf=329 qbuf-free=40625 argv-mem=4 obl=45 oll=0 omem=0 tot-mem=61468 events=r cmd=exec user=default redir=-1')
23443:S 29 Oct 2021 13:39:31.373 # CONFIG REWRITE executed with success.

=============================================
6380 마스터에 조인 됨.


이후 6379 인스턴스도 다시 재기동하니, 6380 마스터에 조인 됨을 확인할 수 있었다..
25270:S 29 Oct 2021 13:45:20.995 * REPLICAOF 127.0.0.1:6380 enabled (user request from 'id=3 addr=127.0.0.1:49734 laddr=127.0.0.1:6379 fd=8 name=sentinel-26d07758-cmd age=10 idle=0 flags=x db=0 sub=0 psub=0 multi=4 qbuf=196 qbuf-free=40758 argv-mem=4 obl=45 oll=0 omem=0 tot-mem=61468 events=r cmd=exec user=default redir=-1')



##### 센티널 로그 #####

24173:X 29 Oct 2021 13:39:30.755 # +vote-for-leader 483e0b9e814582550cb99d764a2b7982fec855f2 1
24173:X 29 Oct 2021 13:39:30.757 # 26d07758bc27906ba42e901b62e734a8e11fb313 voted for 26d07758bc27906ba42e901b62e734a8e11fb313 1
24173:X 29 Oct 2021 13:39:30.761 # 577a5516268472d1a8e2e6e9bebd533027410d3d voted for 483e0b9e814582550cb99d764a2b7982fec855f2 1

...
24173:X 29 Oct 2021 13:39:32.405 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380

=============================================
센티널 로그를 보면 투표를 통해 마스터 노드를 다시 뽑는다.

 

이상. 이번 글에서는 레디스 서버의 장애시에 장애복구를 위한 센티널 설정에 대해 알아 보았다.

728x90