3scale 설치와 백업에 이어서 복구방안이다.
백업은 단순하게 커맨드를 나열하여 쉽게 진행할 수 있지만
복구 시 redis와 db에 대한 부분의 이해가 있다면 쉽게 이해할 수 있다.
작업 순서는
1. Secret, ConfigMap 복구
2. Operator 설치(3scale-APIManager)
3. System-mysql 복구
4. System-storage 복구
5. Zync-database 복구
6. Backend-redis 복구
7. System-redis 복구
8. Service Rollout (재기동)
9. Zync to Routes (라우트업데이트Sync)
이렇게 진행된다.
프로젝트 생성(namespace)
백업당시 사용한 project name 으로 진행함(ARO클러스터를 타 클러스터로 변경하여서 기존내용없음)
$ oc new-project <old project name>
Secret, ConfigMap
백업 받아두었던 정보를 등록한다.
파일을보면 namespace 정보가 그대로 있기때문에 혹시 프로젝트명이 달라진다면 변경 후 등록해야한다.
$ oc apply -f system-smtp.json
$ oc apply -f system-seed.json
$ oc apply -f system-database.json
$ oc apply -f backend-internal-api.json
$ oc apply -f system-events-hook.json
$ oc apply -f system-app.json
$ oc apply -f system-recaptcha.json
$ oc apply -f system-redis.json
$ oc apply -f zync.json
$ oc apply -f system-master-apicast.json
$ oc apply -f system-environment.json
$ oc apply -f apicast-environment.json
Operator 설치(3scale-APIManager)
기존설정과 동일하게 생성
System-mysql
백업을 받아 두었던 파일을 신규생성 pod에 넣고, 압축푼뒤 db를 덮어씌운다.
$ oc cp ./system-mysql-backup.gz $(oc get pods -l 'deploymentConfig=system-mysql' -o json | jq '.items[0].metadata.name' -r):/var/lib/mysql
$ oc rsh $(oc get pods -l 'deploymentConfig=system-mysql' -o json | jq -r '.items[0].metadata.name') bash -c 'gzip -d ${HOME}/system-mysql-backup.gz'
$ oc rsh $(oc get pods -l 'deploymentConfig=system-mysql' -o json | jq -r '.items[0].metadata.name') bash -c 'export MYSQL_PWD=${MYSQL_ROOT_PASSWORD}; mysql -hsystem-mysql -uroot system < ${HOME}/system-mysql-backup'
$ oc rsync ./dir/system $(oc get pods -l 'deploymentConfig=system-app' -o json | jq '.items[0].metadata.name' -r):/opt/app-root/src
$ oc exec $(oc get pods -l 'deploymentConfig=system-app' -o json | jq '.items[0].metadata.name' -r) -it bash
$ cd /opt/app-root/src/system
$ cp -R ./* /opt/system/public/system
System-storage
./dir 폴더안에 백업해두었던 사항을 복원한다.
$ oc rsync ./dir/system $(oc get pods -l 'deploymentConfig=system-app' -o json | jq '.items[0].metadata.name' -r):/opt/app-root/src
$ oc exec $(oc get pods -l 'deploymentConfig=system-app' -o json | jq '.items[0].metadata.name' -r) -it bash
$ cd /opt/app-root/src/system
$ cp -R ./* /opt/system/public/system
Zync-database
DEPLOYMENT_NAME 변수에 APIManager 생성시 입력한 name 삽입
$ DEPLOYMENT_NAME=apimanager
$ ZYNC_SPEC=`oc get APIManager/${DEPLOYMENT_NAME} -o json | jq -r '.spec.zync'`
$ oc patch APIManager/${DEPLOYMENT_NAME} --type merge -p '{"spec": {"zync":{"appSpec": {"replicas": 0}, "queSpec": {"replicas": 0}}}}'
$ oc cp ./zync-database-backup.gz $(oc get pods -l 'deploymentConfig=zync-database' -o json | jq '.items[0].metadata.name' -r):/var/lib/pgsql/
$ oc rsh $(oc get pods -l 'deploymentConfig=zync-database' -o json | jq -r '.items[0].metadata.name') bash -c 'gzip -d ${HOME}/zync-database-backup.gz'
$ oc rsh $(oc get pods -l 'deploymentConfig=zync-database' -o json | jq -r '.items[0].metadata.name') bash -c 'psql -f ${HOME}/zync-database-backup'
$ oc patch APIManager ${DEPLOYMENT_NAME} --type merge -p '{"spec": {"zync":'"${ZYNC_SPEC}"'}}'
Backend-redis
redis 는 지속적?으로 파일을 쓰고 있기 때문에 내부 config를 수정한 뒤, 파일을 옮긴다.
간단히 설명하자면 RDB 파일 생성 로직을 주석처리하고, AOF 방식의 데이터 백업을 해제한다(appendonly no)
$ oc edit configmap redis-config
위 명령어로 열린 redis-config 파일에서 아래와 같이 save 라인을 주석처리하고 appendonly no 로 바꿔준다.
#save 900 1
#save 300 10
#save 60 10000
appendonly no
파일을 저장하고 아래 명령어를 실행한다.
바뀐 config 적용을 위한 rollout, 중복파일 이름변경, 백업파일 삽입, 적용, 상태확인이다.
$ oc rollout latest dc/backend-redis
$ oc rollout status dc/backend-redis
$ oc rsh $(oc get pods -l 'deploymentConfig=backend-redis' -o json | jq '.items[0].metadata.name' -r) bash -c 'mv ${HOME}/data/dump.rdb ${HOME}/data/dump.rdb-old'
$ oc rsh $(oc get pods -l 'deploymentConfig=backend-redis' -o json | jq '.items[0].metadata.name' -r) bash -c 'mv ${HOME}/data/appendonly.aof ${HOME}/data/appendonly.aof-old'
$ oc cp ./backend-redis-dump.rdb $(oc get pods -l 'deploymentConfig=backend-redis' -o json | jq '.items[0].metadata.name' -r):/var/lib/redis/data/dump.rdb
$ oc rollout latest dc/backend-redis
$ oc rollout status dc/backend-redis
$ oc rsh $(oc get pods -l 'deploymentConfig=backend-redis' -o json | jq '.items[0].metadata.name' -r) bash -c 'redis-cli BGREWRITEAOF'
$ oc rsh $(oc get pods -l 'deploymentConfig=backend-redis' -o json | jq '.items[0].metadata.name' -r) bash -c 'redis-cli info' | grep aof_rewrite_in_progress
aof_rewrite_in_progress = 0 확인
이제 위에서 주석처리한 걸 다시 풀고, 롤아웃으로 적용시킨다.
$ oc edit configmap redis-config
save 900 1
save 300 10
save 60 10000
appendonly yes
$ oc rollout latest dc/backend-redis
$ oc rollout status dc/backend-redis
System-redis
6번 backend-redis와 같은 방식으로 RDB, AOF를 중단시킨 뒤 작업한다.
$ oc edit configmap redis-config
#save 900 1
#save 300 10
#save 60 10000
appendonly no
$ oc rollout latest dc/system-redis
$ oc rollout status dc/system-redis
$ oc rsh $(oc get pods -l 'deploymentConfig=system-redis' -o json | jq '.items[0].metadata.name' -r) bash -c 'mv ${HOME}/data/dump.rdb ${HOME}/data/dump.rdb-old'
$ oc rsh $(oc get pods -l 'deploymentConfig=system-redis' -o json | jq '.items[0].metadata.name' -r) bash -c 'mv ${HOME}/data/appendonly.aof ${HOME}/data/appendonly.aof-old'
$ oc cp ./backend-redis-dump.rdb $(oc get pods -l 'deploymentConfig=system-redis' -o json | jq '.items[0].metadata.name' -r):/var/lib/redis/data/dump.rdb
$ oc rollout latest dc/system-redis
$ oc rollout status dc/system-redis
$ oc rsh $(oc get pods -l 'deploymentConfig=system-redis' -o json | jq '.items[0].metadata.name' -r) bash -c 'redis-cli BGREWRITEAOF'
$ oc rsh $(oc get pods -l 'deploymentConfig=system-redis' -o json | jq '.items[0].metadata.name' -r) bash -c 'redis-cli info' | grep aof_rewrite_in_progress
aof_rewrite_in_progress = 0 확인
aof_rewrite_in_progress = 0 까지 확인되면 다시 config를 원래대로 돌리고 적용
$ oc edit configmap redis-config
save 900 1
save 300 10
save 60 10000
appendonly yes
$ oc rollout latest dc/system-redis
$ oc rollout status dc/system-redis
Service Rollout
이제 모든 서비스를 재기동 시킨다.
$ oc rollout latest dc/backend-worker
$ oc rollout status dc/backend-worker
$ oc rollout latest dc/system-app
$ oc rollout status dc/system-app
$ oc rollout latest dc/system-sidekiq
$ oc rollout status dc/system-sidekiq
$ oc rollout latest dc/system-sphinx
$ oc rollout status dc/system-sphinx
Zync to Routes
3scale의 Route를 동기화한다.
$ oc rsh $(oc get pods -l 'deploymentConfig=system-sidekiq' -o json | jq '.items[0].metadata.name' -r) bash -c 'bundle exec rake zync:resync:domains'
이로써 모든 복구 작업이 끝났다.
3scale 대시보드 정상확인과 postman으로 staging, product url 호출도 해보고 테스트가 완료되었다.
해당 포스팅은 레드헷 공식 사이트를 참고하여 직접 테스트하였습니다.
'엔지니어링 > 3scale' 카테고리의 다른 글
[OCP] 3scale 백업 자동화 고도화하기 - 1편(도입부) (0) | 2022.08.31 |
---|---|
[OCP] 3scale Operator 리소스 조정(관리) (0) | 2022.08.24 |
[OCP] 3scale 백업 자동화 크론잡 (0) | 2022.08.24 |
[OCP] 3scale Operator 백업하기 (0) | 2022.08.19 |
[OCP] 3scale Operator 설치 (0) | 2022.08.09 |