暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL Group Replication介绍

数据库知多少 2021-04-26
2223


MySQL Group Replication介绍

    在MySQL 5.7版本中,发布了Mysql  Group Replication 插件。MGR是一个官方提供的多节点数据同步解决方案,到现在已经5年的时间了,随着8.0各个版本的发布,其功能不断发展成熟,目前已有好多公司应用在了生产环境中。


数据库信息

Current user: root@localhost

SSL:         Not in use

Server version: 8.0.18 MySQL Community Server - GPL

Protocol version: 10

Connection:  Localhost via UNIX socket

背景

    MySQL Group Replication是2016年MySQL官方在5.7版本中推出的多节点数据同步解决方案,它支持多节点写和强一致性。

  一致性,基于原生复制及paxos协议的组复制技术,并以插件的方式提供,提供一致数据安全保证; 

  高容错性,只要不是大多数节点坏掉就可以继续工作,有自动检测机制,当不同节点产生资源争用冲突时,不会出现错误,按照先到者优先原则进行处理,并且内置了自动化脑裂防护机制; 

✔ 高扩展性,节点的新增和移除都是自动的,新节点加入后,会自动从其他节点上同步状态,直到新节点和其他节点保持一致,如果某节点被移除了,其他节点自动更新组信息,自动维护新的组信息; 

  高灵活性,有单主模式和多主模式,单主模式下,会自动选主,所有更新操作都在主上进行;多主模式下,所有server都可以同时处理更新操作。

