센티넬이란? (Sentinel)
- 운영환경에서 일반적으로 구성되는 마스터/슬레이브 구조에서 예기치 않게 마스터가 다운되었을 때 관리자의 개입없이 자동으로 failover
- 센티널은 레디스 마스터, 슬레이브들을 제대로 동작하는지 지속적으로 감시한다.
- 슬레이브가 여러 대 존재 할 경우 승격된 새로운 마스터로 부터 데이터를 받을수 있도록 재구성 한다.
- 다운된 마스터가 재시작 되었을 경우, 슬레이브로 전환되어 새로운 마스터를 바라볼 수 있도록 한다.
- 레디스 인스턴스들에 예기치 않은 문제 발생 및 자동승격처리 등을 API를 통해서 관리자나 다른 프로그램에 알림기능 제공
준비
- version : redis 2.8.13 (설치 시 2.6 이상부터 sentinel 자동설치 됨)
- port : master(6380), slave(6381), sentinel(5000)
- 한개의 서버에 3개의 인스턴스를 올려 테스트 하므로 포트로 인스턴스를 구분하여 명시함
- 테스트 환경에서는 sentinel을 1대로 했기 때문에 quorum을 1로 설정함
설정(configuration)
- master : 센티널을 위한 설정사항은 없음
- slave : 센티널을 위한 설정사항은 없음. master와 복제 구성 필요 (redis replication)
- sentinel : 설정파일을 아래와 같이 수정
$ vi sentinel.conf
# 센티널 인스턴스 포트
# port <sentinel-port>
port 5000
# 센티널에서 모니터링 할 master IP PORT QUORUM
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 1
# master down을 인지한 후 몇 초 후에 failover 시킬지
# Default is 30 seconds (30000 millisec)
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 3000
# 기타 conf 옵션들
# sentinel auth-pass <master-name> <password>
# sentinel parallel-syncs <master-name> <numslaves>
# sentinel failover-timeout <master-name> <milliseconds>
시작
1. 마스터와 슬레이브가 구동중인 상태에서 센티널 시작
- 현재 마스터 6380 슬레이브 6381
$ service redis_5000 start
Starting Redis server...
[16725] 26 Feb 16:04:15.165 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 2.8.13 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 5000
| `-._ `._ / _.-' | PID: 16725
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
[16725] 26 Feb 16:04:15.167 # Sentinel runid is afc9e388124484af6e93618970f5725fcf213895
[16725] 26 Feb 16:04:15.167 # +monitor master mymaster 192.168.137.51 6380 quorum 1
[16725] 26 Feb 16:04:15.168 * +slave slave 192.168.137.51:6381 192.168.137.51 6381 @ mymaster 192.168.137.51 6380
2. 센티널 클라이언트를 사용하여 현재 master 확인
- 센티널 클라이언트는 레디스 클라이언트와 동일하므로, 포트를 지정하여 접속
- sentinel get-master-addr-by-name mymaster : 현재 마스터 정보 조회
# 센티넬 클라이언트에서 현재 master 정보 확인
$ redis-cli -p 5000 sentinel get-master-addr-by-name mymaster
1) "192.168.137.51"
2) "6380"
3. 장애 master(6380) -> slave(6381)
- 레디스 마스터(6380)를 중지시키면 센티널이 슬레이브(6381)를 마스터로 승격시키는지 확인
- sentinel down-after-milliseconds에 설정된 값 이후에 failover 작업이 실행되는지 확인
- 마스터(6380) 장애 발생시 센티넬 메세지
[17156] 26 Feb 17:12:59.203 # +sdown master mymaster 192.168.137.51 6380
[17156] 26 Feb 17:12:59.203 # +odown master mymaster 192.168.137.51 6380 #quorum 1/1
[17156] 26 Feb 17:12:59.203 # +new-epoch 3
[17156] 26 Feb 17:12:59.204 # +try-failover master mymaster 192.168.137.51 6380
[17156] 26 Feb 17:12:59.271 # +vote-for-leader af80458686f56b275344f087e32e1a4921972a43 3
[17156] 26 Feb 17:12:59.271 # +elected-leader master mymaster 192.168.137.51 6380
[17156] 26 Feb 17:12:59.271 # +failover-state-select-slave master mymaster 192.168.137.51 6380
[17156] 26 Feb 17:12:59.343 # +selected-slave slave 192.168.137.51:6381 192.168.137.51 6381 @ mymaster 192.168.137.51 6380
[17156] 26 Feb 17:12:59.343 * +failover-state-send-slaveof-noone slave 192.168.137.51:6381 192.168.137.51 6381 @ mymaster 192.168.137.51 6380
[17156] 26 Feb 17:12:59.401 * +failover-state-wait-promotion slave 192.168.137.51:6381 192.168.137.51 6381 @ mymaster 192.168.137.51 6380
[17156] 26 Feb 17:13:00.397 # +promoted-slave slave 192.168.137.51:6381 192.168.137.51 6381 @ mymaster 192.168.137.51 6380
[17156] 26 Feb 17:13:00.397 # +failover-state-reconf-slaves master mymaster 192.168.137.51 6380
[17156] 26 Feb 17:13:00.398 # +failover-end master mymaster 192.168.137.51 6380
[17156] 26 Feb 17:13:00.398 # +switch-master mymaster 192.168.137.51 6380 192.168.137.51 6381
[17156] 26 Feb 17:13:00.398 * +slave slave 192.168.137.51:6380 192.168.137.51 6380 @ mymaster 192.168.137.51 6381
[17156] 26 Feb 17:13:03.442 # +sdown slave 192.168.137.51:6380 192.168.137.51 6380 @ mymaster 192.168.137.51 6381
- 센티널 sentinel.conf 파일을 열어보면 master 정보가 변경되어 있음.
$ vi sentinel.conf
sentinel monitor mymaster 192.168.137.51 6381 1
- but, master로 승격된 6381 conf 파일의 slaveof 데이터를 삭제하기 때문에 장애 발생 후 대응시 체크 필수!
전) $ vi 6380.conf
################################# REPLICATION #################################
# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. Note that the configuration is local to the slave
# so for example it is possible to configure the slave to save the DB with a
# different interval, or to listen to another port, and so on.
#
# slaveof <masterip> <masterport>
slaveof 192.168.137.51 6380
후) $ vi 6380.conf
################################# REPLICATION #################################
# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. Note that the configuration is local to the slave
# so for example it is possible to configure the slave to save the DB with a
# different interval, or to listen to another port, and so on.
#
# slaveof <masterip> <masterport>
# 참고
- SDOWN : Subjectively down(주관적 다운)이라고 합니다. 이는 센티널에서 주기적으로 마스터에 보내는 PING과 INFO 명령의 응답이 3초(down-after-milliseconds 에서 설정한 값) 동안 오지 않으면 주관적 다운으로 인지합니다. 이는 센티널 한대에서만 판단한 것입니다. 주관적 다운만으로는 Failover를 진행하지 않습니다.
- ODOWN : Objectively down(객관적 다운)이라고 합니다. 이는 설정한 quorum 이상의 센티널에서 해당 마스터가 다운되었다고 인지하면 객관적 다운으로 인정하고 Failover를 진행합니다. 중간에 slaveof-noone 메시지가 현재 슬레이브인 6383 서버에 slaveof no one 명령을 실행시켜 마스터로 승격시키는것을 나타냅니다.
- switch-master : 해당 서버가 마스터로 승격이 완료되었음을 나타냅니다.
4. 센티널 클라이언트를 사용하여 현재 master 확인
- 마스터가 6380 에서 6381 로 변경됨
$ redis-cli -p 5000 sentinel get-master-addr-by-name mymaster
1) "192.168.137.51"
2) "6381"
5. 다운되어 있는 6380 인스턴스 재시작
- 다운되어 있던 6380 을 slave로 전환하여 복제 구성함.
[17156] 26 Feb 17:28:28.941 # -sdown slave 192.168.137.51:6380 192.168.137.51 6380 @ mymaster 192.168.137.51 6381
[17156] 26 Feb 17:28:38.927 * +convert-to-slave slave 192.168.137.51:6380 192.168.137.51 6380 @ mymaster 192.168.137.51 6381
댓글