16 분 소요

Cluster 이론 2번째 :

Redis Cluster를 설계하기 위해 Redis Cluster에 대한 설정을 자세히 알아보겠다.

1. Redis Cluster 설정

이제 Redis Cluster 의 핵심 설정들을 살펴보겠다.

1.1. Basic

  • daemonize <yes/no>
    • 서버를 백그라운드로 실행하기 위해서는 yes로 설정한다.
  • pidfile /var/run/redis.pid
    • 서버의 pid 가 해당 경로에 텍스트 파일 형태로 저장된다.
    • kill -9 ‘cat /var/run/redis.pid’ 명령어로 서버 강제 종료 가능하다.
  • port 6300
  • bind 127.0.0.1
    • 랜카드가 2개 이상인 경우 어느 랜카드(IP) 에서 서버가 대기할지 설정한다.
  • timeout 0
    • 클라이언트에서 서버에 접속할 때 설정하는 timeout 값으로 초 단위이다.
  • loglevel verbose
    • debug > verbose > notice > warning 순으로 로그의 정보 단계 설정 가능하다.
  • logfile stdout
    • 로그 파일의 위치이다.
    • stdout 은 표준 출력으로 로그를 남기는데 데몬 모드로 서버 실행 시 /dev/null 로 출력 되어 로그가 남지 않게 된다.
  • databases 16
    • SELECT 명령으로 DB 변경 가능한데 DB 는 0부터 시작하는 index 값 가지게 된다.
    • DB 를 최대 몇 개 가질 수 있는지 설정해주는 부분이다.
    • 16이면 0 ~ 15 까지 DB 가지게 된다.
  • requirepass <비밀번호>
    • 서버에 접속한 후에 AUTH 명령어로 인증 받아야 해당 서버를 사용 가능하다.
  • rename-command CONFIG “”
    • Redis 명령을 다른 이름으로 바꿔주거나 사용 못하도록 설정한다.
    • ex) rename-command SET “SETTER” : SET 명령을 SETTER 로 변경

1.2. Persistence

Redis는 인 메모리 저장 방식이기 때문에 서버가 다운되면 데이터가 초기화된다.

따라서, 이러한 경우 데이터 유실을 방지하기 위해 다음과 같이 2가지 방식을 제공한다.

첫 번째는 Disk에 데이터를 저장하는 RDB 방식으로 서버가 restart 될 때 데이터를 Redis에 Upload한다.

두 번째는 데이터 저장 로그를 저장하는 AOF 방식으로 서버가 restart 될 때 해당 로그를 통해 데이터를 다시 작성한다.

1) RDB persistence

  • save <초> <변경된 키 수>
    • 서버가 메모리의 내용을 RDB 파일로 자동으로 dump 하는 시점을 설정한다.
      • 메모리의 내용을 통째로 파일로 복사하는 것으로 순간적인 부하 발생
    • 해당 설정을 지정해줘야 자동으로 RDB를 수행한다.
      • 캐시 용도로만 사용한다면 save 는 “” 로 설정 권장
    • ex) save 60 10000
      • 60 초 동안 10000 건 이상의 키가 변경되었다면 메모리 상의 데이터를 모두 RDB 파일로 dump
      • 테스트할 경우에는 save 10 1 로 해보기 권장
  • rdbcompression <yes/no>
    • RDB 파일로 dump 할 때 텍스트 부분을 압축하여 rdb 파일 사이즈 줄일지 말지를 설정한다.
    • 압축하는 만큼 약간의 시스템 부하 발생한다.
    • 시스템 부하가 걱정되면 yes 로 쓰다가 부하 걸렸을 때 no 로 변경 권장한다.
  • dbfilename dumb.rdb
    • dump 할 때 RDB 파일명을 설정한다.
    • 서버 실행할 때 이 파일에 있는 내용을 메모리에 업로드한다.
  • dir ./
    • dbfilename 으로 설정해준 RDB 파일이 저장되는 디렉토리 경로를 설정한다.
  • stop-writes-on-bgsave-error <yes/no>
    • yes : RDB 저장 실패 시 서버에 모든 데이터 쓰기 불가능하다.
    • no : RDB 저장 실패 시에도 데이터 쓰기 허용한다.
      • redis-cli 명령어 : config set stop-writes-on-bgsave-error no

