• OpenShift 4 - 用 Percona XtraDB Cluster 在 OpenShift 部署运行 MySQL 多副本集群


    OpenShift 4.x HOL教程汇总
    说明:本文已经在 OpenShift 4.11 环境中验证。

    如何实现多实例 MySQL 数据库

    我们可以使用多种方式实现多实例运行 MySQL 数据库,来提升数据的访问性能或面对故障的可用性。

    1. 基于 CDC 软件(参见 OpenShift 4 - 使用 Debezium 捕获变化数据,实现MySQL到PostgreSQL数据库同步)- 使用此方法同步的多 MySQL 实例通常使用一个主多从的运行模式,即只向“主”数据库实例写入数据,而可从多个“从”数据库读数据。
    2. 基于 MySQL 的 Replication 功能(参见 OpenShift 4 - 部署MySQL主从复制数据库)- 和 CDC 软件类似,使用 MySQL 的 Replication 功能实现的多 MySQL 实例通常使用一个主多从的运行模式,即只向“主”数据库实例写入数据,而可从多个“从”数据库读数据。
    3. 基于 MySQL 的复制组(Replication Group)功能 - 复制组中的数据库实例可都为“主”角色,这样在任何实例上对数据库的更改操作都将在组中其他节点同样被执行。
    4. 基于 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

    1. 为了提高集群面对故障的可用性,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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 创建名为 mysql 的项目。
    2. 在 OperatorHub 的 Database 分类中查找 mysql,然后进入标有 Community 的 Percona Operator for MySQL based on Percona XtraDB Cluster,然后使用默认选项在 mysql 命名空间中安装此 Operator。
      在这里插入图片描述
    3. 进入安装成功的 Percona Operator for MySQL based on Percona XtraDB Cluster。
      在这里插入图片描述
    4. 将缺省配置中的 name 设为 mysql-cluster1,然后创建一个 PerconaXtraDBCluster 实例。
      在这里插入图片描述
    5. 可在“开发者”视图中查看 PerconaXtraDBCluster 实例相关资源部署情况。完成部署后会看到 2 个 StatefulSet 对象,它们分别对应 MySQL 数据库和 ProxySQL,并且每个对象都有 3 个 Pod。
      在这里插入图片描述
    6. 分别执行以下命令查看创建的其他资源。
    $ 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    1. 获得 MySQL 的 root 用户的登录密码。
    $ PASSWORD=$(oc get secret mysql-cluster1-secrets -n mysql --template={{.data.root}} | base64 -d)
    
    • 1

    数据写入测试验证

    通过 haproxy 访问数据库

    1. 执行命令,运行包含 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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 执行以下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');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    直接访问 MySQL 实例 0

    1. 进入 mysql-cluster1-pxc-0 实例
    $ oc rsh -n mysql -c pxc mysql-cluster1-pxc-0 mysql -uroot -p${PASSWORD}
    
    • 1
    1. 确认在 testdb 数据库中有 test 表和数据。
    mysql> select * from testdb.test;
    +------+
    | name |
    +------+
    | 1    |
    | 2    |
    | 3    |
    | 4    |
    +------+
    4 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    直接访问 MySQL 实例 1

    1. 进入 mysql-cluster1-pxc-1 实例
    $ oc rsh -n mysql -c pxc mysql-cluster1-pxc-1 mysql -uroot -p${PASSWORD}
    
    • 1
    1. 确认在 testdb 数据库中有 test 表和数据。
    mysql> select * from testdb.test;
    +------+
    | name |
    +------+
    | 1    |
    | 2    |
    | 3    |
    | 4    |
    +------+
    4 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 执行命令修改一行记录。
    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
    
    • 1
    • 2
    • 3

    直接访问 MySQL 实例 2

    1. 进入 mysql-cluster1-pxc-2 实例
    $ oc rsh -n mysql -c pxc mysql-cluster1-pxc-2 mysql -uroot -p${PASSWORD}
    
    • 1
    1. 确认在 testdb 数据库中有 test 表和数据,且数据已经更新。
    mysql> select * from testdb.test;
    +------+
    | name |
    +------+
    | 1    |
    | 2    |
    | 33   |
    | 4    |
    +------+
    4 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. 执行命令删除一行记录。
    mysql> delete from testdb.test where name=33;
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    • 1
    • 2
    • 3

    确认数据

    分别直接访问3个 MySQL 实例,执行以下命令确认 testdb.test 当年数据状态如下:

    mysql> select * from testdb.test;
    +------+
    | name |
    +------+
    | 1    |
    | 2    |
    | 4    |
    +------+
    3 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    集群扩展验证

    如果此时 OpenShift 还有空余 worker 节点(即 worker 节点数少于运行 mysql 集群的 pxc 实例数),则可以通过修改 PerconaXtraDBCluster 集群实例中 pxc 部分的 size 参数来增加运行 mysql 的实例。

    在向集群增加新实例后,确认当前数据会自动同步到新运行的 MySQL 数据库中。

    演示视频

    视频

  • 相关阅读:
    前端精度问题 (id 返回的和传给后端的不一致问题)
    @Scheduled定时器
    web应用程序、Django框架的学习
    移远通信C-V2X模组产品 助力车载生态建设跑出“加速度”
    petalinux中加入驱动模块
    Https握手过程
    AQS之LimitLatch分析 (十)
    ARCGIS之成片区开发方案报备坐标txt格式批量导出工具(定制开发版)
    北斗卫星:助力森林病虫害防治监测的革新技术
    LCR 146.螺旋遍历数组
  • 原文地址:https://blog.csdn.net/weixin_43902588/article/details/126821013