ent_server_admin
Enterprise Administration
레디스 엔터프라이즈 서버 Active 3노드 운영 가이드(주의사항)
1분 간격을 두고 시작
- 레디스 서버는 1분 간격을 두고 시작합니다.
예) 1호기 시작 -> 1분 후 -> 2호기 시작 -> 1분 후 -> 3호기 시작
Linux cmd ex) start1.sh; sleep 61; start2.sh; sleep 61; start3.sh;
3노드 운영 중 한 노드가 다운된 경우(예: 2호기 다운)
- 운영 중에는 다운된 노드를 다시 시작하지 않습니다.
다시 시작하여 사용할 수는 있으나 경우에 따라 다른 2개 노드와 키 개수(데이터 정합성)가 맞지 않을 수 있습니다.
A) 입력/삭제가 반복된 경우: 키 개수가 맞지 않을 수 있습니다.
B) 입력/수정이 반복된 경우: 키 개수가 맞습니다.
C) 입력만 반복된 경우: 키 개수가 맞습니다. - 맞지 않는 원인:
A) 2호기를 다시 시작하면 운영 중인 1,2호기와 하나씩 동기화를 합니다.
B) 2호기가 1호기와 동기화 완료 후 3호기와 동기화를 시작하는 시점이 1~2초 정도 시간 간격이 있습니다.
C) 이 사이 키가 삭제가 반복되면 삭제된 키가 2호기에 다시 원복 될 수 있습니다.
D) 결과적으로 1,3호기 보다 2호기의 키 개수가 많아 집니다.
- 2호기를 다시 시작하는 방법
A) 3호기에 접속한 AP를 중지하거나, 1호기에 접속하도록 합니다.
결과적으로 3호기에 데이터 입력이 없게 합니다.
B) 2호기를 시작합니다. 이 때 사전에 2호기의 데이터를 삭제합니다. (rm –f data/*)
데이터 삭제 이유:
① 데이터(AOF)를 로드하는데 시간이 걸립니다.
② 초기 로드된 데이터가 다를 경우 서로 데이터가 맞지 않을 수 있습니다.
C) 3개 노드 동기화(info clone)가 정상인지 확인합니다.
D) 2호기와 3호기에 AP에 가동합니다.
노드 운영 중 두 노드가 다운된 경우(예: 2,3호기 다운)
- 2호기, 3호기를 담당한 AP를 중지하거나 1호기에 접속하게 합니다.
- 2호기, 3호기를 1분 간격으로 다시 시작합니다. 이 때 사전에 2호기, 3호기의 데이터를 삭제합니다. (rm –f data/*)
- 3개 노드 동기화(info clone)가 정상인지 확인합니다.
1,2,3호기 키 개수(데이터)도 확인합니다. - 2호기, 3호기를 담당한 AP를 가동합니다.
구성 파라미터 변경 내용(redis.conf)
- 동기화 관련 파라미터
A) client-output-buffer-limit replica 4gb 4gb 120
B) repl-backlog-size 4gb
C) repl-timeout 120
※ 파란색끼리, 빨간색끼리 맞춥니다.
- 복제용 IP, Port 분리 관련 파라미터
A) replica-announce-ip "192.168.56.100"
B) replica-announce-port 7000
※ 동기화 시작 시에는 원래 포트를 사용합니다. startsync ip 6000
동기화 타임아웃(timeout)
- 자신(myself) 서버가 시작했을 경우 대상 서버에 계속 시도합니다. 시간 제한 없음.
(redis.conf 파일에 startsync ip port가 있는 경우)
중지하려면 endsync ip port 명령을 실행합니다. - 동기화 중 대상 서버가 다운된 경우에는 5분 동안 재시도합니다.
(3개 노드 운영중 노드2가 다운된 경우 노드1, 노드3이 노드2에 재시도하는 시간입니다)
동기화를 다시 시작하려면 startsync ip port 명령을 실행합니다. - 동기화를 시작(startsync ip port)한 후 2분이 지나도 성공하지 못하면 중지합니다.
(동기화 중 노드2가 다운된 경우)
동기화를 다시 시작하려면 startsync ip port 명령을 실행합니다. - 소스: clone.c cloneCron()
운영 가이드
레디스 서버 상태(CPU, Memory 등) 기록
레디스 서버 상태(CPU, Memory 등)를 주기적으로 기록합니다.
- 파일: log/stat.log
- 기록 형식
- 항목 설명
- Cpu: CPU 사용률 표시.
AOF/RDB background save 시 작동하는 자식 프로세스의 CPU 사용률은 포함하지 않습니다. - Mem_rss: Memory 사용량 표시.
레디스 info memory 명령 used_memory_rss_human 항목, 리눅스 top 명령 RES 항목과 같습니다. - Keys: 레디스 서버의 키 개수. 레디스 info keyspace 명령에 나오는 DB별 키 개수의 총계입니다.
- Cmds: 레디스 서버에서 1초 동안 실행한 명령 개수입니다. (입력/수정/삭제/조회 모두 포함)
- Clients: 레디스 서버에 접속한 클라이언트 수 표시
- Cpu: CPU 사용률 표시.
- redis.conf: stat-log-interval-time 60 (단위:초) : 60초(1분)마다 기록합니다.
config set stat-log-interval-time 60 : 운영중 변경 가능, 바로 적용됩니다.
0으로 설정하면 기록하지 않습니다. - 적용 버전: 7.4.6
클라이언트(복제) 출력 버퍼 크기 기록: client(replica) output buffer size
client(replica) output buffer(memory)를 얼마나 사용하고 있는지 크기(바이트)를 주기적으로 기록합니다.
redis.conf: "client-output-buffer-limit replica 512mb 512mb 60" 와 관계가 있습니다.
위 설정으로 동기화 중인 서버와 연결이 끊길 경우 모니터링 용으로 사용합니다.
- 파일: log/redis.log
- 기록 형식
- 항목 설명
- from_clones: 상대 동기화 서버로 부터 데이터를 받는 클라이언트
to_clones: 상대 동기화 서버로 데이터를 보내는 클라이언트 - client id:5(master/slave): client id와 client type(master/slave) 표기
- obufmem: client-output-buffer 사용량(바이트) 표기.
이 사용량이 "client-output-buffer-limit replica" 에서 설정한 512mb를 초과하면 해당 복제 클라이언트 연결을 끊습니다.
- from_clones: 상대 동기화 서버로 부터 데이터를 받는 클라이언트
- 만약 연결이 끊기면 client-output-buffer-limit replica 설정 값을 크게 늘리시거나(예: 10gb) 또는 normal과 같이 "0 0 0"으로 설정할 해도 됩니다.
- redis.conf: replica-output-buffer-limit-check-period 60 (단위:초) : 60초(1분)마다 기록합니다.
config set replica-output-buffer-limit-check-period 60 : 운영중 변경 가능, 바로 적용됩니다.
0으로 설정하면 기록하지 않습니다. - 적용 버전: 7.4.6
레디스 서버 상태 정보(모니터링) 조회
레디스 서버 모니터링 용으로 상태 정보를 매초 조회합니다.
CPU, Memory, Keys 등 항목을 조회할 수 있습니다.
- 실행 방법: redis-ecli -p port --mon -> mon.sh
- 조회 형식
- 항목 설명
- date: 일자를 yyyy-mm-dd 형식으로 표시합니다.
- time: 시각을 hh:mm:ss 형식으로 표시합니다.
- ip:port: ip 끝자리와 port를 표시합니다. 여러 대 서버를 모니터링 할 경우 구분하기 위해서 표시했습니다.
- role: 레디스 서버의 역할을 표시합니다.
- keys: 키 개수를 표시합니다.
- cpu: CPU 사용률을 표시합니다. 자식(child) 프로세스의 CPU 사용률은 포함하지 않습니다.
- memory: 레디스 서버가 사용하는 메모리(used_memory)를 표시합니다.
info memory 명령 used_memory_human 항목과 같습니다. - clients: 클라이언트 수를 표시합니다.
- commands: 초당 실행된 명령 수를 표시합니다.
- from: 데이터를 받는 서버(동기화) 대수를 표시합니다.
- to: 데이터를 보내는 서버(동기화) 대수를 표시합니다.
- child: 자식 프로세스를 표시합니다.
- AOF rewrite: AOF 표시.
- RDB bgsave: RDB 표시.
- LOAD(%): 레디스 서버 시작할 때 AOF/RDB 파일 로드 시 표시. 이 경우 진행률(%)도 같이 표시합니다. 전체 데이터 동기화할 때도 LOAD로 표시됩니다. LOAD는 자식 프로세스는 아닙니다.
- 적용 버전: 7.4.5
이 기능은 이전 버전에도 있었으나 CPU 사용률, 초당 실행된 명령 수는 7.4.5 버전에 추가되었습니다.
CLIENT SETINFO, NO-TOUCH, NO-EVICT
Client 명령에 setinfo, no-touch, no-evict 옵션을 추가했습니다.
이것은 redis 커뮤니티 버전 7.2.0에 추가된 기능입니다.
Lettuce 6.3.0을 지원하기 위해서 추가했습니다.
Enterprise 7.4.4 이전 버전에서는 Lettuce 6.2.7을 사용하면 됩니다.
- 적용 버전: 7.4.4
redis.conf myip 추가
레디스 서버가 사용하는 IP를 등록한다.
이 IP는 서버간 동기화용으로 사용하고, 라이선스 확인할 때도 사용한다.
이렇게 함으로써 redis.conf bind에 IP를 0.0.0.0으로 등록할 수 있게 되었다.
- 적용 버전: 7.4.4
Client 연결, 해제(종료) 로그
loglevel을 verbose로 설정하면 client 연결, 해제(종료) 로그가 redis.log에 기록됩니다.
많은 로그가 남을 수 있으니 필요한 경우만 사용하시기 바랍니다.
L4 스위치 설정에 따라 초당 수십 건의 연결과 해제가 반복될 수 있습니다.
- 설정 방법: > cofig set loglevel verbose
- 기록 형식
- 적용 버전: 7.4.3
명령 로그
레디스 서버가 실행하는 명령를 기록합니다.
loglevel verbose: 일반 클라이언트(pubsub 클라이언트 포함) 명령 기록
loglevel debug: 모든 클라이언트(동기화용 클라이언트 포함) 명령 기록
매우 많은 로그가 남을 수 있으니 꼭 필요한 경우만 사용하시기 바랍니다.
- 설정 방법: cofig set loglevel verbose/debug
- 기록 형식
- 적용 버전: 7.4.3
관리 명령 로그
중요한 관리 명령은 로그 파일(redis.log)에 기록합니다. 이것은 loglevel이 notice입니다.
대상 명령: CONFIG SET, SAVE, BGSAVE, BGREWRITEAOF, SHUTDOWN
- 기록 형식
- 적용 버전: 7.4.1
config set 명령으로 dir 변경 불가
config set 명령으로 dir 변경할 수 없도록 했습니다.
이것은 해킹 방지용으로 도입되었습니다. 커뮤니티 버전에서는 변경 가능합니다.
해킹 관련 사례는 여기를 참고하세요.
- 적용 버전: 7.4.1
동기화 시 데이터 입력 막는 시간
동기화 시 데이터 불일치를 막기 위해서 로딩이 완료(loading_end_time)되고 sync_start_wait_time 후에 일반 입력을 받는다.
redis.conf: sync-start-wait-time 10 (단위:초)
이 지시자(sync-start-wait-time)는 6.1.3 버전에 최초 도입되었다.
처음에는 동기화 시 데이터 불일치를 막기 위해서 이 시간 동안 입력 명령을 받지 않았는데,
이 값을 동기화 로딩 시간에 맞추어야 하는 불편함이 있어서,
7.3.9에서 로딩 후 이 시간 동안 막는 것으로 변경했다.
- 적용 버전: 7.3.9
license 명령 memory fault 버그 수정
라이선스를 확인하기 위해서 license 명령 사용 시 발생할 수 있는 memory fault 버그 수정했다.
이전 버전에서는 license 명령을 사용하면 안된다.
7.1.6 ~ 7.3.4: license 명령 -> OK 리턴.
7.3.5 부터 만료일 리턴 -> 7.3.5 ~ 7.3.8까지 license 명령 사용 금지.
7.3.9 부터 사용 가능.
- 적용 버전: 7.3.9
휴지통 Recyclebin 기능
rm 명령으로 키를 삭제했을 경우 완전히 삭제되지 않고 휴지통에 들어간다. 되살릴 수 있다.
간단한 사용 예)
> set key1 value1
> get key1 -> "value1"
> rm key1 -> 1
> get key1 -> (nil)
> reuse key1 -> 1
> get key1 -> "value1"
휴지통은 매일 지정된 시각에 자동으로 비워집니다. redis.log에 기록됩니다.
redis.conf: flush-recyclebin-spec-time "05:00"
config set 명령으로 변경 가능합니다.
휴지통 기능 소개와 각 명령에 대한 설명은 아래 링크를 참조하세요.
- 휴지통 Recyclebin 기능 소개
- RM 명령
- REUSE 명령
- RMKEYBIN 명령
- FLUSHRECYCLEBIN 명령
- FLUSHRECYCLEBINALL 명령
- RECYCLEBIN 명령
- 적용 버전: 7.3.3
redis.conf loading-count
rdb, aof loading count
redis.conf loading-count
로딩 시간이 매우 오래 걸리는 경우가 발생해서 추가했다.
(디스크 문제였다)
redis.conf 몇 가지 지시자
use-sql 도입
clone-backlog-size
robj 원래 16바이트 -> 32바이트 -> 24바이트
object time key
redis-benchmark --usleep us
AOF 파일에 update_mstime이 없으면 loading time을 넣는다.
에러: Invalid cross-device link
1. Full sync시에 tmp.rdb 파일을 dump.rdb 파일로 rename할 때 레디스가 설치된 디렉토리와 data 디렉토리가 디스크 다른 파티션일 경우 rename에서 에러 발생. 에러 메시지: Invalid cross-device link 해결 방법: tmp.rdb 파일을 처음부터 data 디렉토리에 만든다.
동기화 시도 기간: 1년
1. 클론서버가 다운되었을 때 5분 동안 연결을 시도하다 중지하는 것을 1년으로 변경했다. ELAPSE_YEAR 사용. 연결 시도하고 실패하면 남기는 로그 레벨을 WARNING에서 DEBUG로 변경했다. 로그 레벨이 DEBUG가 아니면 연결 시도, 연결 실패 로그를 남기지 않는다.
명령: LICENSE
1. license command 추가: 라이선스 파일이 올바른지 확인하는 명령 2. license 만료일이 지나면 서버를 중지(shutdown)한다. license 만료일 30일 전부터 log에 license warning를 남긴다. license 만료일은 02:00에 check한다. 날짜가 지났으면 서버를 종료한다.