• 数据库之MySQL部署MGR方案(二)


    零、简介

      MySQL Group Replication(简称MGR)字面意思是mysql组复制的意思,但其实他是一个高可用的集群架构,暂时只支持mysql5.7和mysql8.0版本.

      是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案,提供了高可用、高扩展、高可靠的MySQL集群服务.

      也是mysql官方基于组复制概念并充分参考MariaDB Galera Cluster和Percona XtraDB Cluster结合而来的新的高可用集群架构.

      MySQL Group Replication是建立在基于Paxos的XCom之上的,正因为有了XCom基础设施,保证数据库状态机在节点间的事务一致性,才能在理论和实践中保证数据库系统在不同节点间的事务一致性。

      由一般主从复制概念扩展,多个节点共同组成一个数据库集群,事务的提交必须经过半数以上节点同意方可提交,在集群中每个节点上都维护一个数据库状态机,保证节点间事务的一致性。

      优点:

        高一致性,基于原生复制及paxos协议的组复制技术.

        高容错性,有自动检测机制,当出现宕机后,会自动剔除问题节点,其他节点可以正常使用(类似zk集群),当不同节点产生资源争用冲突时,会按照先到先得处理,并且内置了自动化脑裂防护机制.

        高扩展性,可随时在线新增和移除节点,会自动同步所有节点上状态,直到新节点和其他节点保持一致,自动维护新的组信息.

        高灵活性,直接插件形式安装(5.7.17后自带.so插件),有单主模式和多主模式,单主模式下,只有主库可以读写,其他从库会加上super_read_only状态,只能读取不可写入,出现故障会自动选主.

      缺点:

        还是太新,不太稳定,暂时性能还略差于PXC,对网络稳定性要求很高,至少是同机房做.

      模式:

        支持多主模式,但官方推荐单主模式:

        多主模式下,客户端可以随机向MySQL节点写入数据

        单主模式下,MGR集群会选出primary节点负责写请求,primary节点与其它节点都可以进行读请求处理.

    一、安装

      1、环境规划

        多主模式下最好有三台以上的节点,单主模式则视实际情况而定,不过同个Group最多节点数为9.服务器配置尽量保持一致,因为和PXC一样,也会有"木桶短板效应".

        需要特别注意,mysql数据库的服务端口号和MGR的服务端口不是一回事,需要区分开来.

        而server-id要区分开来是必须的,单纯做主从复制也要满足这一点了.

      2、部署

        由于方便我这里直接用docker部署

    # 拉取MySQL镜像 

    docker pull mysql/mysql-server

    # 创建专门的网络,连接各个容器 

    docker network create mysql_mgr
    docker network ls

    # 创建容器

    for N in 1 2 3
    do docker run -d --name=node$N --net=mysql_mgr --hostname=node$N 
      -v $PWD/d$N:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=mypass 
      mysql/mysql-server 
      --server-id=$N 
      --log-bin='mysql-bin-1.log' 
      --enforce-gtid-consistency='ON' 
      --log-slave-updates='ON' 
      --gtid-mode='ON' 
      --transaction-write-set-extraction='XXHASH64' 
      --binlog-checksum='NONE' 
      --master-info-repository='TABLE' 
      --relay-log-info-repository='TABLE' 
      --plugin-load='group_replication.so' 
      --relay-log-recovery='ON' 
      --group-replication-start-on-boot='OFF' 
      --group-replication-group-name='aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' 
      --group-replication-local-address="node$N:33061" 
      --group-replication-group-seeds='node1:33061,node2:33061,node3:33061' 
      --loose-group-replication-single-primary-mode='OFF'     # 如果单主模式,则设置为ON
      --loose-group-replication-enforce-update-everywhere-checks='ON'  # 如果单主模式,则设置为OFF
    done

    # 配置首节点,如:创建用户,开启组复制等

    docker exec -it node1 mysql -uroot -pmypass 
      -e "SET @@GLOBAL.group_replication_bootstrap_group=1;" 
      -e "create user 'repl'@'%' identified by 'P@ssword1!';" 
      -e "GRANT REPLICATION SLAVE ON *.* TO repl@'%';" 
      -e "flush privileges;" 
      -e "change master to master_user='repl', master_password='P@ssword1!' for channel 'group_replication_recovery';" 
      -e "START GROUP_REPLICATION;" 
      -e "SET @@GLOBAL.group_replication_bootstrap_group=0;" 
      -e "SELECT * FROM performance_schema.replication_group_members;"

    # 新增其他节点

    for N in 2 3
    do docker exec -it node$N mysql -uroot -pmypass 
      -e "change master to master_user='repl', master_password='P@ssword1!'  for channel 'group_replication_recovery';" 
      -e "START GROUP_REPLICATION;"
    done

    # 验证集群是否正常

    docker exec -it node1 mysql -uroot -pmypass -e "select * from performance_schema.replication_group_members;"
    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    | group_replication_applier | d955da6d-0048-11ea-b7b4-525400f4342d | node1       |        3306 | ONLINE       | PRIMARY     | 8.0.18         |
    | group_replication_applier | e050c34f-0048-11ea-917d-52540021fab9 | node2       |        3306 | ONLINE       | SECONDARY   | 8.0.18         |
    | group_replication_applier | e6c56347-0048-11ea-9e8b-5254007c241f | node3       |        3306 | ONLINE       | SECONDARY   | 8.0.18         |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    3 rows in set (0.00 sec)

    # 单主切换到多主

    ######################################################################
    # 单主切换到多主
    # MGR切换模式需要重新启动组复制,因此需要在所有节点上先关闭组复制,
    #设置 group_replication_single_primary_mode=OFF 等参数,再启动组复制。
    1) 停止组复制(在所有MGR节点上执行):
    stop group_replication; 
    set global group_replication_single_primary_mode=OFF;
    set global group_replication_enforce_update_everywhere_checks=ON;
    
    2) 随便选择某个MGR节点执行 (比如这里选择在MGR-node1节点):
    set global group_replication_recovery_get_public_key=1;
    SET GLOBAL group_replication_bootstrap_group=ON;
    START GROUP_REPLICATION;
    SET GLOBAL group_replication_bootstrap_group=OFF;
    
    3) 然后在其他的MGR节点执行 (这里指MGR-node2和MGR-node3节点上执行):
    set global group_replication_recovery_get_public_key=1;
    START GROUP_REPLICATION;
    
    4) 查看MGR组信息 (在任意一个MGR节点上都可以查看)
    SELECT * FROM performance_schema.replication_group_members;
    # 可以看到所有MGR节点状态都是online,角色都是PRIMARY,MGR多主模式搭建成功。
    ##########################################################################

    # 多主切换回单主

    ##########################################################################
    # 多主切回单主模式
    1) 停止组复制(在所有MGR节点上执行):
    stop group_replication;
    set global group_replication_single_primary_mode=ON;
    set global group_replication_enforce_update_everywhere_checks=OFF;
    
    2) 选择一个节点作为主节点, 在主节点上执行 (这里选择MGR-node1节点作为主节点)
    SET GLOBAL group_replication_bootstrap_group=ON;
    START GROUP_REPLICATION;
    SET GLOBAL group_replication_bootstrap_group=OFF;
     
    3) 在其他剩余的节点, 也就是从库节点上执行 (这里从库节点指的就是MGR-node2和MGR-node3):
    START GROUP_REPLICATION;
    
    4) 查看MGR组信息 (在任意一个MGR节点上都可以查看)
    SELECT * FROM performance_schema.replication_group_members;
    ##########################################################################

     # 注意故障

    # 故障注意点:
    # 单主模式,恢复MGR-node1节点, 恢复后, 需要手动激活下该节点的组复制功能
    # 如果节点发生故障, 在恢复后需要重新加入到MGR集群里, 正确的做法是:
    STOP GROUP_REPLICATION;
    START GROUP_REPLICATION;
    
    # 如果某个节点挂了, 则其他的节点继续进行同步.
    # 当故障节点恢复后, 只需要手动激活下该节点的组复制功能("START GROUP_REPLICATION;"),
    # 即可正常加入到MGR组复制集群内并自动同步其他节点数据.
    
    # 如果是i/o复制出现异常
    # 确定数据无误后
    # 查找主库的gtid情况
    mysql> show global variables like '%gtid%' ;
    +----------------------------------------------+-------------------------------------------------------+
    | Variable_name                                | Value                                                 |
    +----------------------------------------------+-------------------------------------------------------+
    | binlog_gtid_simple_recovery                  | ON                                                    |
    | enforce_gtid_consistency                     | ON                                                    |
    | group_replication_gtid_assignment_block_size | 1000000                                               |
    | gtid_executed                                | 58f6e65e-9309-11e9-9d88-525400184a0a:1-946050:1000003 |
    | gtid_executed_compression_period             | 1000                                                  |
    | gtid_mode                                    | ON                                                    |
    | gtid_owned                                   |                                                       |
    | gtid_purged                                  |                                                       |
    | session_track_gtids                          | OFF                                                   |
    +----------------------------------------------+-------------------------------------------------------+
    9 rows in set (0.00 sec)
    
    # 在有故障的从库中操作
    stop GROUP_REPLICATION;
    reset master;
    set global gtid_purged='58f6e65e-9309-11e9-9d88-525400184a0a:1-946055:1000003';
    START GROUP_REPLICATION;
    
    # 添加白名单网段
    stop group_replication;
    set global group_replication_ip_whitelist="127.0.0.1/32,172.16.60.0/24,172.16.50.0/24,172.16.51.0/24";
    start group_replication;
    show variables like "group_replication_ip_whitelist";
    
    # 一定要注意: 配置白名单前面一定要先关闭 Group Replication, 及先要执行"stop group_replication;"

     搭建的时候注意细节,有些参数需要根据自身情况调整下

  • 相关阅读:
    寒假作业3
    寒假作业2
    寒假作业
    Binary Indexed Tree
    Quick Union
    Prim's Algorithm & Kruskal's algorithm
    面向对象阶段总结 | 肆
    面向对象阶段总结 | 叁
    面向对象阶段总结 | 贰
    面向对象阶段总结 | 壹
  • 原文地址:https://www.cnblogs.com/shumtn/p/13407870.html
Copyright © 2020-2023  润新知