2) AOF persistence

  • appendonly <yes/no>
  • appendfilename “appendonly.aof”
    • AOF 파일명을 설정한다.
    • path는 설정 불가능하다.
  • appendfsync <always/everysec/no>
    • AOF 기록 시점을 설정한다.
      • always : 모든 명령 기록, 데이터 유실 염려는 없으나 성능 저하
      • everysec : 1초마다 기록, 1초 사이 데이터 유실 가능성 존재, 성능에 거의 영향 미치지 않기에 권장
      • no : OS 가 기록 시점 정의(리눅스의 경우 30초), 유실 위험 큼
  • auto-aof-rewrite-percentage 100
    • 이전 AOF 파일 사이즈의 100% 도달 시 rewrite를 진행한다.
  • auto-aof-rewrite-min-size 64mb
    • Redis 처음 시작 후 AOF 파일 사이즈가 0일 때 rewrite 발생을 방지하기 위해 지정한다.
    • AOF 파일 사이즈가 64mb 초과 시 rewrite하고, 64mb 이하인 경우 rewrite를 방지한다.

1.3. Replication

  • slaveof <master 노드의 IP와 Port>
  • masterauth <master 비밀번호>
    • Master 노드의 설정 파일에 requirepass 부분 설정되어 있는 경우 Replica 노드의 설정 파일에서 그 비밀번호를 적어줘야 한다.
  • slave-serve-stale-data <yes/no>
    • Master 노드와 연결 끊겼을 경우 Replica 노드로 들어오는 명령에 어떻게 대처할지를 설정한다.
      • yes : Replica 노드에서 읽기나 쓰기 명령을 모두 처리
      • no : Replica 노드로 들어오는 모든 명령에 에러 상태 돌려줌 (읽기, 쓰기 처리하지 않음)
  • repl-ping-slave-period 10
    • 복제 노드에서는 주기적으로 master 노드에 ping 명령을 날려 master 노드와의 접속상태를 확인하는데 그 주기를 설정한다.
  • repl-timout 60
    • 대량의 I/O와 data에 대한 timeout을 설정한다.
    • repl-ping-slave-period 값보다 크게 설정해야 한다.

1.4. Limit

  • maxclients 128
    • Redis 서버에서 클라이언트의 접속을 동시에 몇 개까지 받아들일지 설정한다.
    • 128 숫자를 초과 시 에러 반환한다.
  • maxmemory <bytes>
    • Replica 노드에 data 제공할 때 사용되는 output buffer size는 제외한다.
    • 1k / 1kb / 1m / 1m / 1mb / 1g / 1gb
  • maxmemory-policy <policy>
    • Redis가 사용하고 있는 메모리(output buffer size 제외)가 maxmemory를 초과한 경우에 데이터 처리 정책을 설정한다.
      • volatile-lru : expire 가 설정된 key 들 중 lru 알고리즘에 의해서 선택된 key 제거
      • allkeys-lry : 모든 key 들 중 LRU algorithm에 의해서 선택된 key 제거
      • volatile-random : expire가 설정된 key 들 중 임의의 key 제거
      • allkeys-random : 모든 key 들 중 임의의 key 제거
      • volatile-ttl : expire time 이 가장 적게 남은 key 제거
      • noeviction : 어떠한 key 도 제거하지 않고 쓰기 동작 시 error 반환
  • maxmemory-samples 3
    • lru 알고리즘이나 만기 시각으로 key 선택 시 정확하게 조건에 맞는 key 를 선택하지 않고 효율을 이해 몇 개의 key 선택해 그 중에 최근에 덜 사용한 key 선택하는데 효율을 위해 선택한 key 의 수를 설정한다.

