Redis CLUSTER Data Center Failover(장애복구)

레디스 클러스터 교육 레디스 정기점검/기술지원
Redis Technical Support
레디스 엔터프라이즈 서버
Redis Enterprise Server

Data Center 장애복구 시나리오

  • Main Data Center와 DR(Disaster Recovery) Data Center가 있다.
  • 양 Data Center는 GSLB(Global Server Load Balancing) 기술을 이용해서 Active-Active로 운영한다.
  • Redis Cluster는 양 Data Center에 걸쳐서 1개 클러스터로 구성한다. -> 마스터 3대, 복제노드 6대, 총 9대
  • Main Data Center 다운
  • DR Data Center에서 복제노드를 마스터로 전환해서 운영한다. 마스터 3대, 복제노드 1대.
  • Main Data Center 복구
  • Redis Cluster를 원상태로 복구해서 정상 운영한다. 마스터 3대, 복제노드 6대.
  • 주의사항: Main Data Center Down(장애발생) 시 DR Data Center Redis Cluster 복구, Main Data Center 재가동 시 Redis Cluster 장상 복구에 Redis 관리자(administrator)의 개입(관련 명령 실행)이 필요합니다.
    Redis 관리자의 개입이 필요없는 자동화는 레디스 엔터프라이즈 Active-Active 운영 을 참고하세요.
  • 이 테스트는 Redis version 7.0.8로 수행했습니다. Redis cluster가 도입된 version 3.0에서도 동일한 결과를 얻을 수 있습니다.

2개 Data Center - Redis Cluster 구성

1개(Set) Redis Cluster 구성

2개 Data Center - Redis Cluster 구성

Replica-priority 값 설명: M1이 다운됐을 경우 같은 Main Data Center에 있는 R11이 마스터로 승격되게 하기 위해서 priority 값을 M1:100, R11:110, R12:120으로 설정했다. Replica-priority 값은 적을수록 우선순위가 높다.

1. Redis-server 시작

레디스 서버를 시작한다.

$ bin/redis-server m1/redis.conf
$ bin/redis-server m2/redis.conf
$ bin/redis-server m3/redis.conf
$ bin/redis-server r11/redis.conf
$ bin/redis-server r12/redis.conf
$ bin/redis-server r21/redis.conf
$ bin/redis-server r22/redis.conf
$ bin/redis-server r31/redis.conf
$ bin/redis-server r32/redis.conf

2. Cluster 구성-1: meet

레디스 클러스터 구성 첫 단계로 cluster meet 명령을 실행한다.

$ bin/redis-cli -p 7001 cluster meet 127.0.0.1 7002
$ bin/redis-cli -p 7001 cluster meet 127.0.0.1 7003
$ bin/redis-cli -p 7001 cluster meet 127.0.0.1 7004
$ bin/redis-cli -p 7001 cluster meet 127.0.0.1 7005
$ bin/redis-cli -p 7001 cluster meet 127.0.0.1 7006
$ bin/redis-cli -p 7001 cluster meet 127.0.0.1 7007
$ bin/redis-cli -p 7001 cluster meet 127.0.0.1 7008
$ bin/redis-cli -p 7001 cluster meet 127.0.0.1 7009
$ bin/redis-cli -p 7001 cluster nodes | sort -k 2    -> 구성 확인 
  4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 127.0.0.1:7001@17001 myself,master - 0 1678772055000 1 connected
  a030486d086907df46cd99cacc70a22f18f51fce 127.0.0.1:7002@17002 master - 0 1678772055793 2 connected
  f082b686a92a1b50a847033f48ecbae36e6d2ef7 127.0.0.1:7003@17003 master - 0 1678772056094 0 connected
  99d707e8c801a57f5f0615580284f4d84bb8f8cc 127.0.0.1:7004@17004 master - 0 1678772055592 3 connected
  a7004b61cc09e20af018afd5ee2c64510b377dae 127.0.0.1:7005@17005 master - 0 1678772055000 4 connected
  4654d506d079b6b46a6fa79f67a15077e23d234f 127.0.0.1:7006@17006 master - 0 1678772054789 5 connected
  11c495c28afe03acafe5ea0e871d8fcaed59e022 127.0.0.1:7007@17007 master - 0 1678772055000 6 connected
  3fa87bf69e813b644d01b191b2067984c8c6cd81 127.0.0.1:7008@17008 master - 0 1678772055000 7 connected
  4bb8b5207aa19b9c3ecb6f10da6df1475bbc19c9 127.0.0.1:7009@17009 master - 0 1678772055000 8 connected

