コントローラー データベースをバックアップして復旧する

Azure Arc データ サービスをデプロイするとき、Azure データ コントローラーはデプロイされる最も重要なコンポーネントの 1 つです。 データ コントローラーには次のような機能があります。

  • リソースのプロビジョニング、プロビジョニング解除、更新を行います
  • アップグレード、スケールアウトなど、Azure Arc 対応 SQL Managed Instance のほとんどのアクティビティのオーケストレーションを行います。
  • 各 Arc SQL マネージド インスタンスの課金と使用状況の情報をキャプチャします。

上記の機能を実行するため、データ コントローラーは、現在のすべての Arc SQL マネージド インスタンス、課金、使用状況、およびこれらすべての SQL マネージド インスタンスの現在の状態のインベントリを格納する必要があります。 このデータはすべて、controldb-0 ポッドにデプロイされた SQL Server インスタンス内の controller というデータベースに格納されます。

この記事では、コントローラー データベースをバックアップする方法について説明します。

データ コントローラーのデータベースをバックアップする

組み込み機能の一部として、バックアップが有効になると、データ コントローラーのデータベース controller は 5 分ごとに自動的にバックアップされます。 バックアップを有効にするには:

  • ReadWriteMany アクセスをサポートするストレージ クラスを使って backups-controldbPersistentVolumeClaim を作成します。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: backups-controldb
  namespace: <namespace>
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 15Gi
  storageClassName: <storage-class>
  • DataController カスタム リソースの仕様を編集して、backups ストレージの定義を含めます。
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 ポッドの backups ボリュームに格納されます。

コントローラー データベースを復旧する

2 種類の復旧の可能性があります。

  1. controller が壊れており、データベースを復元することだけが必要です
  2. controller のデータとログ ファイルを含むストレージ全体が破損または消失しており、復旧する必要があります

破損したコントローラー データベースのシナリオ

このシナリオでは、すべてのポッドが稼働しており、ユーザーは controldb SQL Server に接続でき、controller データベースが破損している可能性があります。 バックアップからデータベースを復元することだけが必要です。

SQL Server が controldb ポッドでまだ稼働していて、それに接続できる場合は、次の手順のようにして、バックアップからコントローラー データベースを復元します。

  1. controller データベースをホストしている SQL Server ポッドへの接続を確認します。

    • まず、シークレットの資格情報を取得します。 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 の内容をデコードできます。

    • 接続の検証: デコードされた資格情報を使い、SELECT @@SERVERNAME などのコマンドを実行して、SQL Server への接続を検証します。

      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 で説明したように、system として controldb SQL Server に接続します。

  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> コマンドを使って controldb StatefulSet を編集し、controller-sa-secret ボリュームおよび対応するボリューム マウント (/var/run/secrets/mounts/credentials/mssql-sa-password) を mssql-server コンテナーに含めます。

  6. 次のように、controldb ポッド用の新しいデータ (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 シークレットのパスワードを使い、sa として controldb の SQL サーバーに接続します。

  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 シークレットのパスワードを使って controldb-rw-user ログインを作成し (CREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>')、コントローラー DB の既存の controldb-rw-user ユーザーに関連付けます (ALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user])。

  2. TSQL を使って sa ログインを無効にします (ALTER LOGIN [sa] DISABLE)。

  3. controldb StatefulSet を編集し、controller-sa-secret ボリュームとそれに対応するボリューム マウントを削除します。

  4. controller-sa-secret シークレットを削除します。

  5. kubectl scale コマンドを使い、コントローラー ReplicaSet をスケールアップして 1 レプリカに戻します。

Azure Data Studio ダッシュボード