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: 레디스 서버에 접속한 클라이언트 수 표시
  • 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를 초과하면 해당 복제 클라이언트 연결을 끊습니다.
  • 만약 연결이 끊기면 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 명령으로 변경 가능합니다.

휴지통 기능 소개와 각 명령에 대한 설명은 아래 링크를 참조하세요.

redis.conf loading-count

rdb, aof loading count
redis.conf loading-count
로딩 시간이 매우 오래 걸리는 경우가 발생해서 추가했다.
(디스크 문제였다)

  • 적용 버전: 7.3.3

    redis.conf 몇 가지 지시자

    use-sql 도입
    clone-backlog-size
    robj 원래 16바이트 -> 32바이트 -> 24바이트
    object time key
    redis-benchmark --usleep us
    AOF 파일에 update_mstime이 없으면 loading time을 넣는다.

  • 적용 버전: 7.2.0

    에러: Invalid cross-device link

    1. Full sync시에 tmp.rdb 파일을 dump.rdb 파일로 rename할 때 레디스가 설치된 디렉토리와 data 디렉토리가 디스크 다른 파티션일 경우 rename에서 에러 발생. 에러 메시지: Invalid cross-device link 해결 방법: tmp.rdb 파일을 처음부터 data 디렉토리에 만든다.

  • 적용 버전: 7.1.8

    동기화 시도 기간: 1년

    1. 클론서버가 다운되었을 때 5분 동안 연결을 시도하다 중지하는 것을 1년으로 변경했다. ELAPSE_YEAR 사용. 연결 시도하고 실패하면 남기는 로그 레벨을 WARNING에서 DEBUG로 변경했다. 로그 레벨이 DEBUG가 아니면 연결 시도, 연결 실패 로그를 남기지 않는다.

  • 적용 버전: 7.1.7

    명령: LICENSE

    1. license command 추가: 라이선스 파일이 올바른지 확인하는 명령 2. license 만료일이 지나면 서버를 중지(shutdown)한다. license 만료일 30일 전부터 log에 license warning를 남긴다. license 만료일은 02:00에 check한다. 날짜가 지났으면 서버를 종료한다.

  • 적용 버전: 7.1.6




    Email 답글이 올라오면 이메일로 알려드리겠습니다.