3. Cluster 구성-2: assign slot

두번째 단계로 슬롯을 할당한다.

$ bin/redis-cli -p 7001 cluster addslots {0..5460}
$ bin/redis-cli -p 7002 cluster addslots {5461..10922}
$ bin/redis-cli -p 7003 cluster addslots {10923..16383}
$ bin/redis-cli -p 7001 cluster info    -> 구성 확인 
  cluster_state:ok
  cluster_slots_assigned:16384
$ bin/redis-cli -p 7001 cluster nodes | sort -k 2    -> 구성 확인 
  4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 127.0.0.1:7001@17001 myself,master - 0-5460
  a030486d086907df46cd99cacc70a22f18f51fce 127.0.0.1:7002@17002 master - 5461-10922
  f082b686a92a1b50a847033f48ecbae36e6d2ef7 127.0.0.1:7003@17003 master - 10923-16383

4. Cluster 구성-3: 복제 설정

세번째 단계로 복제노드를 설정한다.

$ bin/redis-cli -p 7004 cluster replicate 4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5
$ bin/redis-cli -p 7005 cluster replicate 4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5	
$ bin/redis-cli -p 7006 cluster replicate a030486d086907df46cd99cacc70a22f18f51fce
$ bin/redis-cli -p 7007 cluster replicate a030486d086907df46cd99cacc70a22f18f51fce		
$ bin/redis-cli -p 7008 cluster replicate f082b686a92a1b50a847033f48ecbae36e6d2ef7
$ bin/redis-cli -p 7009 cluster replicate f082b686a92a1b50a847033f48ecbae36e6d2ef7
$ bin/redis-cli -p 7001 cluster nodes | sort -k 2    -> 구성 확인 
  4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 127.0.0.1:7001@17001 myself,master - 0-5460
  a030486d086907df46cd99cacc70a22f18f51fce 127.0.0.1:7002@17002 master - 5461-10922
  f082b686a92a1b50a847033f48ecbae36e6d2ef7 127.0.0.1:7003@17003 master - 10923-16383
  99d707e8c801a57f5f0615580284f4d84bb8f8cc 127.0.0.1:7004@17004 slave 4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 
  a7004b61cc09e20af018afd5ee2c64510b377dae 127.0.0.1:7005@17005 slave 4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 
  4654d506d079b6b46a6fa79f67a15077e23d234f 127.0.0.1:7006@17006 slave a030486d086907df46cd99cacc70a22f18f51fce 
  11c495c28afe03acafe5ea0e871d8fcaed59e022 127.0.0.1:7007@17007 slave a030486d086907df46cd99cacc70a22f18f51fce 
  3fa87bf69e813b644d01b191b2067984c8c6cd81 127.0.0.1:7008@17008 slave f082b686a92a1b50a847033f48ecbae36e6d2ef7 
  4bb8b5207aa19b9c3ecb6f10da6df1475bbc19c9 127.0.0.1:7009@17009 slave f082b686a92a1b50a847033f48ecbae36e6d2ef7

5. Cluster 구성-4: 데이터 넣기

마지막 단계로 데이터를 넣어서 잘 입력되는지 최종 확인한다.

$ for i in {1..10000}; do bin/redis-cli -p 7001 -c set key$i value$i; done
$ bin/redis-cli --cluster info  127.0.0.1:7001 | sort -k 1
  127.0.0.1:7001 (4c0fddee...) -> 3331 keys | 5461 slots | 2 slaves.
  127.0.0.1:7002 (a030486d...) -> 3341 keys | 5462 slots | 2 slaves.
  127.0.0.1:7003 (f082b686...) -> 3328 keys | 5461 slots | 2 slaves.
  [OK] 10000 keys in 3 masters.
$ bin/redis-cli --cluster call 127.0.0.1:7001 dbsize | sort -k 1
  >>> Calling dbsize
  127.0.0.1:7001: 3331
  127.0.0.1:7002: 3341
  127.0.0.1:7003: 3328

Main Data Center Down

Main Data Center Down

1. 마스터 M1, M2 다운, 복제노드 R11, R21, R31 다운

