Kubernetes 的 MySQL 运算符  / 第 3 章 MySQL InnoDB 集群  /  3.6 将预发布的 InnoDB Cluster 升级到 8.0.30-2.0.6 GA

3.6 将预发布的 InnoDB Cluster 升级到 8.0.30-2.0.6 GA

第一个 MySQL Operator for Kubernetes General Availability (GA) 版本改进了安全配置,这使得从 pre-GA 预览版本的升级过程变得复杂。无法在不停机的情况下从预览版(v8.0.28-2.0.3 及更早版本)迁移到 GA 版。

重要的

本指南不适用于未来的升级,例如从 8.0.30-2.0.6 升级到未来的版本。

重要的

如果您运行多个集群,则必须按顺序对所有集群执行这些操作。换句话说,对所有集群执行步骤#1,然后对所有集群执行步骤#2,依此类推。

先决条件

成功的迁移假设 InnoDB Cluster 由 MySQL Operator 8.0.28-2.0.3 管理,并且您拥有具有 root 风格特权的帐户 (rootUser) 的凭据。InnoDB Cluster 必须至少有两个正在运行的 MySQL 实例。在继续之前进行备份。

InnoDBClustermycluster在本指南中命名,并假定它位于默认命名空间中。

升级总结

此处描述的升级过程终止了旧的 InnoDB Cluster,并删除了除一个目录之外的所有数据目录。然后关闭旧的 Kubernetes MySQL Operator。然后,一个临时的 MySQL 服务器被配置为使用剩余的数据目录,然后它成为 donor 来初始化一个具有单个实例的新 InnoDB Cluster。数据克隆完成后,关闭临时(donor)服务器,删除旧数据目录,并将新的 InnodB Cluster 扩展到三个实例。

执行升级

Step #1: 终止旧的 InnoDB Cluster 并删除除一个之外的所有数据目录。此示例使用 kubectl 并观察终止过程:

$> kubectl delete innodbcluster mycluster
$> kubectl get pods -w

删除 InnoDB Cluster 不会删除其关联的 PersistentVolumeClaims,如下所示:

$> kubectl get pvc

删除除编号最高的那个以外的所有。例如,对于三节点集群,保留索引为 2 的集群:

$> kubectl delete pvc datadir-mycluster-0  datadir-mycluster-1

注意保留一个,否则数据无法恢复;在这种情况下,不要删除 datadir-mycluster-2。

Step #2:终止 Kubernetes 的 MySQL Operator;通过删除控制它的关联 Deployment 来做到这一点:

$> kubectl delete deployment -n mysql-operator mysql-operator

Step #3:使用 datadir PersistentVolumeClaim 创建临时 MySQL 服务器,但首先将凭据存储在 Secret 中:

$> kubectl create secret generic myfixer \
     --from-literal=rootUser="root" \
     --from-literal=rootPassword="YOUR_PASSWORD"

这个Secret用于设置临时服务器,也用于将数据克隆到新的InnoDB Cluster中。

将以下清单保存到一个文件中,比如 myfixer.yaml,然后应用它。如果 datadir-mycluster-2 不是您保留的 datadir PVC,则相应地修改名称。

apiVersion: v1
kind: ConfigMap
metadata:
  name: mycnf
data:
  my.cnf: |
    [mysqld]
    plugin_load_add=auth_socket.so
    loose_auth_socket=FORCE_PLUS_PERMANENT
    skip_log_error
    log_error_verbosity=3
    skip_log_bin
    skip_slave_start=1
---
apiVersion: v1
kind: Pod
metadata:
  name: myfixer
spec:
  restartPolicy: Never
  containers:
  - image: mysql/mysql-server:8.0.30
    imagePullPolicy: IfNotPresent
    name: myfixer
    args: [ 'mysqld', '--defaults-file=/mycnf/my.cnf' ]
    env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
          key: rootPassword
          name: myfixer

    volumeMounts:
    - name: datadir
      mountPath: /var/lib/mysql
    - name: mycnf
      mountPath: /mycnf
            
  volumes:
  - name: datadir
    persistentVolumeClaim:
      claimName: datadir-mycluster-2
  - name: mycnf 
    configMap:
      name: mycnf

应用它:

$> kubectl apply -f myfixer.yaml

准备好后检索 Pod 的 IP:

$> kubectl get pod -o wide myfixer

第六列有 IP 地址,您可以使用您存储的凭据使用 shell 会话验证服务器是否正确启动(当您看到“如果没有看到命令提示符,请尝试按回车键”时输入 rootUser 的密码):

$> kubectl run testshell --restart=Never --rm --image=mysql/mysql-operator:8.0.30-2.0.6 -it -- mysqlsh -uroot -h{IP_HERE}

Step #4:如安装文档中所述,为 Kubernetes 部署一个新的 MySQL Operator。例如:

$> kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-crds.yaml
$> kubectl apply -f https://raw.githubusercontent.com/mysql/mysql-operator/trunk/deploy/deploy-operator.yaml

Step #5:按照安装文档部署新的 InnoDB Cluster ,并使用之前创建的临时服务器作为捐赠者;但首先按照手册中的描述为您的管理用户创建一个秘密。例如:

$> kubectl create secret generic mypwds \
        --from-literal=rootUser="root" \
        --from-literal=rootHost="%" \
        --from-literal=rootPassword="YOUR_PASSWORD"

以下清单显示了 initDB 定义,此示例假设一个名为ic.yaml.

apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
  name: mycluster
spec:
  tlsUseSelfSigned: true
  instances: 1                  # Important deploy a single instance only
  secretName: mypwds            # Name of Secret for new InnoDBCluster
  version: 8.0.30               # Important must equal the server used as temporary donor
  router:
    instances: 1
  initDB:
    clone:
      donorUrl: root@{IP_HERE}:3306  # Use your myfixer user/ip here
      secretKeyRef:
        name: myfixer # Secret on the temporary server
  # Add custom options like configuration settings, storage configuration etc. as needed

应用它:

$> kubectl apply -f ic.yaml

现在观察状态,直到单个MySQL实例集群就绪。所需时间取决于要克隆的数据量。

$> kubectl get ic mycluster -w

Step #6: 删除临时服务器并扩展 InnoDB Cluster。

在确认您的新 InnoDB 集群在线并拥有您的克隆数据后,删除临时服务器及其相关配置,以及旧数据目录的 PersistentVolumeClaim:

$> kubectl delete -f  myfixer.yaml
$> kubectl delete secret myfixer

$> kubectl delete pvc datadir-mycluster-2

根据需要扩展 InnoDB Cluster MySQL 实例,例如:

$> kubectl patch ic mycluster --type=merge -p '{"spec": {"instances": 3}}'