1.5. Cluster

  • cluster-enabled <yes / no>
  • cluster-config-file <filename>
    • 사용자가 수정 불가능한 파일이다.
    • 클러스터 노드가 시작 시 다시 읽을 수 있도록 변경이 있을 때마다 클러스터 구성(상태)을 자동으로 유지하는 파일이다.
    • 클러스터 내의 다른 노드들과의 상태, 영구 변수 등이 나열되어 있다.
  • cluster-node-timeout <milliseconds>
    • 노드가 지정된 시간 동안 통신 불가능하면 Fail 로 간주한다.
  • cluster-slave-validity-factor <factor>
    • 0 으로 지정 시 Replica 노드는 항상 유효하고 Failover를 수행한다.
    • Replica 노드의 경우 Master 노드와의 연결이 maximum disconnection time 이상으로 해제된 경우 Failover를 수행하지 않는다.
      • Master 와 Replica 노드 간의 연결 단절 시간
      • maximum disconnection time = node-timeout * cluster-slave-validity-factor
  • cluster-migration-barrier <count>
    • Master 노드와 연결된 상태로 유지되는 최소 복제 노드 수를 설정한다.
  • cluster-require-full-coverage <yes/no>
    • yes : 키 공간의 일부가 노드에 포함되지 않으면 클러스터가 쓰기 수락 중지한다.
    • no : 키의 하위 집합에 대한 요청만 처리 가능한 경우에도 클러스터가 계속 쿼리 제공한다.
  • cluster-allow-reads-when-down <yes/no>
    • no : 클러스터의 노드는 클러스터가 실패한 것으로 표시될 때 노드가 master quorum 에 도달할 수 없거나 전체 범위가 충족되지 않을 때 모든 트래픽 제공 중지, 클러스터 변경 사항을 인식하지 못하는 노드에서 (잠재적으로) 일치하지 않는 데이터를 읽는 것 방지한다.
    • yes : 실패 상태 동안에도 노드에서 읽기 허용, 읽기 가용성에 우선순위를 두면서 일관성 없는 쓰기를 방지하려는 애플리케이션에 유용, 또한 샤드가 1~2개만 있는 클러스터 사용 시에도 사용 가능, 마스터가 실패 시 자동 failover 불가능한 경우에도 쓰기 계속 제공한다.

1.6. logging/monitoring

  • logfile <경로>
  • loglevel verbose
    • debug > verbose > notice > warning
  • syslog-enabled <yes/no>
    • 시스템 로그 정보의 수집 여부 결정한다.
  • syslog-ident <id값>
    • 시스템 로그 작성에 로깅 시 id 값 > 시스템 로그 식별자이다.
  • latency-monitor-threshold 25
    • 25 millisecond 이상 소요되는 작업 수집 및 분석한다.
    • redis-cli -p <port> -latency : latency 상태 모니터링
    • redis-cli -p <port> -latency-history : latency 히스토리 상태 모니터링

1.7. slow log

  • 설정된 실행 시간을 초과한 쿼리들의 로그 남기는 시스템
    • I/O operation (클라이언트와 통신 및 응답 등) 포함하지 않는다.
    • command 수행을 위해 thread 가 block 되어서 다른 request 를 처리할 수 없는 시간만 측정한다.
  • slowlog-log-slower-than <microseconds>
    • slow execution time 설정한다.
    • 1000000 는 1초와 동일하다.
    • 음수로 설정 시 slow log 비활성화, 0으로 설정 시 모든 command 에 대해 logging 수행한다.
  • slowlog-max-len
    • 기록 가능한 slow log 길이로 초과 시 가장 오래된 log 제거한다.
      • slowlog-max-len 128
    • memory 를 소모하는 것이기 때문에 길이 제한이 필요하다.
    • SLOWLOG RESET 명령어로 slow log 로 인해 사용된 memory 반환 가능하다.

1.8. virtual memory

  • vm-enabled no
    • virtual memory 는 redis2.4 에서 제거되었기 때문에 사용하지 않는다.

1.9. 설정 파일 예시

include /opt/redis/redis.conf

# Basic
daemonize yes
protected-mode yes
requirepass thisispasswordexample
masterauth thisispasswordexample
bind 0.0.0.0
port 7300
timeout 2
pidfile /opt/redis/7300/redis_7300.pid
databases 16

# RDB persistence
save 30 10
rdbcompression no
dir /opt/redis/7300
dbfilename dump_7300.rdb
stop-writes-on-bgsave-error no

# AOF persistence
appendonly yes
appendfilename /usr/local/redis/dump/master_appendonly.aof
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 30mb