虽然有许多的优点,如果要使用MGR功能的话,也是有一些限制的:

    ▶ 仅用于InnoDB存储引擎(事务和行级锁)
    ▶ 表必须有主键
    ▶ 必须启用GTID
    ▶ 必须开启二进制日志,并且其格式必须为ROW(binlog_format=row)
    ▶ 冲突DDl、DML只能在同一成员上执行成功
    ▶ 在多主结构中,不完全支持外键
    ▶ 不支持serializable的事务隔离级别
    ▶ 只支持IPv4,并且需要低延迟,高带宽的网络环境
    ▶ MGR最大支持9个成员
    ▶ 复制信息元数据必须存在于系统表(master-info-repository=TABLE、relay-log-info-repository=TABLE)
    ▶ 不支持复制过滤
    ▶ 二进制日志checksums必须关闭(binlog-checksum=NONE
    ▶ 不支持savepoint的使用
    ▶ 不支持超大事务

    MGR的切换流程:


    软件版本的选择


        MySQL Group Replication 功能是在MySQL-5.7.17这个版本上引入的,MGR基于分布式paxos协议,实现组复制,保证数据一致性。内置故障检测和自动选主功能,它实现了MySQL各个结点间数据强一致性。但是在5.7.20版本之前,MySQL Group Replication还不完善,存在各种问题,所以搭建MySQL Group Replication集群建议采用5.7.20之后的版本,最好采用8.0版本。本文档采用8.0.18来搭建MGR集群环境,且采用MGR的单主模式。


    搭建MGR架构


    1.1 采用三台主机进行搭建,单机的搭建过程请参考其它文章;

    主机IP
    端口

    10.1.12.126

    3306
    10.1.12.1273306
    10.1.12.1283306


    1.2 配置第一个实例

    在主机10.1.12.126搭建完单机数据库实例。

    其中my.cnf文件的配置调整:

    其中:loose-group_replication_group_name 可通过select uuid();生成,三个实例名称一致

      ############### REPLICATION ###############
      binlog_checksum = NONE
      binlog_format = ROW
      master_info_repository = TABLE
      relay_log_info_repository = TABLE
      server_id = 3299825126
      skip_slave_start                    = ON
      ################Group Replication##########
      transaction_write_set_extraction=XXHASH64
      loose-group_replication_group_name="9d247241-38c5-11e9-80a5-005056b57b19"
      loose-group_replication_start_on_boot=off
      loose-group_replication_local_address="10.1.12.126:24901"
      loose-group_replication_group_seeds="10.1.12.126:24901,10.1.12.127:24901,10.1.12.128:24901"
      loose-group_replication_bootstrap_group=off

        1.3 启动10.1.12.126上实例

        cd  $MYSQL_HOME
        bin/mysqld_safe --defaults-file=/mysql/my3306/my.cnf

        1.4 创建复制用户与授权,并让其作为group的第一个成员:

          SET SQL_LOG_BIN=0;
          CREATE USER dbsync@’%’ IDENTIFIED BY 'dbsync@1234';
          GRANT REPLICATION SLAVE ON *.* TO dbsync@’%’;
          FLUSH PRIVILEGES;
          SET SQL_LOG_BIN=1;
          CHANGE MASTER TO MASTER_USER='dbsync', MASTER_PASSWORD='dbsync@1234' FOR CHANNEL 'group_replication_recovery';

          1.5 安装MGR插件

            安装GR插件
            (root@localhost) [(none)]> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
            Query OK, 0 rows affected (0.07 sec)
            可以检查安装结果:
            (root@localhost) [(none)]> SELECT * FROM information_schema.plugins WHERE PLUGIN_NAME LIKE '%group%'\G
            *************************** 1. row ***************************
                       PLUGIN_NAME: group_replication
                    PLUGIN_VERSION: 1.0
                     PLUGIN_STATUS: ACTIVE
                       PLUGIN_TYPE: GROUP REPLICATION
               PLUGIN_TYPE_VERSION: 1.1
                    PLUGIN_LIBRARY: group_replication.so
            PLUGIN_LIBRARY_VERSION: 1.7
                     PLUGIN_AUTHOR: Oracle
                PLUGIN_DESCRIPTION: Group Replication (1.0.0)
                    PLUGIN_LICENSE: GPL
                       LOAD_OPTION: ON
            1 row in set (0.00 sec)

            1.6 开启第一个组复制

              (root@localhost) [(none)]> SET GLOBAL group_replication_bootstrap_group=ON;
              (root@localhost) [(none)]> START GROUP_REPLICATION;
              (root@localhost) [(none)]> SET GLOBAL group_replication_bootstrap_group=OFF;

              启动组复制之后将group_replication_bootstrap_group设置为OFF

              This option must only be set on one server and only when starting the group for the first time or restarting the entire group. After the group has been bootstrapped, set this option to OFF. It should be set to OFF both dynamically and in the configuration files

              1.7 检查组复制成员

              member_id是@@server_uuid的值

                (root@localhost) [(none)]> SELECT * FROM performance_schema.replication_group_members;
                +---------------------------+--------------------------------------+-------------+-------------+--------------+
                | CHANNEL_NAME    | MEMBER_ID  | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
                +---------------------------+--------------------------------------+-------------+-------------+--------------+
                | group_replication_applier | 9d247241-38c5-11e9-80a5-005056b57b19 | mysql01| 3306 | ONLINE  |
                +---------------------------+--------------------------------------+-------------+-------------+--------------+
                1 row in set (0.00 sec)


                配置第二个实例10.1.12.127

                2.1 安装软件

                在主机10.1.12.127搭建完单机数据库实例。

                其中my.cnf文件的配置调整:

                其中:

                loose-group_replication_group_name 可通过select uuid();生成

                server_id  每个实例值不同

                  ############# REPLICATION #############
                  binlog_checksum = NONE
                  binlog_format = ROW
                  master_info_repository = TABLE
                  relay_log_info_repository = TABLE
                  server_id = 3299825127
                  skip_slave_start                    = ON
                  ################Group Replication##########
                  transaction_write_set_extraction=XXHASH64
                  loose-group_replication_group_name="9d247241-38c5-11e9-80a5-005056b57b19"
                  loose-group_replication_start_on_boot=off
                  loose-group_replication_local_address="10.1.12.127:24901"
                  loose-group_replication_group_seeds="10.1.12.126:24901,10.1.12.127:24901,10.1.12.128:24901"
                  loose-group_replication_bootstrap_group=off

                  2.2 启动10.1.12.127上实例

                    cd  $MYSQL_HOME
                    bin/mysqld_safe --defaults-file=/mysql/my3306/my.cnf &

                    2.3 创建复制用户与授权,并让其作为group的第二个成员

                      SET SQL_LOG_BIN=0;
                      CREATE USER dbsync@’%’ IDENTIFIED BY 'dbsync@1234';
                      GRANT REPLICATION SLAVE ON *.* TO dbsync@’%’;
                      FLUSH PRIVILEGES;
                      SET SQL_LOG_BIN=1;
                      CHANGE MASTER TO MASTER_USER='dbsync', MASTER_PASSWORD='dbsync@1234' FOR CHANNEL 'group_replication_recovery';

                      2.4 安装MGR插件

                        安装GR插件
                        (root@localhost) [(none)]> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
                        Query OK, 0 rows affected (0.07 sec)
                        可以检查安装结果:
                        (root@localhost) [(none)]> SELECT * FROM information_schema.plugins WHERE PLUGIN_NAME LIKE '%group%'\G
                        *************************** 1. row ***************************
                                   PLUGIN_NAME: group_replication
                                PLUGIN_VERSION: 1.0
                                 PLUGIN_STATUS: ACTIVE
                                   PLUGIN_TYPE: GROUP REPLICATION
                           PLUGIN_TYPE_VERSION: 1.1
                                PLUGIN_LIBRARY: group_replication.so
                        PLUGIN_LIBRARY_VERSION: 1.7
                                 PLUGIN_AUTHOR: Oracle
                            PLUGIN_DESCRIPTION: Group Replication (1.0.0)
                                PLUGIN_LICENSE: GPL
                                   LOAD_OPTION: ON
                        1 row in set (0.00 sec)

                        2.5 开启组复制

                           (root@localhost) [(none)]> START GROUP_REPLICATION;

                          2.6 检查组复制情况

                            (root@localhost) [(none)]> SELECT * FROM performance_schema.replication_group_members;
                            +---------------------------+--------------------------------------+-------------+-------------+--------------+
                            | CHANNEL_NAME  | MEMBER_ID  | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
                            +---------------------------+--------------------------------------+-------------+-------------+--------------+
                            | group_replication_applier | 9d247241-38c5-11e9-80a5-005056b57b19 | mysql01| 3306  | ONLINE |
                            | group_replication_applier | 9d247241-38c5-11e9-80a5-005056b57b19 | mysql02 | 3306| ONLINE |
                            +---------------------------+--------------------------------------+-------------+-------------+--------------+
                            2 rows in set (0.00 sec)


                            配置第三个实例10.1.12.128

                            3.1 安装软件

                            在主机10.1.12.128搭建完单机数据库实例。

                            其中my.cnf文件的配置调整:

                            其中:loose-group_replication_group_name 可通过select uuid();生成

                            server_id  每个实例值不同

                              ############# REPLICATION #############
                              binlog_checksum = NONE
                              binlog_format = ROW
                              master_info_repository = TABLE
                              relay_log_info_repository = TABLE
                              server_id = 3299825128
                              skip_slave_start                    = ON
                              ################Group Replication##########
                              transaction_write_set_extraction=XXHASH64
                              loose-group_replication_group_name="9d247241-38c5-11e9-80a5-005056b57b19"
                              loose-group_replication_start_on_boot=off
                              loose-group_replication_local_address="10.1.12.128:24901"
                              loose-group_replication_group_seeds="10.1.12.126:24901,10.1.12.127:24901,10.1.12.128:24901"
                              loose-group_replication_bootstrap_group=off

                              3.2 启动10.1.12.128上实例

                                cd  $MYSQL_HOME
                                bin/mysqld_safe --defaults-file=/mysql/my3306/my.cnf &

                                3.3 创建复制用户与授权,并让其作为group的第三个成员:

                                  SET SQL_LOG_BIN=0;
                                  CREATE USER dbsync@’%’ IDENTIFIED BY 'dbsync@1234';
                                  GRANT REPLICATION SLAVE ON *.* TO dbsync@’%’;
                                  FLUSH PRIVILEGES;
                                  SET SQL_LOG_BIN=1;
                                  CHANGE MASTER TO MASTER_USER='dbsync', MASTER_PASSWORD='dbsync@1234' FOR CHANNEL 'group_replication_recovery';

                                  3.4 安装MGR插件

                                    安装GR插件
                                    (root@localhost) [(none)]> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
                                    Query OK, 0 rows affected (0.07 sec)
                                    可以检查安装结果:
                                    (root@localhost) [(none)]> SELECT * FROM information_schema.plugins WHERE PLUGIN_NAME LIKE '%group%'\G
                                    *************************** 1. row ***************************
                                               PLUGIN_NAME: group_replication
                                            PLUGIN_VERSION: 1.0
                                             PLUGIN_STATUS: ACTIVE
                                               PLUGIN_TYPE: GROUP REPLICATION
                                       PLUGIN_TYPE_VERSION: 1.1
                                            PLUGIN_LIBRARY: group_replication.so
                                    PLUGIN_LIBRARY_VERSION: 1.7
                                             PLUGIN_AUTHOR: Oracle
                                        PLUGIN_DESCRIPTION: Group Replication (1.0.0)
                                            PLUGIN_LICENSE: GPL
                                               LOAD_OPTION: ON
                                    1 row in set (0.00 sec)

                                    3.5 开启组复制

                                       (root@localhost) [(none)]> START GROUP_REPLICATION;

                                      3.6 检查组复制情况

                                        (root@localhost) [(none)]> SELECT * FROM performance_schema.replication_group_members;
                                        +---------------------------+--------------------------------------+-------------+-------------+--------------+
                                        | CHANNEL_NAME  | MEMBER_ID  | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
                                        +---------------------------+--------------------------------------+-------------+-------------+--------------+
                                        | group_replication_applier | 9d247241-38c5-11e9-80a5-005056b57b19 | mysql01| 3306  | ONLINE |
                                        | group_replication_applier |9d247241-38c5-11e9-80a5-005056b57b19 | mysql02| 3306| ONLINE|
                                        | group_replication_applier | 9d247241-38c5-11e9-80a5-005056b57b19 | mysql03| 3306 | ONLINE|
                                        +---------------------------+--------------------------------------+-------------+-------------+--------------+
                                        2 rows in set (0.00 sec)

                                        至此,MySQL MGR架构就已经搭建完毕了,enjoy it!


                                        常用命令

                                            

                                        1. 查看成员信息:

                                          mysql > select * from performance_schema.replication_group_members;  

                                          2. 查看节点信息:

                                            mysql > select * from performance_schema.replication_group_member_stats \G

                                            3. 查看主节点:

                                              mysql > select variable_value from performance_schema.global_status where variable_name='group_replication_primary_member';  

                                              4. 查看主节点方式2:

                                                select @@read_only;

                                                正常情况下且是在单主的情况下,从节点都是不可写的,即该参数的值为1,而主节点的值为0

                                                5. 多主模式切换

                                                切换为多主

                                                MGR切换模式需要重新启动组复制,因些需要在所有节点上先关闭组复制,设置 group_replication_single_primary_mode=OFF 等参数,再启动组复制。

                                                  # 停止组复制(所有节点执行):
                                                  mysql> stop group_replication;  
                                                  mysql> set global group_replication_single_primary_mode=OFF;  
                                                  mysql> set global group_replication_enforce_update_everywhere_checks=ON;  
                                                  # 随便选择某个节点执行  
                                                  mysql> SET GLOBAL group_replication_bootstrap_group=ON;  
                                                  mysql> START GROUP_REPLICATION;  
                                                  mysql> SET GLOBAL group_replication_bootstrap_group=OFF;  
                                                  # 其他节点执行  
                                                  mysql> START GROUP_REPLICATION;  
                                                  # 查看组信息,所有节点的 MEMBER_ROLE 都为 PRIMARY  
                                                  mysql> SELECT * FROM performance_schema.replication_group_members;

                                                  6. 切换回单主

                                                    # 所有节点执行  
                                                    mysql> stop group_replication;  
                                                    mysql> set global group_replication_enforce_update_everywhere_checks=OFF;  
                                                    mysql> set global group_replication_single_primary_mode=ON;  
                                                    # 主节点(如主机1)执行  
                                                    SET GLOBAL group_replication_bootstrap_group=ON;  
                                                    START GROUP_REPLICATION;  
                                                    SET GLOBAL group_replication_bootstrap_group=OFF;  
                                                    # 从节点(主机2、主机3)执行  
                                                    START GROUP_REPLICATION;  
                                                    # 查看MGR组信息  
                                                    mysql> SELECT * FROM performance_schema.replication_group_members;

                                                     

                                                    总结

                                                        MySQL组复制提供了高可用、高弹性、可靠的MySQL服务,旨在打造金融级MySQL集群架构。在忽略网络延迟的情况,可以轻松的实现多活和异地容灾近端写库,这一点是业务上比较期待的。组复制是MySQL未来的一个发展趋势,相信在未来的生产环境中会越来越多,MySQL也会也来月稳定。

                                                    =end=

                                                    文章转载自数据库知多少,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                    评论