화요일, 10월 8, 2024
HomeLinuxRedis Sentinel

Redis Sentinel

Redis Sentinel

Redis는 일반적으로 Master와 Slave로 구성됩니다.
운영중 예기치 않게 마스터가 다운되었다면 Redis담당자가 이를 감지해서 Slave를 Master로 설정하고
클라이언트들이 새로운 Master에 접속할 수 있도록 해주어야 합니다.
Sentinel은 Master와 Slave를 감시하고 있다가 Master가 다운되면 이를 감지해서
자동으로 Slave를 Master설정해 줍니다.

Sentinel 기능은 아래와 같습니다.
모니터링 : Sentinel은 마스터 및 슬레이브 인스턴스가 정상적으로 작동하는지 지속적으로 확인합니다.
알림 : Sentinel은 API를 통해 다른 컴퓨터 프로그램 인 시스템 관리자에게 모니터링되는 Redis 인스턴스 중 하나에 문제가 있음을 알릴 수 있습니다.
자동 장애 조치 : 마스터가 예상대로 작동하지 않는 경우 Sentinel은 슬레이브가 마스터로 승격 된 페일 오버 프로세스를 시작할 수 있으며 다른 추가 슬레이브는 새 마스터를 사용하도록 재구성되며 Redis 서버를 사용하는 애플리케이션은 사용할 때 새 주소를 알려줍니다 연결.
구성 제공자 : Sentinel은 클라이언트 서비스 검색을위한 권한의 원천으로 작용합니다. 클라이언트는 Sentinels에 연결하여 지정된 서비스를 담당하는 현재 Redis 마스터의 주소를 요청합니다. 장애 조치가 발생하면 Sentinels가 새 주소를보고합니다.

기존의 Redis Server 들이 있고, 각각의 Sentinel 서버가 이 4대의 Redis 를 감시합니다.
Sentinel 이 3대인 이유는 문제가 발생하였을때를 대비하기 위함입니다.
그리고 Sentinel 이 FailOver 를 하기 위해서 Redis 를 감시한다고 했는데,
어떤 결함으로 인해 문제가 발생했을때 이것이 Sentinel 자체의 문제일 수 있어서 여러대를 두는 것입니다.
더불어 짝수(2대)가 아니라 홀수(3대)인 이유는 SDown 과 ODown 이라는 개념이 있는데 이때를 위해서 짝수가 아닌 홀수개의 Sentinel 이 좋기 때문입니다.
다수결 원칙으로 5:5 로 투표되면 결론이 나지 않기 때문에 홀수로 둔다고 생각하시면 됩니다.

Redis Sentinel 은 아래와 같이 Master 1대, Slave 3대, Sentinel  3대로 구성합니다.

Master : 10.0.0.201 [port:6379]
Slave #1 : 10.0.0.211 [port:6379]
Slave #2 : 10.0.0.212 [port:6379]
Slave #3 : 10.0.0.213 [port:6379]

Sentinel #1 : 10.0.0.211 [port:26379]
Sentine2 #2 : 10.0.0.212 [port:26379]
Sentine3 #3 : 10.0.0.213 [port:26379]

Sentinel 구성전 Master 1대, Slave 3대의 redis process 가 start 되어있어야 합니다.

1.Sentinel 설정하기

디렉토리(/etc/redis/)에 보면 sentinel.conf 라는 파일이 존재합니다.
sentinel은 conf 파일만 다른 redis 입니다.

대상 서버는 아래와 같습니다.
Sentinel #1 : 10.0.0.211 [port:26379]
Sentine2 #2 : 10.0.0.212 [port:26379]
Sentine3 #3 : 10.0.0.213 [port:26379]

아래와 같이 sentinel config를 구성합니다.

redis 설치 에서 redis-stable.tar.gz 압축해제한 디렉토리로 이동합니다.

cd redis-stable
cp sentinel.conf /etc/redis/sentinel_26379.conf
  • bind 주석 삭제후 Sentinel Server 의 IP 또는 0.0.0.0으로 수정
sed -i 's/# bind 127.0.0.1 192.168.1.1/bind 0.0.0.0/g' /etc/redis/sentinel_26379.conf
  • Sentinel Server port 수정
