반응형

3scale 설치와 백업에 이어서 복구방안이다.

백업은 단순하게 커맨드를 나열하여 쉽게 진행할 수 있지만

복구 시 redis와 db에 대한 부분의 이해가 있다면 쉽게 이해할 수 있다.

 

OCP 3scale Operator 설치

ocp 오퍼레이터를 이용하면 rehat 에서 제공하는 솔루션을 손쉽게 올릴 수 있다. 프로젝트에서 3scale 이관을 맡았었는데 설치방법과 백업&리스토어를 기록해두려한다. 1. Operator 설치 ocp 콘솔 > Operat

flowlog.tistory.com

 

 

OCP 3scale Operator 백업하기

Operat" data-og-host="flowlog.tistory.com" data-og-source-url="https://flowlog.tistory.com/35" data-og-url="https://flowlog.tistory.com/35" data-og-image="https://scrap.kakaocdn.net/dn/baK7SQ/hyPuEm..

flowlog.tistory.com

 

작업 순서는

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 호출도 해보고 테스트가 완료되었다.

 

 

해당 포스팅은 레드헷 공식 사이트를 참고하여 직접 테스트하였습니다.

 

Operating 3scale Red Hat 3scale API Management 2.11 | Red Hat Customer Portal

This guide documents development operations with Red Hat 3scale API Management 2.11.

access.redhat.com

 

반응형
복사했습니다!