시냅스

Redis 설치부터 Cluster 구성까지 본문

데이터베이스/Redis

Redis 설치부터 Cluster 구성까지

ted k 2024. 1. 17. 23:14

이 글에서는 Cent OS 를 기준으로 Redis 설치부터 Redis Cluster 구성까지 살펴봅니다.
실제로 운영하며 겪었던 TroubleShooting 및 중요사항에 대해 설명합니다.

Redis 설치

  • 공식 release 링크
    • 위 링크를 통해 원하는 버전의 redis 를 download 받습니다.
    • wget http://download.redis.io/releases/redis-{version}.tar.gz
    • 다운로드 받은 tar 를 해제한 후 해당 폴더 내부에서 make 를 실행합니다.
      • 이때 필요한 package 는 make, pkg-config, gcc 입니다.
      • 우선 같은 폴더의 deps 로 들어간 뒤 make hdr_histogram hiredis jemalloc linenoise lua 를 실행하여 컴파일합니다.
      • make distclean 이후 make 를 해주면 정상적으로 작동 가능합니다.
    • 같은 위치에서 make install 을 실행합니다.
    • redis-cli, redis-server 명령어를 실행하며 테스트합니다.
      • 만약 전역으로 명령어가 실행되지 않는다면 같은 위치에서 sudo cp src/redis-cli /usr/bin 을 실행합니다.

 

Redis Cluster 구성

redis 설정 파일
  # 설정을 위한 주요 옵션...
  bind 0.0.0.0
  port 7000
  pidfile /var/run/redis_7000.pid
  logfile "/home/redis/redis_7000/logs/redis.log"
  dir /home/redis/redis_7000/data
  cluster-enabled yes
  cluster-config-file /home/redis/redis_7000/nodes-7000.conf
  # ...
  • clustering 설정에 주요한 옵션은 위와 같습니다.
    • 현재 관리를 위한 dir 를 /home/redis/redis_{PORT} 로 설정하고, log, config-file, data 를 설정합니다.
      • 위에서 설정한 모든 dir 는 사전에 생성되어 있어야 합니다.
    • redis-cluster 는 비교적 설정이 간단하여 scale-out 에 유리합니다.
  • 이후 redis-server 명령어를 통해 방금 만든 설정파일을 사용하여 각 node 들을 실행해줍니다.
    • redis-server redis_{PORT}.conf
    • 실행이 완료되었다면 redis-cli 를 사용하여 접속해봅니다.
    • redis-cli -h {HOST} -p {PORT}
    • 정상적으로 기동되었다면 log file 에서 Running in cluster mode 문구를 발견하실 수 있습니다.
  • clustering 구성은 총 6대로 계획하였고, HA 구성을 위해 각 master-slave node 는 physical 위치를 다르게 구성하였습니다.
    • 172.31.0.49 (HA-1)
      • 7000 -> master
      • 7001 -> HA-2 slave
    • 172.31.10.85 (HA-2)
      • 7000 -> master
      • 7001 -> HA-3 slave
    • 172.31.10.90 (HA-3)
      • 7000 -> master
      • 7001 -> HA-1 slave
    • 참고
      • redis cluster 는 cluster bus 로 1 + 사용하는 포트 의 포트를 사용합니다.
        • cluster bus 는 장애 감지, 구성 업데이트, failover 승인 등에 사용됩니다.
      • 위에서 설정한대로, 17000, 17001, 7000, 7001 을 방화벽 해제해주어야 통신이 가능합니다.
  • 위에서는 단순히 node 들을 실행만 하였으므로 clustering 설정을 위해 아래와 같은 절차를 따릅니다.
    • master 를 먼저 설정해줍니다.
      • redis-cli --cluster create 172.31.0.49:7000 172.31.10.85:7000 172.31.10.90:7000
      • 이 명령어는 한 군데에서만 실행해도 됩니다.
    • 이후 위에서 설계한대로 slave 를 설정해줍니다.
      • redis-cli --cluster add-node 172.31.0.49:7001 172.31.10.85:7000 --cluster-slave
      • redis-cli --cluster add-node 172.31.10.85:7001 172.31.10.90:7000 --cluster-slave
      • redis-cli --cluster add-node 172.31.10.90:7001 172.31.0.49:7000 --cluster-slave
    • 설정이 정상적으로 끝났다면 redis dir 에 들어가서 nodes-7000.conf 를 확인합니다.
      • 위 설정파일은 redis 에서 자동으로 만들어주는 파일로, cluster 구성에 대해 보여줍니다.
      • 임의로 작성/수정해서는 안됩니다.
      • redis-cli -h {HOST} -p {PORT} cluster nodes 로도 cluster 구성을 확인할 수 있습니다.

 

Redis Cluster 실행

  • Redis Cluster 의 실행은 위에서 살펴봤듯, 모든 Node 를 실행시킨 뒤 clustering 설정을 통해 합니다.

 