sed -i 's/port 26379/port 26379/g' /etc/redis/sentinel_26379.conf
  • sentinel 서버를 3대로 구성하였습니다.
    그렇기 때문에 2대의 sentinel 서버에서 master 로 연결을 실패하면 failover 하도록 할 것입니다.
    그러므로 2 를 quorum 값으로 넣었습니다.
    만약 sentinel 서버가 3 대인데, quorum 값을 3보다 큰 값으로 설정하면, 절대로 failover 가 발생하지 않습니다.
sed -i 's/sentinel monitor mymaster 127.0.0.1 6379 2/sentinel monitor mymaster 10.0.0.201 6379 2/g' /etc/redis/sentinel_26379.conf
  • master 및 slave 의 password 를 입력해 줍니다.
sed -i 's/# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd/sentinel auth-pass mymaster password/g' /etc/redis/sentinel_26379.conf
  • 몇 초 동안 master 로의 연결이 실패했을 때,
    SDown 으로 간주할 것인가 입니다. 단위는 밀리세컨드 입니다.
    기본값 30초는 너무 길기에 5 초로 설정하였습니다.
    주의할 것은 데이터가 많아서 failover 가 일어난 뒤에 redis 에서 sync 하는 시간이 길어지면,
    어떤 이유로 설정한 값인 5초가 넘어가 버린다면, 다시한번 failover 가 일어납니다.
    왜냐면 redis 는 single thread 입니다. 그러므로 상황을 보고 설정하시는게 좋습니다.
sed -i 's/sentinel down-after-milliseconds mymaster 30000/sentinel down-after-milliseconds mymaster 5000/g' /etc/redis/sentinel_26379.conf
  • failover 가 발생했을 때, slave 들은 master 로부터 데이터를 받아야(sync) 합니다.
    이때 몇개씩 나누어서 sync 할 것인지에 대한 설정입니다.
    만약 이 값이 3이라면 slave 3개가 동시에 master 로부터 sync 를 시도합니다.
    1개씩 순차적으로 master 와 sync 하라는 의미입니다.
sed -i 's/sentinel parallel-syncs mymaster 1/sentinel parallel-syncs mymaster 1/g' /etc/redis/sentinel_26379.conf
  • failover 의 타임아웃을 몇초로 둘 것인지 입니다. 기본값은 3분입니다. 그러므로 상황을 보고 설정하시는게 좋습니다.
sed -i 's/sentinel failover-timeout mymaster 180000/sentinel failover-timeout mymaster 180000/g' /etc/redis/sentinel_26379.conf
  • 맨 마지막줄에 아래와 같이 데몬으로 실행될 수 있도록 추가 해 줍니다.
echo "daemonize yes" >> /etc/redis/sentinel_26379.conf
echo "pidfile /var/run/sentinel_26379.pid" >> /etc/redis/sentinel_26379.conf
echo "logfile /var/log/sentinel_26379.log" >> /etc/redis/sentinel_26379.conf

2.Redis Master 에서 정보 확인하기

Master : 10.0.0.201

/usr/local/bin/redis-cli -a password
127.0.0.1:6379> info
   ....
   # Replication
   role:master
   connected_slaves:3
   slave0:ip=10.0.0.211,port=6379,state=online,offset=21873,lag=0
   slave1:ip=10.0.0.212,port=6379,state=online,offset=21873,lag=1
   slave2:ip=10.0.0.213,port=6379,state=online,offset=21873,lag=1
   master_replid:bf17ce558a05d7ecf614ebb8077b019134278479
   master_replid2:0000000000000000000000000000000000000000
   master_repl_offset:21873
   second_repl_offset:-1
   repl_backlog_active:1
   repl_backlog_size:1048576
   repl_backlog_first_byte_offset:1
   repl_backlog_histlen:21873
   ....

3.Sentinel 시작하기

Sentinel #1 : 10.0.0.211 [port:26379],Sentine2 #2 : 10.0.0.212 [port:26379],Sentine3 #3 : 10.0.0.213 [port:26379] 3대 모두 아래와 같이 진행합니다.

Sentinel 스크립트가 없기 때문에 redis 스크립트를 복사하여 아래와 같이 수정합니다.

