우분투 22.04에서 레디스 센티널(Redis Sentinel)을 구성하는 방법
레디스(Redis)는 오픈 소스 인 메모리 데이터 스토어입니다. 레디스는 단일 노드에서 실행될 수도 있지만 이러한 구성은 고 가용성 및 확장성에 대한 요구를 충족하지 못할 수 있습니다. 이를 해결하기 위해 레디스 센티널(Redis Sentinel)을 사용할 수 있습니다. 레디스 센티널은 레디스의 고 가용성 및 확장성을 제공하는 분산 시스템입니다. 이를 통해 레디스의 여러 노드를 모니터링하고 장애가 발생했을 때 자동으로 재구성할 수 있습니다.
테스트 환경
호스트 이름 | 아이피 주소 | 패키지 | 비고 |
node1 | 192.168.10.111 | redis-server, redis-sentinel | |
node2 | 192.168.10.112 | redis-server, redis-sentinel | |
node3 | 192.168.10.113 | redis-server, redis-sentinel |
1. 레디스 패키지 설치
레디스를 설치합니다.
sudo apt update
sudo apt install -y redis-server
redis-server --version
2. 레디스 구성 파일 수정
레디스 구성 파일(redis.conf)을 수정합니다.
- bind <노드 IP 주소>
- port <레디스 포트>
- daemonize yes
- pidfile <pid 파일 경로>
- logfile <로그 파일 경로>
- dir <데이터 디렉터리 경로>
- requirepass <레디스 암호>
node1 마스터 설정
sudo tee /etc/redis/redis.conf <<EOF
bind 0.0.0.0
port 6379
protected-mode no
daemonize yes
loglevel notice
logfile /var/log/redis/redis-server.log
dir /var/lib/redis
maxmemory-policy allkeys-lru
EOF
node2, node3 슬레이브 설정
sudo tee /etc/redis/redis.conf <<EOF
bind 0.0.0.0
port 6379
protected-mode no
daemonize yes
loglevel notice
logfile /var/log/redis/redis-server.log
dir /var/lib/redis
maxmemory-policy allkeys-lru
slaveof 192.168.10.111 6379
EOF
3. 레디스 센티널 설치
레디스 센티널을 설치합니다.
sudo apt update
sudo apt install -y redis-sentinel
redis-sentinel --version
4. 레디스 센티널 구성 파일 수정
레디스 센티널 구성 파일(sentinel.conf)을 수정합니다.
- sentinel monitor <마스터 노드 이름> <마스터 노드 IP 주소> <마스터 노드 포트> <투표 수>
- sentinel down-after-milliseconds <마스터 노드 이름> <장애 감지 시간>
- sentinel failover-timeout <마스터 노드 이름> <재설정 시간>
node1, node2, node3
sudo tee /etc/redis/sentinel.conf <<EOF
bind 0.0.0.0
port 26379
daemonize yes
pidfile "/var/run/sentinel/redis-sentinel.pid"
logfile "/var/log/redis/redis-sentinel.log"
dir "/var/lib/redis"
sentinel monitor mymaster 192.168.10.111 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 10000
sentinel parallel-syncs mymaster 1
EOF
sudo chown redis:redis /etc/redis/sentinel.conf
5. 레디스 및 센티널 서비스 시작
레디스 서비스를 활성화하고 시작
sudo systemctl --now enable redis-server
센티널 서비스를 활성화하고 시작
sudo systemctl --now enable redis-sentinel
레디스 서비스 시작/재시작/중지/상태
sudo systemctl start redis-server
sudo systemctl restart redis-server
sudo systemctl stop redis-server
sudo systemctl status redis-server
센티널 서비스 시작/재시작/중지/상태
sudo systemctl start redis-sentinel
sudo systemctl restart redis-sentinel
sudo systemctl stop redis-sentinel
sudo systemctl status redis-sentinel
레디스 및 센티널 상태 확인
레디스 상태 확인
redis-cli ping
redis-cli -h 192.168.10.111 info replication
redis-cli -h 192.168.10.112 info replication
redis-cli -h 192.168.10.113 info replication
---
Master Replication
redis-cli -h 192.168.10.111 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.10.113,port=6379,state=online,offset=53821,lag=0
slave1:ip=192.168.10.112,port=6379,state=online,offset=53392,lag=1
master_replid:d6a75b43e0bb6fbcba8881e876fe7e5dafb0f999
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:53821
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:53821
Slave(Replica) Replication
redis-cli -h 192.168.10.112 info replication
# Replication
role:slave
master_host:192.168.10.111
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:68934
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:d6a75b43e0bb6fbcba8881e876fe7e5dafb0f999
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:68934
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:68934
---
센티널 상태 확인
redis-cli -p 26379 sentinel master mymaster
redis-cli -p 26379 sentinel slaves mymaster
---
redis-cli -p 26379 sentinel master mymaster
1) "name"
2) "mymaster"
3) "ip"
4) "192.168.10.111"
5) "port"
6) "6379"
7) "runid"
8) "f7ea64c5f9fd7212203722ef67aa88f83547c48c"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "706"
19) "last-ping-reply"
20) "706"
21) "down-after-milliseconds"
22) "5000"
23) "info-refresh"
24) "7075"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "549496"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "2"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "10000"
39) "parallel-syncs"
40) "1"
redis-cli -p 26379 sentinel slaves mymaster
1) 1) "name"
2) "192.168.10.112:6379"
3) "ip"
4) "192.168.10.112"
5) "port"
6) "6379"
7) "runid"
8) "0c25cc5f27da6380566a9870155a3312a6140eda"
9) "flags"
10) "slave"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "137"
19) "last-ping-reply"
20) "137"
21) "down-after-milliseconds"
22) "5000"
23) "info-refresh"
24) "3865"
25) "role-reported"
26) "slave"
27) "role-reported-time"
28) "566161"
29) "master-link-down-time"
30) "0"
31) "master-link-status"
32) "ok"
33) "master-host"
34) "192.168.10.111"
35) "master-port"
36) "6379"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "119006"
2) 1) "name"
2) "192.168.10.113:6379"
3) "ip"
4) "192.168.10.113"
5) "port"
6) "6379"
7) "runid"
8) "053306fa6fb44b884d09a56ee85004b437dad80c"
9) "flags"
10) "slave"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "433"
19) "last-ping-reply"
20) "433"
21) "down-after-milliseconds"
22) "5000"
23) "info-refresh"
24) "3865"
25) "role-reported"
26) "slave"
27) "role-reported-time"
28) "566167"
29) "master-link-down-time"
30) "0"
31) "master-link-status"
32) "ok"
33) "master-host"
34) "192.168.10.111"
35) "master-port"
36) "6379"
37) "slave-priority"
38) "100"
39) "slave-repl-offset"
40) "119006"
---
7. Sentinel 모니터링
각 Sentinel 인스턴스는 마스터 Redis 서버의 선출과 장애 조치를 위해 다른 Sentinel 인스턴스와 통신합니다. 이를 위해서는 각 Sentinel 인스턴스가 다른 Sentinel 인스턴스를 알고 있어야 합니다.
각 Sentinel 인스턴스를 구성 파일을 통해 다른 Sentinel 인스턴스에 대한 정보를 입력해줍니다. 예를 들어, sentinel.conf 파일에는 아래와 같이 다른 Sentinel 인스턴스 정보가 있을 수 있습니다.
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
sentinel monitor resque 127.0.0.1 6379 2
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
위 구성 파일에서는 mymaster와 resque 두 개의 Redis 인스턴스를 모니터링하고 있습니다. 이때, sentinel monitor 명령어를 통해 마스터 Redis 서버의 정보를 입력하며 down-after-milliseconds, failover-timeout, parallel-syncs 등의 속성을 설정할 수 있습니다.
8. 장애 조치 테스트
Redis Sentinel 구성이 완료되면 마스터 Redis 서버의 장애 조치 기능을 테스트해 볼 수 있습니다. 이를 위해 마스터 Redis 서버의 프로세스를 중지시켜 봅니다.
Redis Sentinel은 마스터 Redis 서버의 상태를 감시하다가 마스터 Redis 서버가 다운되면 슬레이브 Redis 서버 중 하나를 새로운 마스터 Redis 서버로 선출합니다.
결론
이렇게 Redis Sentinel을 이용해 레디스 센티널 구성을 완료할 수 있습니다. Redis Sentinel을 이용하면 Redis 인스턴스를 더욱 안정적으로 운영할 수 있으며 Redis 서버의 고가용성을 보장할 수 있습니다.
'리눅스' 카테고리의 다른 글
도커 컨테이너로 레디스 센티널(Redis Sentinel)을 구성하는 방법 (0) | 2023.03.03 |
---|---|
ip 명령어 (0) | 2023.03.03 |
Redis 스탠드얼론(Standalone), 센티널(Sentinel), 클러스터(Cluster) 구성 방법 (0) | 2023.03.03 |
PHP-FPM 풀 설정을 구성하는 방법 (0) | 2023.03.02 |
Let's Encrypt SSL 인증서를 DNS(Domain Name System) 방식으로 발급하는 방법 (0) | 2023.03.01 |