redis_cluster_failover_dc
Redis CLUSTER Data Center Failover(장애복구)
Redis Cluster 教育 Redis Cluster Course |
Redis 定期点検/技術支援 Redis Technical Support |
Redis エンタープライズサーバ 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 구성
Replica-priority 값 설명: M1이 다운됐을 경우 같은 Main Data Center에 있는 R11이 마스터로 승격되게 하기 위해서 priority 값을 M1:100, R11:110, R12:120으로 설정했다. Replica-priority 값은 적을수록 우선순위가 높다.
1. Redis-server 시작
레디스 서버를 시작한다.
$ 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
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)
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 복구
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 원상 복구
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 >> |
---|