说明:本文已经在 OpenShift 4.11 环境中验证。
文章目录
- 如何实现多实例 MySQL 数据库
- Percona XtraDB Cluster 简介
- 在 OpenShift 中用 Operator 部署 Percona XtraDB Cluster
- 安装和配置 Percona XtraDB Cluster
- 数据写入测试验证
- 通过 haproxy 访问数据库
- 直接访问 MySQL 实例 0
- 直接访问 MySQL 实例 1
- 直接访问 MySQL 实例 2
- 确认数据
- 集群扩展验证
- 演示视频
如何实现多实例 MySQL 数据库
我们可以使用多种方式实现多实例运行 MySQL 数据库,来提升数据的访问性能或面对故障的可用性。
- 基于 CDC 软件(参见 OpenShift 4 - 使用 Debezium 捕获变化数据,实现MySQL到PostgreSQL数据库同步)- 使用此方法同步的多 MySQL 实例通常使用一个主多从的运行模式,即只向“主”数据库实例写入数据,而可从多个“从”数据库读数据。
- 基于 MySQL 的 Replication 功能(参见 OpenShift 4 - 部署MySQL主从复制数据库)- 和 CDC 软件类似,使用 MySQL 的 Replication 功能实现的多 MySQL 实例通常使用一个主多从的运行模式,即只向“主”数据库实例写入数据,而可从多个“从”数据库读数据。
- 基于 MySQL 的复制组(Replication Group)功能 - 复制组中的数据库实例可都为“主”角色,这样在任何实例上对数据库的更改操作都将在组中其他节点同样被执行。
- 基于 Percona XtraDB Cluster(PXC)软件 - 可实现 MySQL 复制组相同的功能,即 PXC 集群中所有节点的功能都是对等的,客户可在任何节点进行读写,只不过 PXC 和 Replication Group 的数据复制机制不同。
Percona XtraDB Cluster 简介
Percona XtraDB Cluster 使用了 Galera Replication 的复制机制,可在多个 MySQL 数据库之间实现同步复制。PXC 可通过分布式事务将对一个 MySQL 数据库实例的操作事务实施于 PXC 所有数据实例,只有所有数据库都操作成功后,数据事务才完成,这样就有效的保障了多数据库实例之间的数据的一致性。
另外,Percona XtraDB Cluster 还提供了 proxysql,它为客户端访问数据库提供负载均衡功能,这样用户访问多实例的 MySQL 集群就完全透明了。
在 OpenShift 中用 Operator 部署 Percona XtraDB Cluster
安装和配置 Percona XtraDB Cluster
- 为了提高集群面对故障的可用性,Percona XtraDB Cluster 部署的多实例 mysql 需要运行在 OpenShift 集群的不同节点上,否则部署集群不会成功。执行以下命令查看 OpenShift 集群的 worker 节点至少有 3 个。
$ oc get node -l node-role.kubernetes.io/worker=''
NAME STATUS ROLES AGE VERSION
ip-10-0-159-73.us-east-2.compute.internal Ready worker 103m v1.23.5+012e945
ip-10-0-210-245.us-east-2.compute.internal Ready worker 103m v1.23.5+012e945
ip-10-0-227-136.us-east-2.compute.internal Ready worker 102m v1.23.5+012e945
- 创建名为 mysql 的项目。
- 在 OperatorHub 的 Database 分类中查找 mysql,然后进入标有 Community 的 Percona Operator for MySQL based on Percona XtraDB Cluster,然后使用默认选项在 mysql 命名空间中安装此 Operator。
- 进入安装成功的 Percona Operator for MySQL based on Percona XtraDB Cluster。
- 将缺省配置中的 name 设为 mysql-cluster1,然后创建一个 PerconaXtraDBCluster 实例。
- 可在“开发者”视图中查看 PerconaXtraDBCluster 实例相关资源部署情况。完成部署后会看到 2 个 StatefulSet 对象,它们分别对应 MySQL 数据库和 ProxySQL,并且每个对象都有 3 个 Pod。
- 分别执行以下命令查看创建的其他资源。
$ oc get statefulset -n mysql
NAME READY AGE
mysql-cluster1-haproxy 3/3 28m
mysql-cluster1-pxc 3/3 28m
$ oc get pvc -n mysql
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
datadir-mysql-cluster1-pxc-0 Bound pvc-507bf962-2b60-4595-ad9c-0b2b833d2d51 6Gi RWO gp2 29m
datadir-mysql-cluster1-pxc-1 Bound pvc-e276ef7b-df03-4398-9e96-9999abe355b2 6Gi RWO gp2 28m
datadir-mysql-cluster1-pxc-2 Bound pvc-5e5b243d-9d52-4d6b-933e-e1dcc6f64419 6Gi RWO gp2 27m
$ oc get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-507bf962-2b60-4595-ad9c-0b2b833d2d51 6Gi RWO Delete Bound mysql/datadir-mysql-cluster1-pxc-0 gp2 29m
pvc-5e5b243d-9d52-4d6b-933e-e1dcc6f64419 6Gi RWO Delete Bound mysql/datadir-mysql-cluster1-pxc-2 gp2 27m
pvc-e276ef7b-df03-4398-9e96-9999abe355b2 6Gi RWO Delete Bound mysql/datadir-mysql-cluster1-pxc-1 gp2 28m
$ oc get pod -n mysql
NAME READY STATUS RESTARTS AGE
mysql-cluster1-haproxy-0 2/2 Running 0 21m
mysql-cluster1-haproxy-1 2/2 Running 0 20m
mysql-cluster1-haproxy-2 2/2 Running 0 20m
mysql-cluster1-pxc-0 3/3 Running 0 21m
mysql-cluster1-pxc-1 3/3 Running 0 20m
mysql-cluster1-pxc-2 3/3 Running 0 19m
percona-xtradb-cluster-operator-648cf8bbdf-7v47l 1/1 Running 0 25m
$ oc get svc -n mysql
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-cluster1-haproxy ClusterIP 172.30.115.92 <none> 3306/TCP,3309/TCP,33062/TCP,33060/TCP 25m
mysql-cluster1-haproxy-replicas ClusterIP 172.30.142.115 <none> 3306/TCP 25m
mysql-cluster1-pxc ClusterIP None <none> 3306/TCP,33062/TCP,33060/TCP 25m
mysql-cluster1-pxc-unready ClusterIP None <none> 3306/TCP,33062/TCP,33060/TCP 25m
percona-xtradb-cluster-operator ClusterIP 172.30.67.39 <none> 443/TCP 28m
- 获得 MySQL 的 root 用户的登录密码。
$ PASSWORD=$(oc get secret mysql-cluster1-secrets -n mysql --template={{.data.root}} | base64 -d)
数据写入测试验证
通过 haproxy 访问数据库
- 执行命令,运行包含 MySQL 客户端的镜像。 使用 root 用户和对应密码,通过 haproxy 登录 mysql。
$ oc run -i --rm --tty percona-client --image=percona:8.0 --restart=Never -- mysql -h mysql-cluster1-haproxy -uroot -p${PASSWORD}
If you dont see a command prompt, try pressing enter.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3301
Server version: 8.0.27-18.1 Percona XtraDB Cluster (GPL), Release rel18, Revision ac35177, WSREP version 26.4.3
Copyright (c) 2009-2022 Percona LLC and/or its affiliates
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
- 执行以下SQL,先创建 testdb 数据库,然后创建 test 表,在添加测试数据。
CREATE DATABASE testdb;
USE testdb;
create table test(name VARCHAR(255), PRIMARY KEY (`name`));
insert into test value('1');
insert into test value('2');
insert into test value('3');
insert into test value('4');
直接访问 MySQL 实例 0
- 进入 mysql-cluster1-pxc-0 实例
$ oc rsh -n mysql -c pxc mysql-cluster1-pxc-0 mysql -uroot -p${PASSWORD}
- 确认在 testdb 数据库中有 test 表和数据。
mysql> select * from testdb.test;
+------+
| name |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
4 rows in set (0.00 sec)
直接访问 MySQL 实例 1
- 进入 mysql-cluster1-pxc-1 实例
$ oc rsh -n mysql -c pxc mysql-cluster1-pxc-1 mysql -uroot -p${PASSWORD}
- 确认在 testdb 数据库中有 test 表和数据。
mysql> select * from testdb.test;
+------+
| name |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
4 rows in set (0.00 sec)
- 执行命令修改一行记录。
mysql> update testdb.test set name=33 where name=3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
直接访问 MySQL 实例 2
- 进入 mysql-cluster1-pxc-2 实例
$ oc rsh -n mysql -c pxc mysql-cluster1-pxc-2 mysql -uroot -p${PASSWORD}
- 确认在 testdb 数据库中有 test 表和数据,且数据已经更新。
mysql> select * from testdb.test;
+------+
| name |
+------+
| 1 |
| 2 |
| 33 |
| 4 |
+------+
4 rows in set (0.00 sec)
- 执行命令删除一行记录。
mysql> delete from testdb.test where name=33;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
确认数据
分别直接访问3个 MySQL 实例,执行以下命令确认 testdb.test 当年数据状态如下:
mysql> select * from testdb.test;
+------+
| name |
+------+
| 1 |
| 2 |
| 4 |
+------+
3 rows in set (0.00 sec)
集群扩展验证
如果此时 OpenShift 还有空余 worker 节点(即 worker 节点数少于运行 mysql 集群的 pxc 实例数),则可以通过修改 PerconaXtraDBCluster 集群实例中 pxc 部分的 size 参数来增加运行 mysql 的实例。
在向集群增加新实例后,确认当前数据会自动同步到新运行的 MySQL 数据库中。