공부/DATABASE

Redis Cluster Test

무는빼주세요 2024. 1. 28. 21:25

레디스 클러스터 구성 테스트

 

1. 클러스터 구성 테스트

  • redis 설치 및 conf 파일 수정
    cluster-enabled : yes
    cluster-config-file nodes-6379.conf
    cluster-node-timeout 3000
    cluster-migration-barrier 1
    redis -cli --cluster create ip:port ~ 실행
    • 예상 결과 : 4대의 마스터 4대의 슬레이브로 클러스터 자동 구성
    • 실제 결과 : 기존 클러스터로 구성되어 있던 환경이 존재하여 node 에러 발생
      → 클러스터 초기화가 필요 → 각 노드에서 CLUSTER RESET HARD 명령어 실행 
      → 클러스터 재 구성 → 8개의 마스터 서버로 구성 → --cluster-replicas 1 설정 
      → 4MASTER 4SLAVE로 구성 됨
    • 2대의 노드로도 MEET 명어를 통해 클러스터 구성 가능.
      http://redisgate.kr/redis/cluster/cluster_design.php#conf_case4
       

테스트 캡처

기존에 구성된 클러스터를 초기화 해야 함
별도 옵션이 없는 경우 전체 마스터로 생성
--cluster-replicas 옵션 적용

 

2. 노드 관련 테스트

  • 노드 추가
    • 4MASTER 4SLAVE 상태에서의 노드 추가 
    • 데이터가 있는 경우 / 없는 경우
    • 마스터로 추가 / 슬레이브로 추가
      • 예상 결과 : 데이터 여부에 상관 없이 추가됨
      • 마스터의 경우 슬레이브가 없으므로 추가가 안될 것으로 생각  
        • 데이터가 있는 경우
          master, slave 모두 클러스터 노드로 추가 안됨 → flushall 로 해당 노드의 데이터 삭제 후 추가 진행
        • 데이터가 없는 경우
          • redis-cli --cluster add-node 신규ip:port 기존ip:port (마스터로 추가) 
            마스터 노드로 추가되나 slot 할당이 안됨 
          • redis-cli --cluster add-node ip:port --cluster-slave (슬레이브로 추가)
            slave로 추가됨 (하나의 마스터에 2개의 슬레이브가 됨)

  • 노드 삭제
    • cluster reset 을 한 노드의 경우 제거하기 위해선 cluster forget node-id 명령어 실행
      (del-node 로는 node id를 찾지 못한다는 에러가 발생)

테스트 캡처

데이터가 있는 경우 노드 추가가 안
(데이터가 없는 경우) 마스터로 추가된 slot이 없는 노드
(데이터가 없는 경우)  slave 로 추가된 노드
(데이터가 없는 경우)  slave 로 추가된 노드
노드 삭제 과정

 

3. 샤딩 관련 테스트

  • 슬롯 관련 테스트
    • 신규 추가된 노드에 reshard 진행
      • 테스트 내용
      • RESHARD
        1. 신규 노드에 reshard 명령어를 통해 1000개의 슬롯 할당
          redis-cli --cluster reshard 신규ip:포트
          설정 값 -> 슬롯개수 : 1000, Source Node-id : node 입력 후 완료되면 done 입력
        2. 여러개의 source Node-id를 입력한 경우
      • 예상 결과 
        1. 기존 노드의 끝 부분 슬롯이 옮겨질 것으로 생각
        2. 1/N 개씩 신규 노드에 할당할 것으로 예상
      • 실제 결과
        1. 기존 노드의 앞에서 부터 1000개의 슬롯이 신규 노드에 할당
        2. 노드 제거 후 신규 노드 추가시 슬롯이 모두 할당되어 있는 상태가 아니면 노드 추가 에러 발생
          (노드 제거전에 reshard로 슬롯을 비워주자)
          rebalance도 error 발생
          redis-cli로 접속 후 CLUSTER ADDSLOTRANGE 시작노드 끝노드 입력으로 추가 가능.
          여러개 Node가 앞쪽부터 1/n개로 나누어져서 입력됨
      • --ADD, DEL SLOT
        • 여러개의 슬롯을 추가 제거할 때는
          redis cli에서 [ADD/DEL]SLOTSRANGE 시작노드 끝노드 명령어로 처리 가능
          클러스터에 16384 슬롯이 할당되어 있지 않으면 노드 추가, 제거, 샤드관련 명령어가 실행이 안됨
        • 추가, 제거가 필요한 노드에 직접 cli로 붙어서 추가 및 삭제를 진행해야 함.

테스트 캡처

1000개의 노드가 앞에서부터 생성 됨
reshard로 슬롯 제거 및 AddSlotRange 설정으로 slot 추가 입력

 

 

 

  • 리밸런스 관련 테스트 
  • 테스트 내용 : REBALANCE 명령어 실행 옵션별 차이 확인
    • 옵션
      1. --cluster-weight <node1=w1...nodeN=wN> : 가중치 적용 숫자가 높을 수록 많은 슬롯 배정
      2. --cluster-use-empty-masters : 클러스터에 새 노드를 추가한 경우
      3. --cluster-timeout <arg> ??
      4. --cluster-simulate          ??
      5. --cluster-pipeline <arg> ??
      6. --cluster-threshold <arg>??
    • 예상 결과
      1. 가중치별로 분포됨
      2. 동일하게 나누어져 분포됨
      3. 다른 노드와의 타임아웃 시간 값으로 예상
      4. ?
      5. ?
      6. ?
    • 실제 결과
      • 가중치로 나누어져서 들어감
      • 신규로 들어간 노드가 있는 경우에는 해당 옵션을 넣어줘야 슬롯이 할당됨
      • 변화 없음 중간에 다른 노드를 shutdown 할 경우 timeout 시간 설정에 상관없이 바로 종료됨
      • 실제로 슬롯변화가 이루어지지 않고 예상 슬롯 이동이 출력 됨
      • ?
      • ?

