第一个 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}}'