다음을 통해 공유


컨트롤러 데이터베이스 백업 및 복구

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 볼륨에 저장됩니다.

컨트롤러 데이터베이스 복구

다음과 같은 두 가지 유형의 복구가 가능합니다.

  1. controller가 손상되어 이 데이터베이스만 복원하면 됩니다.
  2. controller 데이터 및 로그 파일이 포함된 전체 스토리지가 손상/손실되어 복구해야 합니다.

손상된 컨트롤러 데이터베이스 시나리오

이 시나리오에서는 모든 Pod가 실행되고 있으며 controldb SQL Server에 연결할 수 있고, controller 데이터베이스에 손상이 있을 수 있습니다. 백업에서 데이터베이스를 복원하기만 하면 됩니다.

SQL Server가 여전히 controldb Pod에서 실행되고 있고 연결 가능한 경우, 다음 단계에 따라 백업에서 컨트롤러 데이터베이스를 복원합니다.

  1. 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 파일 내용에는 passwordusername이 포함됩니다. 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"
      
  2. 컨트롤러 ReplicaSet을 다음과 같이 복제본 0개로 스케일 다운합니다.

    kubectl scale --replicas=0 rs/control -n <namespace>`
    

    예시:

    kubectl scale --replicas=0 rs/control -n arcdataservices
    
  3. 1단계에서 설명한 대로 controldb SQL Server에 system으로 연결합니다.

  4. T-SQL을 사용하여 손상된 컨트롤러 데이터베이스를 삭제합니다.

    DROP DATABASE controller
    
  5. 손상된 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
    
  6. 컨트롤러 ReplicaSet을 다시 복제본 1개로 스케일 업합니다.

    kubectl scale --replicas=1 rs/control -n <namespace>
    

    예시:

    kubectl scale --replicas=1 rs/control -n arcdataservices
    

손상된 스토리지 시나리오

이 시나리오에서는 데이터 컨트롤러 데이터 및 로그 파일을 호스트하는 스토리지가 손상되었고 새 스토리지가 프로비전되었으므로, 컨트롤러 데이터베이스를 복원해야 합니다.

controldb StatefulSet에 대한 새 스토리지를 사용하여 백업에서 컨트롤러 데이터베이스를 복원하려면 다음 단계를 수행합니다.

  1. controller 데이터베이스의 마지막으로 알려진 정상 상태의 백업이 있는지 확인합니다.

  2. 컨트롤러 ReplicaSet을 다음과 같이 복제본 0개로 스케일 다운합니다.

    kubectl scale --replicas=0 rs/control -n <namespace>
    

    예시:

    kubectl scale --replicas=0 rs/control -n arcdataservices
    
  3. controldb StatefulSet을 다음과 같이 복제본 0개로 스케일 다운합니다.

    kubectl scale --replicas=0 sts/controldb -n <namespace>
    

    예시:

    kubectl scale --replicas=0 sts/controldb -n arcdataservices`
    
  4. 다음 YAML을 사용하여 controller-sa-secret이라는 kubernetes 비밀을 만듭니다.

    apiVersion: v1
    kind: Secret
    metadata:
      name: controller-sa-secret
      namespace: <namespace>
    type: Opaque
    data:
      password: <base64 encoded password>
    
  5. kubectl edit sts controldb -n <namespace> 명령을 사용하여 mssql-server 컨테이너에 controller-sa-secret 볼륨 및 해당 볼륨 탑재(/var/run/secrets/mounts/credentials/mssql-sa-password)를 포함하도록 controldb StatefulSet을 편집합니다.

  6. 다음과 같이 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>
    
  7. controldb StatefulSet을 다시 복제본 1개로 스케일 업합니다.

    kubectl scale --replicas=1 sts/controldb -n <namespace>
    
  8. 이전에 만든 controller-sa-secret 비밀의 암호를 사용하여 controldb SQL Server에 sa로 연결합니다.

  9. 다음과 같이 controller-system-secret kubernetes 비밀의 암호를 사용하여 sysadmin 역할로 system 로그인을 만듭니다.

    CREATE LOGIN [system] WITH PASSWORD = '<password-from-secret>'
    ALTER SERVER ROLE sysadmin ADD MEMBER [system]
    
  10. 다음과 같이 RESTORE 명령을 사용하여 백업을 복원합니다.

RESTORE DATABASE [controller] FROM DISK = N'/var/opt/backups/mssql/<controller backup file>.bak' WITH FILE = 1
  1. controller-db-rw-secret 비밀 CREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>'의 암호를 사용하여 controldb-rw-user 로그인을 만들고 컨트롤러 DB ALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user]의 기존 controldb-rw-user 사용자와 연결합니다.

  2. TSQL - ALTER LOGIN [sa] DISABLE을 사용하여 sa 로그인을 사용하지 않도록 설정합니다.

  3. controldb StatefulSet을 편집하여 controller-sa-secret 볼륨 및 해당 볼륨 탑재를 제거합니다.

  4. controller-sa-secret 비밀을 삭제합니다.

  5. kubectl scale 명령을 사용하여 컨트롤러 ReplicaSet을 다시 복제본 1개로 스케일 업합니다.

Azure Data Studio 대시보드