体验 MySQL Operator backup 备份和恢复 Keycloak

左恺
2023-12-01

Verrazzano在Keycloak中存储用户登录信息。Keycloak使用MySQL作为后端来存储所有持久性数据。本文体验一下如何备份和恢复存储在MySQL中的数据。

使用MySQL Operator进行备份

在命名空间keycloak中创建了一个secret mysql-backup-secret
MySQL Operator需要一个secret来与S3兼容的对象存储进行通信,因此我们创建一个backup-secret.txt文件,其中有对象存储的凭证。

[default]
aws_access_key_id=<object store access key>
aws_secret_access_key=<object store secret key>

MySQL Operator需要创建存储桶的区域名称,所以我们创建一个backup-region.txt文件,其中包含区域信息。

[default]
region=us-east-1

在命名空间keycloak中,创建一个Kubernetes secret,例如mysql-backup-secret。

kubectl create secret generic -n <backup-namespace> <secret-name> --from-file=<key>=<full_path_to_creds_file> --from-file=<key>=<full_path_to_config_file>

示例,

kubectl create secret generic -n keycloak mysql-backup-secret --from-file=credentials=backup-secret.txt --from-file=config=backup-region.txt

要启动MySQL备份,请创建以下示例的自定义资源YAML文件,该文件使用Minio对象存储作为后端。Operator使用spec.backupProfile.dumpInstance.storage.s3.config中引用的secret,与Minio对象存储进行验证。

  • bucketName: 对象存储桶
  • config: mysql-backup-secret,这是你之前在keycloak命名空间中创建的secret的名称。
  • endpoint: Minio 对象存储端点
  • prefix: 前缀名称。这个文件夹将被自动创建
  • clusterName: 必须是mysql
  • namespace: 必须是keycloak。
  • profile: 是安全凭证的配置文件。在这种情况下,它是default
kubectl apply -f - <<EOF
  apiVersion: mysql.oracle.com/v2
  kind: MySQLBackup
  metadata:
      name: mysql-backup
      namespace: keycloak
  spec:
    clusterName: mysql
    backupProfile:       
      name: mysqlOneTime  
      dumpInstance:              
        storage:          
          s3:
             bucketName: backup-bucket
             config: mysql-backup-secret
             endpoint: http://minio.minio:9000
             prefix: mysql-demo
             profile: default  
EOF

使用MySQL Operator进行恢复

要从现有的备份中启动MySQL还原操作,你需要重新创建MySQL集群。使用下面的步骤来成功进行MySQL还原操作。

将MySQL Helm Charts中的值备份到一个文件mysql-values.yaml。

helm get values -n keycloak mysql > mysql-values.yaml

MySQL备份在对象存储中创建一个备份文件夹。获取MySQL备份创建的备份文件夹前缀名称。

kubectl get mysqlbackup -n keycloak <mysql-backup-name> -o jsonpath={.status.output}

示例,

kubectl get mysqlbackup -n keycloak mysql-backup -o jsonpath={.status.output}
mysql-backup-20230312-023532

通常情况下,MySQL Helm Charts存在于Verrazzano平台Operator内部。获取Charts到一个名为mysql-charts的本地目录。

mkdir mysql-charts
kubectl cp -n verrazzano-install \
    $(kubectl get pod -n verrazzano-install -l app=verrazzano-platform-operator \
    -o custom-columns=:metadata.name --no-headers):platform-operator/thirdparty/charts/mysql \
    -c verrazzano-platform-operator mysql-charts/

从系统中删除MySQL pods和PVC。

helm delete mysql -n keycloak
kubectl delete pvc -n keycloak -l tier=mysql

现在你已经从系统中删除了MySQL,通过安装Helm Charts触发MySQL恢复操作。

helm install mysql mysql-charts \
        --namespace keycloak \
        --set initDB.dump.name=<dump-name> \
        --set initDB.dumpOptions.loadUsers=true \
        --set initDB.dump.s3.profile=default \
        --set initDB.dump.s3.prefix=<prefixName/backup folder name> \
        --set initDB.dump.s3.bucketName=<OCI bucket name> \
        --set initDB.dump.s3.config=<Credential Name> \
        --set initDB.dump.s3.endpoint=<OCI S3 endpoint> \
        --values <mysql values file>

示例,

helm install mysql mysql-charts \
        --namespace keycloak \
        --set initDB.dump.name=alpha \
        --set initDB.dump.s3.profile=default \
        --set initDB.dump.s3.prefix=mysql-demo/mysql-backup-20230312-023532 \
        --set initDB.dump.s3.bucketName=backup-bucket \
        --set initDB.dump.s3.config=mysql-backup-secret \
        --set initDB.dump.s3.endpoint=http://minio.minio:9000 \
        --values mysql-values.yaml

执行还原命令后,等待MySQL集群上线。确保STATUS是ONLINE,ONLINE下的计数与INSTANCES相符。

kubectl get innodbclusters -n keycloak mysql

等待所有的MySQL pods处于RUNNING状态。

kubectl wait -n keycloak --for=condition=ready pod -l tier=mysql --timeout=600s

在这一点上,MySQL集群已经从备份中成功恢复了,同时还有之前被删除的PVC。

移除和恢复MySQL集群可能会导致Keycloak pods进入崩溃状态,因为MySQL在恢复操作期间会离线。Keycloak被设置为自我修复,在所有后端都可用后,将进入运行状态。你也可以选择通过使用以下命令强制Keycloak进入运行状态。

KEYCLOAK_REPLICAS=$(kubectl get sts -n keycloak keycloak -o custom-columns=:status.replicas --no-headers)
kubectl scale sts -n keycloak keycloak --replicas=0
kubectl scale sts -n keycloak keycloak --replicas=${KEYCLOAK_REPLICAS}
kubectl wait -n keycloak --for=condition=ready pod -l app.kubernetes.io/instance=keycloak -timeout=600s

完结!

 类似资料: