[Redis] Cluster (1)이론-2
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
로 해보기 권장
- 서버가 메모리의 내용을 RDB 파일로 자동으로 dump 하는 시점을 설정한다.
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
- redis-cli 명령어 :
2) AOF persistence
appendonly <yes/no>
appendfilename “appendonly.aof”
- AOF 파일명을 설정한다.
- path는 설정 불가능하다.
appendfsync <always/everysec/no>
- AOF 기록 시점을 설정한다.
always
: 모든 명령 기록, 데이터 유실 염려는 없으나 성능 저하everysec
: 1초마다 기록, 1초 사이 데이터 유실 가능성 존재, 성능에 거의 영향 미치지 않기에 권장no
: OS 가 기록 시점 정의(리눅스의 경우 30초), 유실 위험 큼
- AOF 기록 시점을 설정한다.
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 노드로 들어오는 모든 명령에 에러 상태 돌려줌 (읽기, 쓰기 처리하지 않음)
- Master 노드와 연결 끊겼을 경우 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 반환
- Redis가 사용하고 있는 메모리(output buffer size 제외)가 maxmemory를 초과한 경우에 데이터 처리 정책을 설정한다.
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 반환 가능하다.
- 기록 가능한 slow log 길이로 초과 시 가장 오래된 log 제거한다.
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 에서도 데이터 사라지게 됨
- Replica(복제본) 은 완벽한 복사본을 유지하기 위해 Master가 빈 데이터 세트로 다시 시작되면 Replica도 삭제된다.
2.4. Security
- 기본적으로 Redis 는 모든 인터페이스에 Binding되며 인증이 전혀 없음
- Redis port가 방화벽 설정이 되어 있는지 확인 필요하다.
- Redis가 사용 중인 Network interface에서만 수신 대기하도록 bind 지시문이 설정된 설정 파일 사용 필요하다.
- 클라이언트가 auth 명령을 사용해 인증해야 하도록 requirepass 옵션을 사용한다.
- Redis 서버와 클라이언트 간의 트래픽을 암호화하기 위해 spiped / 또 다른 ssl tunneling software 사용한다.
- 방화벽 계층을 적용 후 외부 호스트에서 redis-cli 에 연결해 인스턴스에 실제로 연결 불가능함을 확인할 필요가 있음