你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
部署 Azure Arc 数据服务时,Azure Arc 数据控制器是部署的最关键组件之一。 数据控制器的功能包括:
- 预配、取消预配和更新资源
- 协调 Azure Arc 启用的 SQL 托管实例的大部分活动,例如升级、横向扩展等。
- 捕获每个 Arc SQL 托管实例的计费和使用情况信息。
为了执行上述功能,数据控制器需要存储所有当前 Arc SQL 托管实例的清单、计费、使用情况以及所有这些 SQL 托管实例的当前状态。 所有这些数据存储在部署到 controller Pod 的 SQL Server 实例中名为 controldb-0 的数据库。
本文介绍如何备份控制器数据库。
备份数据控制器数据库
作为内置功能的一部分,启用备份后,数据控制器数据库 controller 每 5 分钟自动备份一次。 若要启用备份,请执行以下操作:
- 使用支持
backups-controldb访问的存储类创建PersistentVolumeClaimReadWriteMany:
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
.bak 数据库的 controller 文件存储在 backups 处 controldb Pod 的 /var/opt/backups/mssql 卷上。
恢复控制器数据库
可以进行两种类型的恢复:
-
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的内容。验证连接性:使用解码的凭据,运行
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"
将控制器 ReplicaSet 缩减到 0 个副本,如下所示:
kubectl scale --replicas=0 rs/control -n <namespace>`例如:
kubectl scale --replicas=0 rs/control -n arcdataservices如步骤 1 所述,以
controldb身份连接到systemSQL Server。使用 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将
controldbStatefulSet 纵向缩减到 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>使用
controldb命令编辑controller-sa-secretStatefulSet,以在/var/run/secrets/mounts/credentials/mssql-sa-password容器中包含mssql-server卷和相应的卷装载 (kubectl edit sts controldb -n <namespace>)。为
data-controldbPod 创建新的数据 (logs-controldb) 和日志 (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>使用以下命令将
controldbStatefulSet 缩减回 1 个副本:kubectl scale --replicas=1 sts/controldb -n <namespace>使用前面创建的
controldb机密中的密码,以sa身份连接到controller-sa-secretSQL Server。使用
systemkubernetes 机密中的密码创建具有 sysadmin 角色的controller-system-secret登录名,如下所示: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
使用
controldb-rw-user机密controller-db-rw-secret中的密码创建CREATE LOGIN [controldb-rw-user] WITH PASSWORD = '<password-from-secret>'登录名,并将其与控制器 DBcontroldb-rw-user中的现有ALTER USER [controldb-rw-user] WITH LOGIN = [controldb-rw-user]用户相关联。使用 TSQL -
sa禁用ALTER LOGIN [sa] DISABLE登录名。编辑
controldbStatefulSet 以删除controller-sa-secret卷和相应的卷装载。删除
controller-sa-secret机密。使用
kubectl scale命令将控制器 ReplicaSet 纵向扩展回 1 个副本。