Docker搭建MySQL Group Replication集群

一、创建目录

mkdir mgrTest
cd mgrTest 
mkdir -p 1_ms/conf
mkdir -p 1_ms/data
cp -r 1_ms 2_ms
cp -r 1_ms 3_ms
touch docker-compose.yml
目录结构

二、编写docker-compose.yml文件

version: '3'
services:
    mysql-master:
        image: mysql:8.0.32
        container_name: mysql-master
        ports:
            - 3311:3306
        restart: always
        logging:
            driver: "json-file"
            options:
                max-size: "200k"
                max-file: "10"
        environment:
            MYSQL_ROOT_PASSWORD: 123456
        volumes:
            # 映射目录 宿主机目录文件:容器目录文件
            - ./1_ms/data:/var/lib/mysql
            - ./1_ms/conf:/etc/mysql/conf.d
        networks:
            my_net:
                ipv4_address: 172.18.0.11

    mysql-slave-1:
        image: mysql:8.0.32
        container_name: mysql-slave-1
        ports:
            - 3312:3306
        restart: always
        logging:
            driver: "json-file"
            options:
                max-size: "200k"
                max-file: "10"
        environment:
            MYSQL_ROOT_PASSWORD: 123456
        volumes:
            # 映射目录 宿主机目录文件:容器目录文件
            - ./2_ms/data:/var/lib/mysql
            - ./2_ms/conf:/etc/mysql/conf.d
        networks:
            my_net:
                ipv4_address: 172.18.0.12

    mysql-slave-2:
        image: mysql:8.0.32
        container_name: mysql-slave-2
        ports:
            - 3313:3306
        restart: always
        logging:
            driver: "json-file"
            options:
                max-size: "200k"
                max-file: "10"
        environment:
            MYSQL_ROOT_PASSWORD: 123456
        volumes:
            # 映射目录 宿主机目录文件:容器目录文件
            - ./3_ms/data:/var/lib/mysql
            - ./3_ms/conf:/etc/mysql/conf.d
        networks:
            my_net:
                ipv4_address: 172.18.0.13


networks:
    my_net:
        name: my_network
        ipam:
            config:
                - subnet: '172.18.0.0/24'

三、启动容器

docker-compose up -d
启动容器

四、设置主节点mysql-master

4.1 编辑主节点my.cnf

vim 1_ms/conf/my.cnf

将一下信息填入my.cnf,保存。

[mysqld]

default_authentication_plugin=mysql_native_password
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

#此参数是在server收集写集合的同时以便将其记录到二进制日志。写集合基于每行的主键,并且是行更改后的唯一标识此标识将用于检测冲突
transaction_write_set_extraction=XXHASH64


#组的名字可以随便起,但不能用主机的GTID! 所有节点的这个组名必须保持一致!
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-cccccccccccc"

#启动mysql时不自动启动组复制
loose-group_replication_start_on_boot=OFF

#本机IP地址或者映射,33061用于接收来自其他组成员的传入连接
loose-group_replication_local_address= "172.18.0.11:33061"

#当前主机成员需要加入组时,Server先访问这些种子成员中的一个,然后它请求重新配置以允许它加入组
#需要注意的是,此参数不需要列出所有组成员,只需列出当前节点加入组需要访问的节点即可。
loose-group_replication_group_seeds= "172.18.0.11:33061,172.18.0.12:33062,172.18.0.13:33063"

#是否自动引导组。此选项只能在一个server实例上使用,通常是首次引导组时(或在整组成员关闭的情况下),如果多次引导,可能出现脑裂。
loose-group_replication_bootstrap_group=OFF

4.2 重启主节点

docker restart mysql-master

4.3 进入主节点容器,设置Mysql

docker exec -it mysql-master /bin/bash
mysql -uroot -p123456

以下是在mysql内部执行

mysql> SET SQL_LOG_BIN=0;

mysql> CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'you_password';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

mysql> GRANT BACKUP_ADMIN ON *.* TO 'repl'@'%';

mysql> flush privileges;

mysql> SET SQL_LOG_BIN=1;

mysql> change master to master_user='repl',master_password='you_password' for channel 'group_replication_recovery';

mysql> install PLUGIN group_replication SONAME 'group_replication.so';
设置主节点

查看插件

mysql> show plugins;
查看插件

4.4 设置主节点MySQL Group Replication ,开启复制

还是在mysql内执行

mysql> set global group_replication_bootstrap_group=on; // 开启组

mysql>  start group_replication;   // 开启组复制

mysql> set global group_replication_bootstrap_group=off; // 关闭组复制引导

mysql> SELECT * FROM performance_schema.replication_group_members; // 查看组成员
开启复制

此时只有一个成员。

主节点已完成。下面开始设置从节点

五、设置一从节点mysql-slave-1

5.1 编辑一从节点my.cnf

cp 1_ms/conf/my.cnf 2_ms/conf/
vim 2_ms/conf/my.cnf

仅需修改一下两个地方,

server_id=2
loose-group_replication_local_address= "172.18.0.12:33062"

5.2 重启一从节点

docker restart mysql-slave-1

5.3 进入一从节点容器,设置Mysql

docker exec -it mysql-slave-1 /bin/bash
mysql -uroot -p123456

以下是在mysql内部执行

mysql>  SET SQL_LOG_BIN=0;

mysql> CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'you_password';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

mysql> GRANT BACKUP_ADMIN ON *.* TO 'repl'@'%';

mysql> flush privileges;

mysql>  SET SQL_LOG_BIN=1;

mysql> change master to master_user='repl',master_password='you_password' for channel 'group_replication_recovery';

mysql> install PLUGIN group_replication SONAME 'group_replication.so';
设置一从节点

5.4 一从节点MySQL Group Replication 开启复制

还是在mysql内执行

mysql> start group_replication;

mysql> SELECT * FROM performance_schema.replication_group_members;

开启一从节点复制

此时已有两个成员。

六、设置二从节点mysql-slave-2

和设置一从节点步骤一样,只需要修改my.cnf里面的

server_id=3
loose-group_replication_local_address= "172.18.0.13:33063"

其余操作一样,参考一从节点操作不做赘述。

设置二从节点

开启复制

此时已有三个成员。

所有节点显示online,MGR配置完成。

七、测试数据

在主节点上创建测试数据库,插入测试数据。


mysql> create database boby;

mysql> use boby

mysql>  create table test(id int primary key,name varchar(10));

mysql>  insert into test values (1, 'boby');

mysql> select * from test;
主节点加数据

在一从节点查看数据


mysql> show databases;

mysql> use boby; 

mysql> select * from test;
一从节点

在二从节点查看数据


二从节点

如果不是用Docker建的服务,在my.cnf中需要加上配置

loose-group-replication-ip-whitelist="ip_1,ip_2,ip_3"

感谢记录自己搭建MySQL Group Replication集群过程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容