shutdown.sh 스크립트를 만들어 Main Data Center에 위치한 M1,2와 R11,R21,R31을 다운시킨다.

$ cat shutdown.sh 
# Master 1,2 down
bin/redis-cli -p 7001 shutdown
bin/redis-cli -p 7002 shutdown
# Replica R11, R21, R31 down
bin/redis-cli -p 7004 shutdown
bin/redis-cli -p 7006 shutdown
bin/redis-cli -p 7008 shutdown
$ ./shutdown.sh 

2. 프로세스 확인

DR Data Center에 있는 M3, R12, R22, R32 프로세스는 살아있음을 확인한다.
Alias로 redis 명령을 만들었다.
alias redis='ps -C redis-server -o user,pid,lwp,nlwp,pcpu,pmem,vsize,rss,cmd | sort -k 10'

$ redis
USER       PID   LWP NLWP %CPU %MEM    VSZ   RSS CMD
redis     8202  8202    6  0.1  0.0 274772  6628 bin/redis-server 127.0.0.1:7003 [cluster]
redis    18259 18259    7  0.1  0.0 285004  6620 bin/redis-server 127.0.0.1:7005 [cluster]
redis    18277 18277    7  0.1  0.0 285016  6624 bin/redis-server 127.0.0.1:7007 [cluster]
redis    18294 18294    7  0.1  0.0 285016  6484 bin/redis-server 127.0.0.1:7009 [cluster]

3. Cluster info, nodes 명령으로 확인

레디스 클러스터가 사용 불가 상태(cluster_state:fail)이고 Main Data Center에 위치한 5개 레디스 서버가 fail 상태임을 확인할 수 있다.

$ bin/redis-cli -p 7003 cluster info   
  cluster_state:fail		
$ bin/redis-cli -p 7003 cluster nodes | sort -k 2    
  4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 127.0.0.1:7001@17001 master,fail? - 1678777273853 1678777272000 1 disconnected 0-5460
  a030486d086907df46cd99cacc70a22f18f51fce 127.0.0.1:7002@17002 master,fail? - 1678777274556 1678777272045 2 disconnected 5461-10922
  f082b686a92a1b50a847033f48ecbae36e6d2ef7 127.0.0.1:7003@17003 myself,master - 0 1678777345000 0 connected 10923-16383
  99d707e8c801a57f5f0615580284f4d84bb8f8cc 127.0.0.1:7004@17004 slave,fail? 4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 1678777274356 1678777271844 1 disconnected
  a7004b61cc09e20af018afd5ee2c64510b377dae 127.0.0.1:7005@17005 slave 4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 0 1678777344000 1 connected
  4654d506d079b6b46a6fa79f67a15077e23d234f 127.0.0.1:7006@17006 slave,fail? a030486d086907df46cd99cacc70a22f18f51fce 1678777273049 1678777270536 2 disconnected
  11c495c28afe03acafe5ea0e871d8fcaed59e022 127.0.0.1:7007@17007 slave a030486d086907df46cd99cacc70a22f18f51fce 0 1678777344734 2 connected
  3fa87bf69e813b644d01b191b2067984c8c6cd81 127.0.0.1:7008@17008 slave,fail? f082b686a92a1b50a847033f48ecbae36e6d2ef7 1678777273552 1678777271000 0 disconnected
  4bb8b5207aa19b9c3ecb6f10da6df1475bbc19c9 127.0.0.1:7009@17009 slave f082b686a92a1b50a847033f48ecbae36e6d2ef7 0 1678777345237 0 connected

DR Data Center - Redis Server 복구(failover)

DR Data Center - Redis Server 복구(failover)

1. 복제노드 R12, R22를 마스터로 승격

포트 7005, 7007에 접속해서 cluster failover takeover 명령으로 마스터로 승격시킨다.
cluster info 명령으로 승격이 잘되었고 cluster가 정상인지 확인한다.

$ bin/redis-cli -p 7005 cluster failover takeover
$ bin/redis-cli -p 7007 cluster failover takeover

2. Cluster info, nodes 명령으로 확인

레디스 클러스터가 사용 가능 상태(cluster_state:ok)이고, 7005, 7007번 서버가 마스터로 되어 7003번과 함께 총 3개 마스터가 되어 레디스 클러스터가 정상이 되었다.

$ bin/redis-cli -p 7003 cluster info   
  cluster_state:ok					
