컨트롤러 데이터베이스 백업 및 복구
Azure Arc 데이터 서비스를 배포할 때 Azure Arc 데이터 컨트롤러는 배포되는 가장 중요한 구성 요소 중 하나입니다. 데이터 컨트롤러의 함수는 다음과 같습니다.
- 리소스 프로비전, 프로비전 해제 및 업데이트
- 업그레이드, 스케일 아웃 등 Azure Arc 지원 SQL Managed Instance에 대한 대부분의 활동을 오케스트레이션합니다.
- 각 Arc SQL Managed Instance의 청구 및 사용량 정보를 캡처합니다.
위의 함수를 수행하려면 데이터 컨트롤러가 현재의 모든 Arc SQL Managed Instance의 인벤토리, 청구, 사용량 및 이러한 모든 SQL Managed Instance의 현재 상태를 저장해야 합니다. 이 모든 데이터는 controldb-0
Pod에 배포된 SQL Server 인스턴스 내에 있는 controller
라는 데이터베이스에 저장됩니다.
이 문서에서는 컨트롤러 데이터베이스를 백업하는 방법을 설명합니다.
데이터 컨트롤러 데이터베이스 백업
기본 제공 기능에서 백업을 사용하도록 설정하면 데이터 컨트롤러 데이터베이스 controller
가 5분마다 자동으로 백업됩니다. 백업을 사용하도록 설정하려면 다음을 수행합니다.
ReadWriteMany
액세스를 지원하는 스토리지 클래스로backups-controldb
PersistentVolumeClaim
을 만듭니다.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: backups-controldb
namespace: <namespace>
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 15Gi
storageClassName: <storage-class>
backups
스토리지 정의를 포함하도록DataController
사용자 지정 리소스 사양을 편집합니다.
storage:
backups:
accessMode: ReadWriteMany
className: <storage-class>
size: 15Gi
data:
accessMode: ReadWriteOnce
className: managed-premium
size: 15Gi
logs:
accessMode: ReadWriteOnce
className: managed-premium
size: 10Gi
controller
데이터베이스에 대한 .bak
파일은 /var/opt/backups/mssql
에 있는 controldb
Pod의 backups
볼륨에 저장됩니다.
컨트롤러 데이터베이스 복구
다음과 같은 두 가지 유형의 복구가 가능합니다.
controller
가 손상되어 이 데이터베이스만 복원하면 됩니다.controller
데이터 및 로그 파일이 포함된 전체 스토리지가 손상/손실되어 복구해야 합니다.
손상된 컨트롤러 데이터베이스 시나리오
이 시나리오에서는 모든 Pod가 실행되고 있으며 controldb
SQL Server에 연결할 수 있고, controller
데이터베이스에 손상이 있을 수 있습니다. 백업에서 데이터베이스를 복원하기만 하면 됩니다.
SQL Server가 여전히 controldb
Pod에서 실행되고 있고 연결 가능한 경우, 다음 단계에 따라 백업에서 컨트롤러 데이터베이스를 복원합니다.
controller
데이터베이스를 호스팅하는 SQL Server Pod에 대한 연결을 확인합니다.먼저, 비밀에 대한 자격 증명을 검색합니다.
controller-system-secret
는 SQL 인스턴스에 연결하는 데 사용할 수 있는system
사용자 계정에 대한 자격 증명을 보유하는 비밀입니다. 다음 명령을 실행하여 비밀 콘텐츠를 검색합니다.kubectl get secret controller-system-secret --namespace [namespace] -o yaml
예시:
kubectl get secret controller-system-secret --namespace arcdataservices -o yaml
base64로 인코딩된 자격 증명을 디코딩합니다. 비밀
controller-system-secret
의 yaml 파일 내용에는password
및username
이 포함됩니다. base64 디코더 도구를 사용하여password
의 내용을 디코딩할 수 있습니다.연결 확인: 디코딩된 자격 증명을 사용하여 SQL Server에 대한 연결을 확인하는 명령(예:
SELECT @@SERVERNAME
)을 실행합니다.kubectl exec controldb-0 -n <namespace> -c mssql-server -- /opt/mssql-tools/bin/sqlcmd -S localhost -U system -P "<password>" -Q "SELECT @@SERVERNAME"
kubectl exec controldb-0 -n contosons -c mssql-server -- /opt/mssql-tools/bin/sqlcmd -S localhost -U system -P "<password>" -Q "SELECT @@SERVERNAME"
컨트롤러 ReplicaSet을 다음과 같이 복제본 0개로 스케일 다운합니다.
kubectl scale --replicas=0 rs/control -n <namespace>`
예시:
kubectl scale --replicas=0 rs/control -n arcdataservices
1단계에서 설명한 대로
controldb
SQL Server에system
으로 연결합니다.T-SQL을 사용하여 손상된 컨트롤러 데이터베이스를 삭제합니다.
DROP DATABASE controller
손상된
controllerdb
를 삭제한 후, 백업에서 데이터베이스를 복원합니다. 예시:RESTORE DATABASE test FROM DISK = '/var/opt/backups/mssql/<controller backup file>.bak' WITH MOVE 'controller' to '/var/opt/mssql/data/controller.mdf ,MOVE 'controller' to '/var/opt/mssql/data/controller_log.ldf' ,RECOVERY; GO
컨트롤러 ReplicaSet을 다시 복제본 1개로 스케일 업합니다.
kubectl scale --replicas=1 rs/control -n <namespace>
예시:
kubectl scale --replicas=1 rs/control -n arcdataservices
손상된 스토리지 시나리오
이 시나리오에서는 데이터 컨트롤러 데이터 및 로그 파일을 호스트하는 스토리지가 손상되었고 새 스토리지가 프로비전되었으므로, 컨트롤러 데이터베이스를 복원해야 합니다.
controldb
StatefulSet에 대한 새 스토리지를 사용하여 백업에서 컨트롤러 데이터베이스를 복원하려면 다음 단계를 수행합니다.
controller
데이터베이스의 마지막으로 알려진 정상 상태의 백업이 있는지 확인합니다.컨트롤러 ReplicaSet을 다음과 같이 복제본 0개로 스케일 다운합니다.
kubectl scale --replicas=0 rs/control -n <namespace>
예시:
kubectl scale --replicas=0 rs/control -n arcdataservices
controldb
StatefulSet을 다음과 같이 복제본 0개로 스케일 다운합니다.kubectl scale --replicas=0 sts/controldb -n <namespace>
예시:
kubectl scale --replicas=0 sts/controldb -n arcdataservices`
다음 YAML을 사용하여
controller-sa-secret
이라는 kubernetes 비밀을 만듭니다.apiVersion: v1 kind: Secret metadata: name: controller-sa-secret namespace: <namespace> type: Opaque data: password: <base64 encoded password>
kubectl edit sts controldb -n <namespace>
명령을 사용하여mssql-server
컨테이너에controller-sa-secret
볼륨 및 해당 볼륨 탑재(/var/run/secrets/mounts/credentials/mssql-sa-password
)를 포함하도록controldb
StatefulSet을 편집합니다.다음과 같이
controldb
Pod에 대한 새 데이터(data-controldb
) 및 로그(logs-controldb
) 영구 볼륨 클레임을 만듭니다.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-controldb namespace: <namespace> spec: accessModes: - ReadWriteOnce resources: requests: storage: 15Gi storageClassName: <storage class> --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: logs-controldb namespace: <namespace> spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: <storage class>
controldb
StatefulSet을 다시 복제본 1개로 스케일 업합니다.kubectl scale --replicas=1 sts/controldb -n <namespace>
이전에 만든
controller-sa-secret
비밀의 암호를 사용하여controldb
SQL Server에sa
로 연결합니다.다음과 같이
controller-system-secret
kubernetes 비밀의 암호를 사용하여 sysadmin 역할로system
로그인을 만듭니다.CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>' ALTER SERVER ROLE sysadmin ADD MEMBER [system]
다음과 같이
RESTORE
명령을 사용하여 백업을 복원합니다.
RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
controller-db-rw-secret
비밀CREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>'
의 암호를 사용하여controldb-rw-user
로그인을 만들고 컨트롤러 DBALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user]
의 기존controldb-rw-user
사용자와 연결합니다.TSQL -
ALTER LOGIN [sa] DISABLE
을 사용하여sa
로그인을 사용하지 않도록 설정합니다.controldb
StatefulSet을 편집하여controller-sa-secret
볼륨 및 해당 볼륨 탑재를 제거합니다.controller-sa-secret
비밀을 삭제합니다.kubectl scale
명령을 사용하여 컨트롤러 ReplicaSet을 다시 복제본 1개로 스케일 업합니다.