欢迎来到站长天空!

其它服务器

当前位置: 主页 > 服务器 > 其它服务器

docker环境搭建mgr集群的问题及原理

时间:2025-12-21 17:30:02|栏目:其它服务器|点击:

目录
  • MGR概念
  • 为何选用MGR
  • MGR原理
    • 单主模式
    • 多主模式
  • 环境准备
    • docker搭建MRG步骤
      • 1、拉取mysql8镜像
      • 2、创建docker专用网络
      • 3、创建存储数据相关目录
      • 4、启动3个mysql容器
      • 4、查看已启动的容器
      • 5、修改配置参数
      • 6、重启3个容器
      • 7、分别登录到各个docker容器,查看下容器的信息
    • 安装MGR插件(3个容器内均执行)
      • 设置数据复制账号(3个容器内均执行)
        • 开启MGR单主模式
          • 1、启动MGR,在主库(172.72.0.15)上执行
          • 2、其他两个节点加入MGR

        MGR概念

        MGR(MySQL Group Replication),是MySQL在2016年12月推出的一个全新的高可用与高扩展的解决方案

        为何选用MGR

        MySQL推出MGR之前,传统复制模式分为两种,

        • 异步复制;
        • 半同步复制

        异步复制:

        • master执行事务,写入binlog日志,然后提交。
        • slave接收binlog日志事务并将事务先写入relay日志,然后重做事务。当master宕机时有可能会造成数据不一致情况。

        半同步复制:

        • master执行事务,写入二进制日志,将binlog事务日志传送到slave,slave接收到binlog事务日志后,将其写到relay log,然后向master返回传送成功ACK;
        • master收到ACK后,再在存储引擎中提交事务。(两种提交方式,由参数rpl_semi_sync_master_wait_point决定)

        总结以上要点,存在的弊端如下:

        • 写操作集中在MASTER服务器上;
        • 可能产生数据不一致的问题;
        • MASTER宕机后,需要人为选择新主并重新给其他的slave端执行change master。

        MGR提供的功能

        • 同步复制;
        • 单主模式、多主模式;
        • 自动切换;
        • 弹性扩展

        MGR限制

        • 仅支持innodb引擎;
        • 所有新增表必须显式创建主键;
        • 建议隔离级别为READ COMMITED,多主模式下,不支持SERIALIZABLE;
        • 多主模式下,不建议使用外键;
        • 需开启bin_log_format=row、log_slave_updates=ON;
        • 需开启GTID;
        • 需安装引擎group_replication.so;
        • MGR最多支持9个节点

        MGR原理

        单主模式

        单主模式下,只有一个节点可以读写,其他节点提供只读服务。单主模式下,当主节点宕掉,其他节点自动会根据服务器的server_uuid变量和group_replication_member_weight变量值,选择下一个slave作为主节点,group_replication_member_weight的值最高的成员被选为新的主节点,该参数默认为50,可以在节点上设置不同值;在group_replication_member_weight值相同的情况下,group根据数据字典中server_uuid排序,排序在最前的被选择为主节点。

        多主模式

        多主模式下,在组复制中通过Group Replication Protocol协议及Paxos协议,形成的整体高可用解决方案,同时增加了certify的概念,负责检查事务是否允许提交,是否与其它事务存在冲突,Group Replication是由多个节点共同组成一个数据库集群,每个节点都可以单独执行事务,但是read-write(RW)的操作只有在组内验证后才可以commit,Read-only (RO)事务是不需要验证可以立即执行,当一个事务在一个节点上提交之前,会在组内自动进行原子性的广播,告知其他节点变更了什么内容/执行了什么事务,然后为该事物建立一个全局的排序,最终,这意味着所有的服务器都以相同的顺序接收相同的事务集。因此,所有服务器都按照相同的顺序应用相同的变更集,因此它们在组中保持一致。 在多主模式下,该组的所有成员都设置为读写模式,在多主模式下,不支持SERIALIZABLE事务隔离级别,且不能完全支持级联外键约束。

        环境准备

        1、基于centos7系统的虚拟机(或云服务器),内存建议4G以上;
        2、提前安装好docker环境,并启动;

        docker搭建MRG步骤

        1、拉取mysql8镜像

        docker pull mysql:8.0.20

        2、创建docker专用网络

        这里是为了后面固定各个容器的IP地址,避免IP地址发生变动带来的其他问题

        docker network create --subnet=172.72.0.0/24 mysql-network

        3、创建存储数据相关目录

        mkdir -p /usr/local/mysql/lhrmgr15/conf.d
        mkdir -p /usr/local/mysql/lhrmgr15/data
        mkdir -p /usr/local/mysql/lhrmgr16/conf.d
        mkdir -p /usr/local/mysql/lhrmgr16/data
        mkdir -p /usr/local/mysql/lhrmgr17/conf.d
        mkdir -p /usr/local/mysql/lhrmgr17/data

        4、启动3个mysql容器

        依次执行下面的docker命令即可,目录名称和容器的名称可以结合自身的情况更改

        第一个容器:

        docker run -d --name mysql8020mgr33065 \
        
        -h lhrmgr15 -p 33065:3306 --net=mysql-network --ip 172.72.0.15 \
        
        -v /usr/local/mysql/lhrmgr15/conf.d:/etc/mysql/conf.d -v /usr/local/mysql/lhrmgr15/data:/var/lib/mysql/ \
        
        -e MYSQL_ROOT_PASSWORD=lhr \
        
        -e TZ=Asia/Shanghai \
        
        mysql:8.0.20

        第二个容器:

        docker run -d --name mysql8020mgr33066 \
        
        -h lhrmgr16 -p 33066:3306 --net=mysql-network --ip 172.72.0.16 \
        
        -v /usr/local/mysql/lhrmgr16/conf.d:/etc/mysql/conf.d -v /usr/local/mysql/lhrmgr16/data:/var/lib/mysql/ \
        
        -e MYSQL_ROOT_PASSWORD=lhr \
        
        -e TZ=Asia/Shanghai \
        
        mysql:8.0.20

        第三个容器:

        docker run -d --name mysql8020mgr33067 \
        
        -h lhrmgr17 -p 33067:3306 --net=mysql-network --ip 172.72.0.17 \
        
        -v /usr/local/mysql/lhrmgr17/conf.d:/etc/mysql/conf.d -v /usr/local/mysql/lhrmgr17/data:/var/lib/mysql/ \
        
        -e MYSQL_ROOT_PASSWORD=lhr \
        
        -e TZ=Asia/Shanghai \
        
        mysql:8.0.20

        4、查看已启动的容器

        docker ps

        docker环境搭建mgr集群的问题及原理

        5、修改配置参数

        还记得使用docker搭建mysql的过程吗?当我们需要在docker容器开启binlog日志的时候,是怎么做的呢?没错,需要一个my.cnf文件,接下来,分别在上面的conf.d目录下,创建my.cnf文件,依次拷贝下面的内容到各自目录的my.cnf文件中;

        docker环境搭建mgr集群的问题及原理

        第一个my.cnf

        [mysqld]
        user=mysql
        port=3306
        character_set_server=utf8mb4
        secure_file_priv=''
        server-id = 802033065
        default-time-zone = '+8:00'
        log_timestamps = SYSTEM
        log-bin = 
        binlog_format=row
        binlog_checksum=NONE
        log-slave-updates=1
        skip-name-resolve
        auto-increment-increment=2
        auto-increment-offset=1
        gtid-mode=ON
        enforce-gtid-consistency=on
        default_authentication_plugin=mysql_native_password
        max_allowed_packet = 500M
        master_info_repository=TABLE
        relay_log_info_repository=TABLE
        relay_log=lhrmgr15-relay-bin-ip15
        transaction_write_set_extraction=XXHASH64
        loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
        loose-group_replication_start_on_boot=OFF
        loose-group_replication_local_address= "172.72.0.15:33061"
        loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
        loose-group_replication_bootstrap_group=OFF
        loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"
        report_host=172.72.0.15
        report_port=3306

        第二个my.cnf

        [mysqld]
        user=mysql
        port=3306
        character_set_server=utf8mb4
        secure_file_priv=''
        server-id = 802033066
        default-time-zone = '+8:00'
        log_timestamps = SYSTEM
        log-bin = 
        binlog_format=row
        binlog_checksum=NONE
        log-slave-updates=1
        gtid-mode=ON
        enforce-gtid-consistency=ON
        skip_name_resolve
        default_authentication_plugin=mysql_native_password
        max_allowed_packet = 500M
        master_info_repository=TABLE
        relay_log_info_repository=TABLE
        relay_log=lhrmgr16-relay-bin-ip16
        transaction_write_set_extraction=XXHASH64
        loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
        loose-group_replication_start_on_boot=OFF
        loose-group_replication_local_address= "172.72.0.16:33062"
        loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
        loose-group_replication_bootstrap_group=OFF
        loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"
        report_host=172.72.0.16
        report_port=3306

        第三个my.cnf

        [mysqld]
        user=mysql
        port=3306
        character_set_server=utf8mb4
        secure_file_priv=''
        server-id = 802033067
        default-time-zone = '+8:00'
        log_timestamps = SYSTEM
        log-bin = 
        binlog_format=row
        binlog_checksum=NONE
        log-slave-updates=1
        gtid-mode=ON
        enforce-gtid-consistency=ON
        skip_name_resolve
        default_authentication_plugin=mysql_native_password
        max_allowed_packet = 500M
        master_info_repository=TABLE
        relay_log_info_repository=TABLE
        relay_log=lhrmgr16-relay-bin-ip16
        transaction_write_set_extraction=XXHASH64
        loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
        loose-group_replication_start_on_boot=OFF
        loose-group_replication_local_address= "172.72.0.17:33063"
        loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
        loose-group_replication_bootstrap_group=OFF
        loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"
        report_host=172.72.0.17
        report_port=3306

        6、重启3个容器

        docker restart mysql8020mgr33065 mysql8020mgr33066 mysql8020mgr33067

        7、分别登录到各个docker容器,查看下容器的信息

        docker exec -it mysql8020mgr33065 /bin/bash
        mysql -uroot -plhr
        select @@hostname,@@server_id,@@server_uuid
        docker exec -it mysql8020mgr33066 /bin/bash
        mysql -uroot -plhr
        select @@hostname,@@server_id,@@server_uuid
        docker exec -it mysql8020mgr33067 /bin/bash
        mysql -uroot -plhr
        select @@hostname,@@server_id,@@server_uuid

        以第一个容器为例,查询的信息如下:

        docker环境搭建mgr集群的问题及原理

        以上的准备工作就基本完成了

        安装MGR插件(3个容器内均执行)

        INSTALL PLUGIN group_replication SONAME 'group_replication.so';

        docker环境搭建mgr集群的问题及原理

        查看当前容器节点已经安装的插件,说明安装完成了

        show plugins;

        docker环境搭建mgr集群的问题及原理

        设置数据复制账号(3个容器内均执行)

        通过开篇的原理讲解知道,单主模式下,各个节点的数据是强一致的,因此数据写入到某个节点的时候,必然存在不同节点之间数据的拷贝,因此需要创建一个用户复制的账号,在3个容器里面依次执行下面的命令

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

        docker环境搭建mgr集群的问题及原理

        开启MGR单主模式

        1、启动MGR,在主库(172.72.0.15)上执行

        SET GLOBAL group_replication_bootstrap_group=ON;
        START GROUP_REPLICATION;
        SET GLOBAL group_replication_bootstrap_group=OFF;
        -- 查看MGR组信息
        SELECT * FROM performance_schema.replication_group_members;

        docker环境搭建mgr集群的问题及原理

        2、其他两个节点加入MGR

        在从库(172.72.0.16,172.72.0.17)上执行,执行完毕,可以查看MGR组信息,反映出各个节点的状态

        START GROUP_REPLICATION;
        -- 查看MGR组信息
        SELECT * FROM performance_schema.replication_group_members;

        docker环境搭建mgr集群的问题及原理

        docker环境搭建mgr集群的问题及原理

        可以看到,3个节点状态为online,且主节点为172.72.0.15,只有主节点可以进行数据写入,其他节点为只读,到这里MGR单主模式搭建成功;

        上一篇:Rainbond云原生部署SpringCloud应用架构实践

        栏    目:其它服务器

        下一篇:使用 Docker Compose 构建复杂的多容器 App的方法

        本文标题:docker环境搭建mgr集群的问题及原理

        本文地址:https://zz.feitang.co/server/32482.html

        广告投放 | 联系我们 | 版权申明

        申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

        如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

        联系QQ:257218569 | 邮箱:257218569@qq.com

        Copyright © 2018-2025 站长天空 版权所有 Powered by EyouCms冀ICP备14023439号