Redis Cluster 중지

  • Redis Cluster 의 중지는 redis-cli -h ${HOST} -p ${PORT} shutdown 명령어는 통해 합니다.
    • 이 때 down 된 node 가 master 라면 slave 로 설정한 node 가 master 로 failover 되는지 확인이 필요합니다.
    • failover 는 config file 에 정의한 cluster-node-time-out 시간이 지나면 수행합니다.
    • failover 가 되었다면 중지된 master 대신 slave 가 master 의 역할을 대신하게 됩니다.
    • slave 가 down 되었다면 master에 영향 없이 slave 로 보내던 Replication 을 멈춥니다.

 

Redis Cluster 재기동

  • redis-server /{REDIS_CONF_DIR}/redis_{PORT}.conf 로 실행합니다.
    • 만약 master-slave 구조를 맞추고 싶다면, 각 서버의 master 를 먼저 wake up 한 뒤 slave 를 순차적으로 up 시킵니다.
      • 이렇게하면 자연스럽게 master - slave 구조를 맞출 수 있습니다.
    • 이렇게 재기동 했을 때에는 기존에 설정했던 nodes_{PORT}.conf 로 원래의 clustering 설정을 따라갑니다.
    • 따라서 clustering 설정을 변경하고 싶다면, nodes_{PORT}.conf file 을 삭제하거나, redis config file 에서 cluster-config-file 옵션을 변경하면 됩니다.
  • 만약, 재기동시 의도했던 master 가 slave 로 확인된다면, 해당 node 의 slave 를 cluster-node-time-out 시간만큼 중지한 후 재기동합니다.
    • 재기동 이후 master-slave 역할이 잘 수립되었는지 확인합니다.

 

참고 - Redis Cluster 의 동작 방식

  • redis cluster 는 데이터를 hashing 한 후 sharding 하는 정책을 취합니다.
    • 따라서 redis cluster 는 하나의 몸체이지만, 데이터는 해싱값을 기준으로 각각의 master에 나눠져서 들어갑니다.
      • 이때 slave 는 master 의 모든 데이터를 replication 하고 만약 master 에 장애가 발생한 경우 slave 로 failover 됩니다.
    • 클라이언트에서 redis cluster 에 data 요청을 하면 먼저 연결된 node 와 연결을 수립하고, 만약 데이터가 없는 경우 redis cluster는 'MOVED {HOST}' 오류와 함께 올바른 주소로 redirection 하여 데이터를 가져오도록 유도합니다.
      • Spring Data Redis 도 동일하게 동작합니다.
  • Master - Slave Replication 과정
    • 첫 node 가 slave 로 설정되었을 때는 master 에서 현재 메모리 상태 스냅샷을 기준으로 RDB 파일을 생성해서 slave 로 전송합니다.
      • 위처럼 모든 데이터를 받는 것을 Full Replication 이라고 합니다.
    • 일시적인 중지 이후 데이터를 동기화 하는 경우 변경 사항만을 마스터로부터 받아들입니다.
      • 이 방식을 Partial Replication
      • slave 는 마지막으로 받았던 데이터의 offset 을 master 에게 알려줍니다.
      • 이 offset 을 기준으로 master 는 slave 에게 아직 전송하지 않은 변경사항을 찾아서 명령 로그(REPLBACKLOG) 형태로 전송합니다.
        • offset 이 버퍼에 없거나, REPLBACKLOG 의 크기가 너무 작을 때 등은 Full Replication 을 재수행합니다.
    • 실시간으로 동기화 하기 위해서 모든 쓰기 명령을 명령어의 형태로 slave 에게 보냅니다.
  • Single Thread? Multi Thread?
    • Redis 명령의 실행 자체는 Single Thread 로 동작합니다.
    • Network IO / Disk IO 에 대해서 Redis 6++ 부터 Multi Threading 을 지원합니다.
      • Thread IO, Replication, AOF(Append Only File) & RDB(Redis DataBase)에 한해서는 Multi Threading 을 지원합니다.
        • Thread IO Multi Thread 적용 부분
          • 클라이언트가 전송한 명령을 네트워크로 읽어서 파싱하는 부분
          • 명령이 처리된 결과 메시지를 클라이언트에게 네트워크로 전달하는 부분
          • 데이터를 조작하는 것은 빠져있으므로 여전히 Redis 의 CRUD는 Atomic 속성을 지원합니다.
        • RDB (Data 파일 Snapshot), AOF (명령 구문 파일 Snapshot)
          • RDB 와 AOF 는 In-Memory Storage 인 Redis 의 영구적 데이터 보존에 대한 단점을 보완하기 위한 메커니즘입니다.
            • 실제 수행은 다르지만, 두 방식 모두 복구를 위한 Data 를 Disk 에 백업한다는 것은 동일합니다.
          • 두 방식은 Disk IO 를 유발하기 때문에, 각각을 rdb-save-incremental-fsync, aof-rewrite-incremental-fsync 옵션을 활성화하여 Multi Threading 을 적용할 수 있습니다.
        • Replication
          • 주로 Replication Data 를 읽거나, Network로 전송할 때에 Multi Threading 이 지원됩니다.
          • io-threads-do-reads 옵션을 활성화하게 되면 복제 과정 중 데이터를 읽고 슬레이브에 전송하는 작업을 여러 thread 가 처리합니다.

 

끝!

Comments