cp /etc/init.d/redis_6379 /etc/init.d/redis-sentinel
#!/bin/sh
   #Configurations injected by install_server below....

   EXEC=/usr/local/bin/redis-sentinel
   CLIEXEC=/usr/local/bin/redis-cli
   PIDFILE=/var/run/sentinel_26379.pid
   CONF="/etc/redis/sentinel_26379.conf"
   REDISPORT="26379"
   ###############
   # SysV Init Information
   # chkconfig: - 58 74
   # description: redis_sentinel is the redis daemon.
   ### BEGIN INIT INFO
   # Provides: redis_sentinel
   # Required-Start: $network $local_fs $remote_fs
   # Required-Stop: $network $local_fs $remote_fs
   # Default-Start: 2 3 4 5
   # Default-Stop: 0 1 6
   # Should-Start: $syslog $named
   # Should-Stop: $syslog $named
   # Short-Description: start and stop redis_sentinel
   # Description: Redis daemon
   ### END INIT INFO


   case "$1" in
      start)
         if [ -f $PIDFILE ]
         then
            echo "$PIDFILE exists, process is already running or crashed"
         else
            echo "Starting Redis Sentinel server..."
            $EXEC $CONF
         fi
         ;;
      stop)
         if [ ! -f $PIDFILE ]
         then
            echo "$PIDFILE does not exist, process is not running"
         else
            PID=$(cat $PIDFILE)
            echo "Stopping ..."
            $CLIEXEC -p $REDISPORT shutdown
            while [ -x /proc/${PID} ]
            do
               echo "Waiting for Redis Sentinel to shutdown ..."
               sleep 1
            done
            echo "Redis Sentinel stopped"
         fi
         ;;
      status)
         PID=$(cat $PIDFILE)
         if [ ! -x /proc/${PID} ]
         then
            echo 'Redis Sentinel is not running'
         else
            echo "Redis Sentinel is running ($PID)"
         fi
         ;;
      restart)
         $0 stop
         $0 start
         ;;
      *)
         echo "Please use start, stop, restart or status as first argument"
         ;;
   esac
  • Redis Sentinel Start 
/etc/init.d/redis-sentinel start
Starting Redis Sentinel server...
  • 서버 재기동후 Sentinel 이 기동 될 수 있도록 Redis Sentinel Service 등록
chkconfig --add redis-sentinel
chkconfig --level 345 redis-sentinel on 
  • service 확인
service redis-sentinel status

4.Redis Sentinel Log 확인

tail -f /var/log/sentinel_26379.log
6589:X 18 Apr 2019 05:34:07.692 # Configuration loaded
6590:X 18 Apr 2019 05:34:07.693 * Increased maximum number of open files to 10032 (it was originally set to 1024).
6590:X 18 Apr 2019 05:34:07.694 * Running mode=sentinel, port=26379.
6590:X 18 Apr 2019 05:34:07.696 # Sentinel ID is 269494ea341ee1a3a538eafa0a2f7d5d7f67008f
6590:X 18 Apr 2019 05:34:07.696 # +monitor master mymaster 10.0.0.201 6379 quorum 2
6590:X 18 Apr 2019 05:34:07.697 * +slave slave 10.0.0.211:6379 10.0.0.211 6379 @ mymaster 10.0.0.201 6379
6590:X 18 Apr 2019 05:34:07.699 * +slave slave 10.0.0.212:6379 10.0.0.212 6379 @ mymaster 10.0.0.201 6379
6590:X 18 Apr 2019 05:34:07.701 * +slave slave 10.0.0.213:6379 10.0.0.213 6379 @ mymaster 10.0.0.201 6379
6590:X 18 Apr 2019 05:34:09.706 * +sentinel sentinel 8604691c5010c8456061f3b5a510242b8fa504e5 10.0.0.213 26379 @ mymaster 10.0.0.201 6379
6590:X 18 Apr 2019 05:34:09.715 * +sentinel sentinel 8568e49fb70bb04fbcafdd048fad79d4e070fc34 10.0.0.212 26379 @ mymaster 10.0.0.201 6379

5.Sentinel 동작 확인

Master redis 에서 확인합니다.

/usr/local/bin/redis-cli -a password
   Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
   127.0.0.1:6379> info replication
   # Replication
   role:master
   connected_slaves:3
   slave0:ip=10.0.0.211,port=6379,state=online,offset=66751,lag=1
   slave1:ip=10.0.0.212,port=6379,state=online,offset=66751,lag=1
   slave2:ip=10.0.0.213,port=6379,state=online,offset=66751,lag=1
   master_replid:bf17ce558a05d7ecf614ebb8077b019134278479
   master_replid2:0000000000000000000000000000000000000000
   master_repl_offset:66751
   second_repl_offset:-1
   repl_backlog_active:1
   repl_backlog_size:1048576
   repl_backlog_first_byte_offset:1
   repl_backlog_histlen:66751
   127.0.0.1:6379> 
  • 먼저 Master 를 종료합니다.