$ bin/redis-cli -p 7003 cluster nodes | sort -k 2    
  4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 127.0.0.1:7001@17001 master,fail - 1678777273853 1678777272000 1 disconnected
  a030486d086907df46cd99cacc70a22f18f51fce 127.0.0.1:7002@17002 master,fail - 1678777274556 1678777272045 2 disconnected
  f082b686a92a1b50a847033f48ecbae36e6d2ef7 127.0.0.1:7003@17003 myself,master - 0 1678777468000 0 connected 10923-16383
  99d707e8c801a57f5f0615580284f4d84bb8f8cc 127.0.0.1:7004@17004 slave,fail 4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 1678777274356 1678777271844 1 disconnected
  a7004b61cc09e20af018afd5ee2c64510b377dae 127.0.0.1:7005@17005 master - 0 1678777471913 9 connected 0-5460
  4654d506d079b6b46a6fa79f67a15077e23d234f 127.0.0.1:7006@17006 slave,fail a030486d086907df46cd99cacc70a22f18f51fce 1678777273049 1678777270536 2 disconnected
  11c495c28afe03acafe5ea0e871d8fcaed59e022 127.0.0.1:7007@17007 master - 0 1678777470909 10 connected 5461-10922
  3fa87bf69e813b644d01b191b2067984c8c6cd81 127.0.0.1:7008@17008 slave,fail f082b686a92a1b50a847033f48ecbae36e6d2ef7 1678777273552 1678777271000 0 disconnected
  4bb8b5207aa19b9c3ecb6f10da6df1475bbc19c9 127.0.0.1:7009@17009 slave f082b686a92a1b50a847033f48ecbae36e6d2ef7 0 1678777469904 0 connected

3. 데이터 입력해서 정상 작동하는지 확인

10000개 키를 입력한다. 기존 키와 합쳐서 총 20000개 키가 되었다.

$ for i in {10001..20000}; do bin/redis-cli -p 7003 -c set key$i value$i; done		
$ bin/redis-cli --cluster info  127.0.0.1:7003 | sort -k 1
  127.0.0.1:7003 (f082b686...) -> 6648 keys | 5461 slots | 1 slaves.
  127.0.0.1:7007 (11c495c2...) -> 6679 keys | 5462 slots | 0 slaves.
  127.0.0.1:7005 (a7004b61...) -> 6673 keys | 5461 slots | 0 slaves.
  [OK] 20000 keys in 3 masters.

Main Data Center 복구

Main Data Center 복구

1. 마스터 M1, M2 시작, 복제노드 R11, R21, R31 시작

다운되었던 포트 7001, 7002, 7004, 7006, 7008을 시작한다.

$ bin/redis-server m1/redis.conf
$ bin/redis-server m2/redis.conf
$ bin/redis-server r11/redis.conf
$ bin/redis-server r21/redis.conf
$ bin/redis-server r31/redis.conf

2. 프로세스 확인

$ redis
USER       PID   LWP NLWP %CPU %MEM    VSZ   RSS CMD
redis    22248 22248    6  0.2  0.0 277484  5432 bin/redis-server 127.0.0.1:7001 [cluster]
redis    22320 22320    6  0.2  0.0 277484  5456 bin/redis-server 127.0.0.1:7002 [cluster]
redis     8202  8202    6  0.1  0.0 274772  7044 bin/redis-server 127.0.0.1:7003 [cluster]
redis    22361 22361    6  0.2  0.0 277484  5416 bin/redis-server 127.0.0.1:7004 [cluster]
redis    18259 18259    7  0.1  0.0 285004  7068 bin/redis-server 127.0.0.1:7005 [cluster]
redis    22395 22395    6  0.2  0.0 283628  5448 bin/redis-server 127.0.0.1:7006 [cluster]
redis    18277 18277    7  0.1  0.0 285016  7092 bin/redis-server 127.0.0.1:7007 [cluster]
redis    22418 22418    6  0.4  0.0 277484  5356 bin/redis-server 127.0.0.1:7008 [cluster]
redis    18294 18294    7  0.1  0.0 285016  6960 bin/redis-server 127.0.0.1:7009 [cluster]

3. Cluster info, nodes 명령으로 확인

처음에 마스터였던 7001, 7002번 서버가 복제본(slave)으로 시작되었음 확인할 수 있다.

$ bin/redis-cli -p 7003 cluster info   
  cluster_state:ok			
