• Docker之MySQL_GROUP_REPLICATION组复制(MGR)


    三台服务器修改hosts文件

    vim /etc/hosts
    
    • 1

    追加内容

    192.168.1.11   node1
    192.168.1.12   node2
    192.168.1.13   node3
    
    • 1
    • 2
    • 3

    修改hostname

    vim /etc/hostname
    
    • 1

    重启网络使配置文件生效

    systemctl restart network
    
    • 1

    三台服务器拉取MySQL镜像

    docker pull mysql:8.0.23
    
    • 1

    创建配置文件夹

    mkdir -p /docker_data/mysql/conf/
    vim /docker_data/mysql/conf/my.cnf
    
    • 1
    • 2

    内容如下

    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    character-set-server=utf8mb4
    default_authentication_plugin=mysql_native_password
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    三台服务器开放3306和33061端口

    firewall-cmd --zone=public --add-port=3306/tcp --permanent
    firewall-cmd --zone=public --add-port=33061/tcp --permanent
    firewall-cmd --reload
    
    • 1
    • 2
    • 3

    三台服务器启动MySQL容器

    必须使用连通宿主机ip的网络

    docker run -d --network=host --name mysql --privileged=true --restart=always -v /docker_data/mysql/data:/var/lib/mysql -v /docker_data/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql-8.0.23 mysql:8.0.23
    
    • 1

    启动以后进入mysql容器,安装插件

    docker exec -it mysql-8.0.23 bash
    #容器执行:mysql -uroot -p
    #输入mysql密码
    #安装插件
    mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
    #退出mysql容器,回到宿主机,修改配置文件
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    修改配置文件

    vim /docker_data/mysql/conf/my.cnf
    
    • 1

    追加内容
    三台服务器除了server_id和group_replication_local_address不同其它全部相同

    [client]
    default-character-set=utf8mb4
    [mysql]
    default-character-set=utf8mb4
    [mysqld]
    port=3306
    character-set-server=utf8mb4
    default_authentication_plugin=mysql_native_password
    
    #MGR
    #其他存储引擎,包括临时MEMORY存储引擎,可能会导致组复制中出现错误。
    disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
    #服务唯一ID
    server_id=1
    gtid_mode=ON
    enforce_gtid_consistency=ON
    binlog_checksum=NONE
    
    log_bin=binlog
    log_slave_updates=ON
    binlog_format=ROW
    master_info_repository=TABLE
    relay_log_info_repository=TABLE
    transaction_write_set_extraction=XXHASH64
    #添加MGR插件(如果是docker则在容器里安装后再写入以下配置,否则启动会报错,因为你没有安装插件)
    plugin_load_add='group_replication.so'
    group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    group_replication_start_on_boot=OFF
    #根据当前服务器的别名配置,如:你当前服务器是node2那就改成node2,然后server_id改成2或者其它不重复的,node1~3都是自定义的
    group_replication_local_address= "node1:33061"
    group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"
    group_replication_bootstrap_group=OFF
    
    • 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

    保存配置文件,重启mysql容器

    docker restart mysql-8.0.23
    
    • 1

    三台服务器执行SQL

    #先禁用二进制日志
    SET SQL_LOG_BIN=0;
    CREATE USER copy@'%' IDENTIFIED BY 'copy';
    GRANT REPLICATION SLAVE ON *.* TO copy@'%';
    GRANT CONNECTION_ADMIN ON *.* TO copy@'%';
    GRANT BACKUP_ADMIN ON *.* TO copy@'%';
    #GRANT GROUP_REPLICATION_STREAM ON *.* TO copy@'%';
    FLUSH PRIVILEGES;
    #重新启用二进制日志
    SET SQL_LOG_BIN=1;
    #启动单主模式主从复制
    CHANGE MASTER TO MASTER_USER='copy', MASTER_PASSWORD='copy' FOR CHANNEL 'group_replication_recovery';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    主库执行SQL

    我的是node1

    SET GLOBAL group_replication_bootstrap_group=ON;
    START GROUP_REPLICATION;
    SET GLOBAL group_replication_bootstrap_group=OFF;
    #查看组复制情况
    SELECT * FROM performance_schema.replication_group_members;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    成功则查询出如下所示内容:

    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    | group_replication_applier | ec4f4975-7480-11ed-a4eb-000c29993f4c | node1       |        3306 | ONLINE       | PRIMARY     | 8.0.23         |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5

    从库执行SQL

    即node1和2

    START GROUP_REPLICATION;
    # 从库查看MGR组信息
    SELECT * FROM performance_schema.replication_group_members;
    
    • 1
    • 2
    • 3

    3096错误:启动GROUP_REPLICATION命令失败,因为有初始化组通信层时出错。

    1. 修改hosts文件,然后使hosts文件生效
    2. docker启动时没有使用宿主机的网络–network=host --name mysql

    主节点宕机,MGR自动选主测试

    手动停止主节点node1,模拟宕机

    docker stop mysql-8.0.23
    
    • 1

    任一从节点执行SQL,发现从节点node2变成了主节点(PRIMARY)

    mysql> SELECT * FROM performance_schema.replication_group_members;
    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    | group_replication_applier | c40efe0e-7480-11ed-aeda-00505629a57a | node2       |        3306 | ONLINE       | PRIMARY     | 8.0.23         |
    | group_replication_applier | ce0f8f45-7480-11ed-b616-0050562dbd10 | node3       |        3306 | ONLINE       | SECONDARY   | 8.0.23         |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    重启node1节点,加入组

    docker start mysql-8.0.23
    
    • 1

    node1执行SQL

    #重启后必须执行START GROUP_REPLICATION;重新加入组,否则节点不会自动加入组
    START GROUP_REPLICATION;
    #任一节点执行查询节点信息SQL
    SELECT * FROM performance_schema.replication_group_members;
    
    • 1
    • 2
    • 3
    • 4

    node1变成从节点

    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    | group_replication_applier | c40efe0e-7480-11ed-aeda-00505629a57a | node2       |        3306 | ONLINE       | PRIMARY     | 8.0.23         |
    | group_replication_applier | ce0f8f45-7480-11ed-b616-0050562dbd10 | node3       |        3306 | ONLINE       | SECONDARY   | 8.0.23         |
    | group_replication_applier | ec4f4975-7480-11ed-a4eb-000c29993f4c | node1       |        3306 | ONLINE       | SECONDARY   | 8.0.23         |
    +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    常见问题

    组中 MySQL 服务器的最大数量是多少?

    一个组最多可以包含 9 台服务器。正在尝试添加 具有 9 个成员的组的另一个服务器导致请求 加入被拒绝。此限制已从测试中确定 并将基准测试作为小组执行的安全边界 在稳定的局域网上可靠运行。

    如何和springboot整合?

    可以通过Apache ShardingSphere-JDBC实现高可用。
    《Shardingsphere官网》
    在这里插入图片描述

  • 相关阅读:
    通过 while循环体对远程主机进行遍历性ssh登录并执行目标指令
    人工智能课题、模型源码
    矩阵求导简记
    海贼王大学生HTML网页制作作品 学生动漫网页设计模板下载 简单漫画网页设计成品 dreamweaver学生网站模板
    毕业设计-基于Unity的餐厅经营游戏的设计与开发(附源码、开题报告、论文、答辩PPT、演示视频,带数据库)
    【C语言】指针和数组笔试题解析(2)
    【题解】Codeforces Round #798 (Div. 2)
    Salesforce架构师常见问题(上)
    设计模式-单例模式
    1.1 数据采集总览
  • 原文地址:https://blog.csdn.net/weixin_43933728/article/details/128191049