4. RDB 백업 복원 테스트

  • 7GB dump.rdb 파일로 테스트
  • 1GB dump.rdb 파일로 테스트
    • 테스트 결과
      • --7GB dump.rdb 파일로 테스트
        • 6.2.2 버전의 rdb 파일 7.0.0 에서 안 올라옴
        • redis log로는 버전 문제인지 메모리 문제인지 확인이 어려움
          → 데몬 설정을 끈 후 확인 → 콘솔에 Segmentation fault 출력 → 메모리 부족으로 확인
      • --1GB dump.rdb 테스트
        • 약 0.08sec 소요
          rdb 복원 후 slot이 importing state와 open 상태로 되어있음 (기존 Redis 와 slot 구조가 달라서 발생한 것으로 파악)
          fix 명령어를 통하여 slot moving 처리
          ./src/redis-cli --cluster fix ip:port → fix 후 slot rebalance 처리

5. Fail Over 테스트

  • 마스터 노드 하나 다운 
    • 마스터만 죽은 경우
    • 슬레이브도 함께 죽은 경우
    • 예상 결과
      • --마스터만 죽은 경우 -> 슬레이브가 올라와서 정상적인 동작 진행
      • --슬레이브까지 죽은 경우 -> 남은 클러스터로 서비스 진행
    • 실제 결과
      • --마스터만 죽은 경우 -> 슬레이브가 마스터로 올라온 후 서비스 정상
      • --슬레이브까지 죽은 경우
        cluster-require-full-coverage : yes로 설정되어 있는 경우
        서비스가 중지됨
        cluster-require-full-coverage : no로 설정되어 있는 경우
        미할당된 slot이 있지만 cluster 는 작동함
        죽어 있는 slot에 날리는 쿼리가 들어올 경우 not connected 발생
  • 마스터 노드 과반수 이상 다운
    • 대처 방안
      • 싱글 장비로 올려야할 경우 RDB 파일을 합친 후 다른 레디스에 복원 한다
        • 데이터 유실 확인 및 최소화 방법
          redis-rdb-cli 툴 사용하여 rdb 파일 관리
          설치 방법 :
          rdb to json
            redis-rdb-cli 툴로 변환 가능
          json to rdb
            redis-rdb-cli 툴로 변환 안됨
          json 파일 load
          https://github.com/p/redis-dump-load/blob/d5affcb9c140e55da738de4f18b360282fb0f9e0/redisdl.py#L311
          의 소스 코드를 수정하여 진행은 가능하지만 load 과정에서 유실 데이터가 생김

        • 실제 테스트
          • 과반수 노드가 죽은경우 cluster-require-full-coverage 값과 상관 없이 클러스터 fail
          • Single 장비로 서버 올리기
            rdb 파일 merge 진행 (여러 클러스터 노드의 RDB 파일을 합쳐야 하므로)
            → redis-rdb-cli 툴을 사용하여 진행
            명령어 :
            (rdb 파일 merge) /rdt -m dump1 dump2 -0 dumpmerge.rdb [-t hash or string 등]
            (rdb 파일 count) /rct -f count -s rdb파일 -o dumpcount.csv
            중복키 값이 있는 경우 rdb에러 발생으로 서버가 안 올라옴
            → json으로 포맷 변환하여 로그에서 확인되는 중복 키를 찾아 제거 후 json 파일 redis에 load 또는 json 을 rdb 파일로 convert  
          • 중복키가 있는 경우 테스트 내용 및 결과 
            • RDB 파일을 Json 형식으로 변환한 후 중복 값 제거
            • 실행된 레디스 클러스터에 Json 형식 데이터 load
            • 테스트 결과 일부 데이터가 유실 되는 것 확인

테스트 캡처

dump 파일의 csv 변경
복원 내용
중복 키로 인한 복원 실패 내용

 

6. 프록시 설정

Predixy 를 통한 구성

  1. 단일 서버 프록시를 통한 Redis 클러스터 접근
  2. 다수의 프록시 서버를 사용한 구성(노드밸런싱 관련 R&D 필요)

설치 및 옵션 설정

$ git clone https://github.com/joyieldInc/predixy.git
$ cd predixy
$ make
$ cp src/predixy /usr/local/bin
-- 설명 문구가 나오면 설치 성공!
$ predixy -h
Usage:
   predixy <conf-file> [options]
   predixy -h or --help
   predixy -v or --version
 
Options:
   --Name=name        set current service name
   --Bind=addr        set bind address, eg:127.0.0.1:7617, /tmp/predixy
   --WorkerThreads=N  set worker threads
   --LocalDC=dc       set local dc

 

predixy.conf

다양한 설정 가능
server 부분에서 cluster 부분 주석 해제 필수

 

auth.conf

 

호출 테스트