$ bin/redis-cli -p 7003 cluster nodes | sort -k 2    
  4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 127.0.0.1:7001@17001 slave a7004b61cc09e20af018afd5ee2c64510b377dae 0 1678778584491 9 connected
  a030486d086907df46cd99cacc70a22f18f51fce 127.0.0.1:7002@17002 slave 11c495c28afe03acafe5ea0e871d8fcaed59e022 0 1678778584000 10 connected
  f082b686a92a1b50a847033f48ecbae36e6d2ef7 127.0.0.1:7003@17003 myself,master - 0 1678778583000 0 connected 10923-16383
  99d707e8c801a57f5f0615580284f4d84bb8f8cc 127.0.0.1:7004@17004 slave a7004b61cc09e20af018afd5ee2c64510b377dae 0 1678778583000 9 connected
  a7004b61cc09e20af018afd5ee2c64510b377dae 127.0.0.1:7005@17005 master - 0 1678778583488 9 connected 0-5460
  4654d506d079b6b46a6fa79f67a15077e23d234f 127.0.0.1:7006@17006 slave 11c495c28afe03acafe5ea0e871d8fcaed59e022 0 1678778583000 10 connected
  11c495c28afe03acafe5ea0e871d8fcaed59e022 127.0.0.1:7007@17007 master - 0 1678778584000 10 connected 5461-10922
  3fa87bf69e813b644d01b191b2067984c8c6cd81 127.0.0.1:7008@17008 slave f082b686a92a1b50a847033f48ecbae36e6d2ef7 0 1678778584000 0 connected
  4bb8b5207aa19b9c3ecb6f10da6df1475bbc19c9 127.0.0.1:7009@17009 slave f082b686a92a1b50a847033f48ecbae36e6d2ef7 0 1678778583588 0 connected

Redis Server 원상 복구

Redis Server 원상 복구

1. 원래 구성으로 변경

원래 구성으로 변경하기 위해서 7001, 7002번에 접속해서 cluster failover 명령을 실행한다. 그러면 7001, 7002가 마스터로 승격되고, 7005, 7006은 복제본이 된다.

$ bin/redis-cli -p 7001 cluster failover 
$ bin/redis-cli -p 7002 cluster failover 
$ bin/redis-cli -p 7001 cluster info   
  cluster_state:ok			
$ bin/redis-cli -p 7001 cluster nodes | sort -k 2    
  4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 127.0.0.1:7001@17001 myself,master - 0 1678779413000 11 connected 0-5460
  a030486d086907df46cd99cacc70a22f18f51fce 127.0.0.1:7002@17002 master - 0 1678779412982 12 connected 5461-10922
  f082b686a92a1b50a847033f48ecbae36e6d2ef7 127.0.0.1:7003@17003 master - 0 1678779413584 0 connected 10923-16383
  99d707e8c801a57f5f0615580284f4d84bb8f8cc 127.0.0.1:7004@17004 slave 4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 0 1678779412000 11 connected
  a7004b61cc09e20af018afd5ee2c64510b377dae 127.0.0.1:7005@17005 slave 4c0fddeec8964d69f1ea602a9fbb6ee7fa15e4e5 0 1678779412000 11 connected
  4654d506d079b6b46a6fa79f67a15077e23d234f 127.0.0.1:7006@17006 slave a030486d086907df46cd99cacc70a22f18f51fce 0 1678779412079 12 connected
  11c495c28afe03acafe5ea0e871d8fcaed59e022 127.0.0.1:7007@17007 slave a030486d086907df46cd99cacc70a22f18f51fce 0 1678779412000 12 connected
  3fa87bf69e813b644d01b191b2067984c8c6cd81 127.0.0.1:7008@17008 slave f082b686a92a1b50a847033f48ecbae36e6d2ef7 0 1678779413000 0 connected
  4bb8b5207aa19b9c3ecb6f10da6df1475bbc19c9 127.0.0.1:7009@17009 slave f082b686a92a1b50a847033f48ecbae36e6d2ef7 0 1678779413584 0 connected

이상으로 2개 Data Center에서 1개 레디스 클러스터로 운영 중 Main Data Center 다운 시 장애 복구 방법과 Main Data Center 재 가동시 원래 상태로 복구 방법에 대해서 알아보았습니다.



<< Cluster Failover Data Center Failover Cluster Failover using nodes.conf >>

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