본문 바로가기

리눅스

우분투에서 레디스 센티널을 구성하는 방법

반응형

우분투 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 서버의 고가용성을 보장할 수 있습니다.

 

728x90
반응형