/etc/init.d/redis_6379 stop
   Stopping ...
   Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
   Redis stopped
  • Sentinel 로그확인
tail -f /var/log/sentinel_26379.log
   6484:X 18 Apr 2019 05:34:07.693 # Configuration loaded
   6485:X 18 Apr 2019 05:34:07.694 * Increased maximum number of open files to 10032 (it was originally set to 1024).
   6485:X 18 Apr 2019 05:34:07.694 * Running mode=sentinel, port=26379.
   6485:X 18 Apr 2019 05:34:07.697 # Sentinel ID is 8604691c5010c8456061f3b5a510242b8fa504e5
   6485:X 18 Apr 2019 05:34:07.697 # +monitor master mymaster 10.0.0.201 6379 quorum 2
   6485:X 18 Apr 2019 05:34:07.698 * +slave slave 10.0.0.211:6379 10.0.0.211 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:34:07.700 * +slave slave 10.0.0.212:6379 10.0.0.212 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:34:07.702 * +slave slave 10.0.0.213:6379 10.0.0.213 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:34:09.715 * +sentinel sentinel 8568e49fb70bb04fbcafdd048fad79d4e070fc34 10.0.0.212 26379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:34:09.733 * +sentinel sentinel 269494ea341ee1a3a538eafa0a2f7d5d7f67008f 10.0.0.211 26379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:33.137 # +sdown master mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:33.208 # +odown master mymaster 10.0.0.201 6379 #quorum 2/2
   6485:X 18 Apr 2019 05:38:33.208 # +new-epoch 1
   6485:X 18 Apr 2019 05:38:33.208 # +try-failover master mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:33.210 # +vote-for-leader 8604691c5010c8456061f3b5a510242b8fa504e5 1
   6485:X 18 Apr 2019 05:38:33.214 # 269494ea341ee1a3a538eafa0a2f7d5d7f67008f voted for 8604691c5010c8456061f3b5a510242b8fa504e5 1
   6485:X 18 Apr 2019 05:38:33.215 # 8568e49fb70bb04fbcafdd048fad79d4e070fc34 voted for 8604691c5010c8456061f3b5a510242b8fa504e5 1
   6485:X 18 Apr 2019 05:38:33.311 # +elected-leader master mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:33.311 # +failover-state-select-slave master mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:33.382 # +selected-slave slave 10.0.0.212:6379 10.0.0.212 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:33.382 * +failover-state-send-slaveof-noone slave 10.0.0.212:6379 10.0.0.212 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:33.473 * +failover-state-wait-promotion slave 10.0.0.212:6379 10.0.0.212 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:33.977 # +promoted-slave slave 10.0.0.212:6379 10.0.0.212 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:33.977 # +failover-state-reconf-slaves master mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:34.037 * +slave-reconf-sent slave 10.0.0.213:6379 10.0.0.213 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:34.352 # -odown master mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:34.976 * +slave-reconf-inprog slave 10.0.0.213:6379 10.0.0.213 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:35.990 * +slave-reconf-done slave 10.0.0.213:6379 10.0.0.213 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:36.080 * +slave-reconf-sent slave 10.0.0.211:6379 10.0.0.211 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:36.364 * +slave-reconf-inprog slave 10.0.0.211:6379 10.0.0.211 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:37.392 * +slave-reconf-done slave 10.0.0.211:6379 10.0.0.211 6379 @ mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:37.493 # +failover-end master mymaster 10.0.0.201 6379
   6485:X 18 Apr 2019 05:38:37.493 # +switch-master mymaster 10.0.0.201 6379 10.0.0.212 6379
   6485:X 18 Apr 2019 05:38:37.493 * +slave slave 10.0.0.213:6379 10.0.0.213 6379 @ mymaster 10.0.0.212 6379
   6485:X 18 Apr 2019 05:38:37.493 * +slave slave 10.0.0.211:6379 10.0.0.211 6379 @ mymaster 10.0.0.212 6379
   6485:X 18 Apr 2019 05:38:37.493 * +slave slave 10.0.0.201:6379 10.0.0.201 6379 @ mymaster 10.0.0.212 6379
   6485:X 18 Apr 2019 05:38:42.540 # +sdown slave 10.0.0.201:6379 10.0.0.201 6379 @ mymaster 10.0.0.212 6379