# Replication
slave-serve-stale-data no
repl-ping-slave-period 10
repl-timeout 60

# Limit
maxclients 10
maxmemory 350mb
maxmemory-policy noeviction
#maxmemory-samples 3

# Logging/Monitoring
loglevel verbose
logfile /opt/redis/7300/redis-7300.log
latency-monitor-threshold 25

# Cluster
cluster-enabled yes
cluster-config-file node-7300.conf
cluster-node-timeout 5000
cluster-announce-ip 000.000.000.00

#rename-command keys ""

2. Redis Cluster 관리 팁

다음은 Redis 공식 문서에서 제안하는 Redis Cluster 관리 팁이다.

2.1. Linux

  • Linux 커널 기능인 THP가 Redis 메모리 사용량 및 대기 시간에 영향을 미치지 않도록 하기
    • THP : Transparent Huge Pages
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled

2.2. Memory

  • swap 활성화
    • swap 파일 크기가 시스템의 메모리 양과 같도록 설정 필요하다.
    • swap 이 설정되어 있지 않은 경우 Redis가 많은 메모리를 사용해 메모리가 부족할 때
      • Redis 충돌이 발생하거나,
      • Linux 커널 OOM 킬러가 Redis 종료시킬 가능성이 있다.
    • swap 활성화하면 latency 급증 감지 및 조치 취할 수 있다.
  • maxmemory 옵션 제한
    • 시스템 메모리 limit 에 거의 도달 시 오류를 보고하도록 인스턴스에 명시적 maxmemory 제한 설정 필요하다.
    • maxmemory 는 Redis에 저장하는 데이터 용량 이외에도 Redis 에 대한 오버헤드 및 파편화 오버헤드를 계산해서 설정 필요하다.
      • 10GB 의 여유 메모리가 있는 경우 8-9 로 설정하는 것이 좋다.
    • Write 작업이 많은 애플리케이션에서 Redis를 사용하는 경우 Disk에 RDB 파일 저장 또는 AOF 로그 재작성하는 동안 Redis 는 최대 2배까지의 메모리를 사용할 수 있다.

2.3. Replication

  • Replication 사용하는 경우 Redis 는 Persistence(RDB/AOF)가 비활성화 되어도 RDB save 프로세스를 수행해서 데이터 복제 후 복제 노드에 전달
    • 단, Disk 없는 Replication 에서는 미작동한다.
    • Master에서 Disk 사용량이 없는 경우, Disk 없는 Replication을 활성화한다.
  • Master에 Persistence 활성화 여부와 충돌 시 다시 시작되지 않는지 확인 필요
    • Replica(복제본) 은 완벽한 복사본을 유지하기 위해 Master가 빈 데이터 세트로 다시 시작되면 Replica도 삭제된다.
      • AOF/RDB 파일 없는 Master 노드가 죽음
      • Failover 가 일어나기 전에 Master 노드가 Restart 된다면 AOF/RDB 파일이 없기 때문에 데이터가 없는 상태로 구동
      • Master 노드에서 Replica 노드로 동기화 일어남
        • Replica 노드도 데이터 없는 상태가 됨
        • 설령 Replica 노드의 AOF 백업을 받는다고 해도 rewrite 기능으로 AOF 에서도 데이터 사라지게 됨

2.4. Security

  • 기본적으로 Redis 는 모든 인터페이스에 Binding되며 인증이 전혀 없음
    • Redis port가 방화벽 설정이 되어 있는지 확인 필요하다.
    • Redis가 사용 중인 Network interface에서만 수신 대기하도록 bind 지시문이 설정된 설정 파일 사용 필요하다.
    • 클라이언트가 auth 명령을 사용해 인증해야 하도록 requirepass 옵션을 사용한다.
    • Redis 서버와 클라이언트 간의 트래픽을 암호화하기 위해 spiped / 또 다른 ssl tunneling software 사용한다.
  • 방화벽 계층을 적용 후 외부 호스트에서 redis-cli 에 연결해 인스턴스에 실제로 연결 불가능함을 확인할 필요가 있음


[Redis 에 대해 더 궁금하다면?]

REFERENCES