Redis는 standalone으로 설치 외에, Sentinel을 활용하여, HA(High Availability - 고가용성) 구성을 할 수 있다.
HA 구성
1. Redis Replication으로 데이터 이중화(Master/Slave 형식)
2. Sentinel로 failover 조치 (자동으로 Master Redis 장애 시 Slave가 Master로 승격되도록 한다.)
Sentinel은 failover를 위해 과반수 이상 투표 필요로 최소 3개의 Sentinel 프로세스가 필요하다.
Redis를 설치한 3대의 서버에, 각각 Sentinel 프로스세스를 띄웠다. rpm으로 직접 설치한 내역을 기재한다.
우선, jemelloc, redis를 설치한 이후에 구성에 대해 작성한다(지난번 Redis 설치 (standalone) 포스팅 참조)
Redis/Sentinel 구성(편의상 1번, 2번, 3번 서버 지칭)
Redis Sentinel 구성 | 1번 서버 | 2번 서버 | 3번 서버 |
Redis Port | 6379 | 6379 | 6379 |
Sentinel Port | 26379 | 26379 | 26379 |
Redis Master/Slave | Master | Slave | Slave |
Redis M/S failover(예시) | Master 장애 발생 | Slave -> Master | Slave |
디렉터리 생성 (3대 서버 동일 생성 - /REDIS/redis, /REDIS/sentinel 각각 디렉터리를 생성)
$ mkdir -p /REDIS/redis
$ mkdir -p /REDIS/sentinel
설정파일 구성
1번 서버 (Master) redis.conf
$ cat <<EOF > /REDIS/redis.conf
bind 0.0.0.0
port 6379
daemonize yes
pidfile "/REDIS/redis.pid"
dir "/REDIS/redis"
loglevel verbose
logfile "redis.log"
databases 4
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
maxmemory 2g
maxmemory-policy volatile-ttl
#for HA
masterauth "test123"
requirepass "test123"
EOF
2,3번 서버 (Slave) redis.conf (Master redis.conf 와 동일, Slave 서버에는 추가 설정만 기재)
$ cat <<EOF > /REDIS/redis.conf
Master redis.conf 와 동일
#Only Add Replica Node
replicaof Master Server IP 6379
EOF
1번, 2번, 3번 sentinel.conf (1번 서버 IP 기재)
$ cat <<EOF > /data/REDIS/sentinel.conf
port 26379
dir "/REDIS/sentinel"
loglevel verbose
logfile "sentinel.log"
pidfile "/REDIS/sentinel.pid"
daemonize yes
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster Master Server IP 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
sentinel auth-pass mymaster test123
sentinel config-epoch mymaster 1
sentinel leader-epoch mymaster 1
EOF
Sentinel 옵션
deny-scripts-reconfig yes : default 값 yes - 실행 중에 변경할 수 없도록 설정
down-after-milliseconds <master-name> <milliseconds> : default 값 30초(30000) - 마스터 실패 감지 (5초로 설정)
failover-timeout <master-name> <milliseconds>: default 값 3분(180000) - 장애조치가 설정한 시간이 지나도 완료되지 않으면 취소하는 시간 (1분으로 설정)
parallel-syncs <master-name> <numreplicas> : default 값 1 - 장애조치 단계 관련 새 마스터로부터 데이터를 받는데, 한 번에 하나의 복제노드 처리 (여러 슬레이브가 새 마스터로부터 Full resync 방지)
Sentinel 옵션 참조 : http://redisgate.jp/redis/sentinel/sentinel_conf_han.php
Redis, Sentinel 실행
$ redis-server /REDIS/redis.conf
$ redis-sentinel /REDIS/sentinel.conf
Redis, Sentinel 종료
$ pkill -F /REDIS/redis.pid
$ pkill -F /REDIS/sentinel.pid
Sentinel 접속 및 상태 조회 (sentinel port 접속)
$ redis-cli -p 26379
> info sentinel
Redis replication 테스트 (redis.conf에 패스워드 설정으로 Redis 접속 시 -a 옵션 후 패스워드 기재)
--1번 서버 redis 접속
$ redis-cli -a 'test123'
127.0.0.1:6379> set replica ok
OK
--2번 서버 redis 접속
127.0.0.1:6379> get replica
"ok"
Redis HA 테스트(Sentinel 접속)
--2번 서버 접속(Master 조회)
$ redis-cli -p 26379
> SENTINEL get-master-addr-by-name mymaster
127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
1) "Master 서버 IP 출력(1번 서버)"
2) "6379"
--1번 서버 접속(Master Redis 30초간 중지)
$ redis-cli -p 6379 -a 'test123' DEBUG sleep 30
--2번 서버 (Master 조회 - 몇 초 이후 Master 서버가 변경된다.)
> SENTINEL get-master-addr-by-name mymaster
127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
1) "Master 서버 IP 출력(1번 서버 IP)"
2) "6379"
127.0.0.1:26379> SENTINEL get-master-addr-by-name mymaster
1) "Master 서버 IP 출력(2번 서버 IP)"
2) "6379"
참고로 처음 설정한 redis.conf, sentinel.conf 파일은 Redis, Sentinel 기동 후 설정 파일에 '# Generated by CONFIG REWRITE' 항목으로 몇 가지가 더 쓰인다.
특히 sentinel.conf 에는 sentinel known-replica mymaster IP 6379라는 항목이 추가된다.
감사합니다.