본문 바로가기
redis

Redis Sentinel

by #moonyz 2016. 2. 26.

센티넬이란? (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




댓글