6485:X 18 Apr 2019 05:38:37.493 # +switch-master mymaster 10.0.0.201 6379 10.0.0.212 6379 부분과 같이 master가 변경되었습니다.

  • Stop 한 Master [10.0.0.201] start 후 로그확인
/etc/init.d/redis_6379 start
  • Master로 승격된 10.0.0.212 Sentinel 로그 확인
tail -f /var/log/sentinel_26379.log
   6434:X 18 Apr 2019 05:34:07.692 # Configuration loaded
   6435:X 18 Apr 2019 05:34:07.693 * Increased maximum number of open files to 10032 (it was originally set to 1024).
   6435:X 18 Apr 2019 05:34:07.693 * Running mode=sentinel, port=26379.
   6435:X 18 Apr 2019 05:34:07.696 # Sentinel ID is 8568e49fb70bb04fbcafdd048fad79d4e070fc34
   6435:X 18 Apr 2019 05:34:07.696 # +monitor master mymaster 10.0.0.201 6379 quorum 2
   6435:X 18 Apr 2019 05:34:07.697 * +slave slave 10.0.0.211:6379 10.0.0.211 6379 @ mymaster 10.0.0.201 6379
   6435:X 18 Apr 2019 05:34:07.699 * +slave slave 10.0.0.212:6379 10.0.0.212 6379 @ mymaster 10.0.0.201 6379
   6435:X 18 Apr 2019 05:34:07.701 * +slave slave 10.0.0.213:6379 10.0.0.213 6379 @ mymaster 10.0.0.201 6379
   6435:X 18 Apr 2019 05:34:09.705 * +sentinel sentinel 8604691c5010c8456061f3b5a510242b8fa504e5 10.0.0.213 26379 @ mymaster 10.0.0.201 6379
   6435:X 18 Apr 2019 05:34:09.733 * +sentinel sentinel 269494ea341ee1a3a538eafa0a2f7d5d7f67008f 10.0.0.211 26379 @ mymaster 10.0.0.201 6379
   6435:X 18 Apr 2019 05:38:33.157 # +sdown master mymaster 10.0.0.201 6379
   6435:X 18 Apr 2019 05:38:33.213 # +new-epoch 1
   6435:X 18 Apr 2019 05:38:33.215 # +vote-for-leader 8604691c5010c8456061f3b5a510242b8fa504e5 1
   6435:X 18 Apr 2019 05:38:33.215 # +odown master mymaster 10.0.0.201 6379 #quorum 3/2
   6435:X 18 Apr 2019 05:38:33.215 # Next failover delay: I will not start a failover before Thu Apr 18 05:44:33 2019
   6435:X 18 Apr 2019 05:38:34.037 # +config-update-from sentinel 8604691c5010c8456061f3b5a510242b8fa504e5 10.0.0.213 26379 @ mymaster 10.0.0.201 6379
   6435:X 18 Apr 2019 05:38:34.037 # +switch-master mymaster 10.0.0.201 6379 10.0.0.212 6379
   6435:X 18 Apr 2019 05:38:34.037 * +slave slave 10.0.0.213:6379 10.0.0.213 6379 @ mymaster 10.0.0.212 6379
   6435:X 18 Apr 2019 05:38:34.037 * +slave slave 10.0.0.211:6379 10.0.0.211 6379 @ mymaster 10.0.0.212 6379
   6435:X 18 Apr 2019 05:38:34.037 * +slave slave 10.0.0.201:6379 10.0.0.201 6379 @ mymaster 10.0.0.212 6379
   6435:X 18 Apr 2019 05:38:39.066 # +sdown slave 10.0.0.201:6379 10.0.0.201 6379 @ mymaster 10.0.0.212 6379
   6435:X 18 Apr 2019 05:40:44.490 # -sdown slave 10.0.0.201:6379 10.0.0.201 6379 @ mymaster 10.0.0.212 6379
   6435:X 18 Apr 2019 05:40:54.484 * +convert-to-slave slave 10.0.0.201:6379 10.0.0.201 6379 @ mymaster 10.0.0.212 6379

6435:X 18 Apr 2019 05:40:54.484 * +convert-to-slave slave 10.0.0.201:6379 10.0.0.201 6379 @ mymaster 10.0.0.212

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular