返回介绍

MariaDB 基于 GTID 主从复制搭建

发布于 2021-03-18 14:41:50 字数 9894 浏览 1104 评论 0 收藏 0

本文演示环境是在同一台服务器上部署。因为docker创建容器时默认采用bridge网络,会自行分配ip,不允许指定,重启容器会导致ip变更。所以我们需要创建自定义的bridge网络,这样创建容器的时候才能指定ip。

创建自定义网络

#创建一个新的bridge网络adnc_net
docker network create --driver bridge --subnet=172.20.0.0/16 --gateway=172.20.0.1 adnc_net

拉取镜像文件并运行容器

#拉取mariadb镜像
docker pull mariadb:10.5.8

#启动mariadb01容器
docker run --name mariadb01 -p 13311:3306 -e MYSQL_ROOT_PASSWORD=alpha.abc -e TZ=Asia/Shanghai --restart=always -v /root/data/mariadb01/conf:/etc/mysql -v /root/data/mariadb01/logs:/var/log/mysql -v /root/data/mariadb01/data:/var/lib/mysql --network=adnc_net --ip 172.20.0.11 -d mariadb:10.5.8

#启动mariadb02容器
docker run --name mariadb02 -p 13312:3306 -e MYSQL_ROOT_PASSWORD=alpha.abc -e TZ=Asia/Shanghai --restart=always -v /root/data/mariadb02/conf:/etc/mysql -v /root/data/mariadb02/logs:/var/log/mysql -v /root/data/mariadb02/data:/var/lib/mysql --network=adnc_net --ip 172.20.0.12 -d mariadb:10.5.8

#启动mariadb03容器
docker run --name mariadb03 -p 13313:3306 -e MYSQL_ROOT_PASSWORD=alpha.abc -e TZ=Asia/Shanghai --restart=always -v /root/data/mariadb03/conf:/etc/mysql -v /root/data/mariadb03/logs:/var/log/mysql -v /root/data/mariadb03/data:/var/lib/mysql --network=adnc_net --ip 172.20.0.13 -d mariadb:10.5.8

#查看mariadb三个容器是否正常运行
docker container ls

编辑mariadb的配置文件

vim /root/data/mariadb01/conf/my.cnf
  • 拷贝如下内容到my.cnf
    [mysqld]
    server_id = 11    #  一组主从组里的每个id必须是唯一值。推荐用ip位数
    log-bin= mysql-bin # 二进制日志,后面指定存放位置。如果只是指定名字,默认存放在/var/lib/mysql下
    lower_case_table_names=1 # 不区分大小写
    binlog-format=ROW    # 二进制日志文件格式
    log-slave-updates=True    # slave更新是否记入日志
    sync-master-info=1    # 值为1确保信息不会丢失
    slave-parallel-threads=3 #同时启动多少个复制线程,最多与要复制的数据库数量相等即可
    binlog-checksum=CRC32    # 效验码
    master-verify-checksum=1    # 启动主服务器效验
    slave-sql-verify-checksum=1   # 启动从服务器效验
    bind-address = 172.20.0.11    # 监听本机网卡ip
    
vim /root/data/mariadb02/conf/my.cnf
  • 拷贝如下内容到my.cnf
    [mysqld]
    server_id=12
    log-bin= mysql-bin #log-bin是二进制文件
    relay_log = relay-bin    # 中继日志, 后面指定存放位置。如果只是指定名字,默认存放在/var/lib/mysql下
    lower_case_table_names=1
    
    vim /root/data/mariadb03/conf/my.cnf
    
  • 拷贝如下内容到my.cnf
    [mysqld]
    server_id=13
    log-bin= mysql-bin
    relay_log = relay-bin    # 中继日志, 后面指定存放位置。如果只是指定名字,默认存放在/var/lib/mysql下
    lower_case_table_names=1
    
  • 重启3个容器
    docker restart mariadb01
    docker restart mariadb02
    docker restart mariadb03
    

创建账号(master容器(mariadb01))

docker exec -it mariadb01 /bin/bash
mysql -uroot -palpha.abc
grant all privileges on *.* to dbsync@'%' identified by 'dbsync123';
FLUSH PRIVILEGES;
#查看master状态,查看二进制文件名(mysql-bin.000001)和位置(530):
SHOW MASTER STATUS;
#状态信息如下
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      651 |              |                  |
+------------------+----------+--------------+------------------+
#通过二进制日志跟偏移位置查看此时的GTID值
SELECT BINLOG_GTID_POS('mysql-bin.000003', 651);
#内容如下
+------------------------------------------+
| BINLOG_GTID_POS('mysql-bin.000003', 651) |
+------------------------------------------+
| 0-11-7197                                |
+------------------------------------------+

同步账号到slave容器(mariadb02)

docker exec -it mariadb02 /bin/bash
mysql -uroot -palpha.abc
SET GLOBAL gtid_slave_pos='0-11-7197';

CHANGE MASTER TO MASTER_HOST='172.20.0.11', MASTER_USER='dbsync', MASTER_PASSWORD='dbsync123',  MASTER_USE_GTID=slave_pos;
start slave;
show slave status\G
#成功状态如下
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

同步账号到slave容器(mariadb03)

docker exec -it mariadb03 /bin/bash
mysql -uroot -palpha.abc
SET GLOBAL gtid_slave_pos='0-11-7197';

CHANGE MASTER TO MASTER_HOST='172.20.0.11', MASTER_USER='dbsync', MASTER_PASSWORD='dbsync123',  MASTER_USE_GTID=slave_pos;
start slave;
show slave status\G

导入数据库到master(mariadb01),并验证是否同步

我们在mariadb01中创建adnc_usr,adnc_maint,adnc_cus三个数据库并导入数据。

  • 下载3脚本文件到/root/data目录
    cd /root/data
    wget https://raw.githubusercontent.com/AlphaYu/Adnc/master/doc/adnc_usr_dev.sql
    wget https://raw.githubusercontent.com/AlphaYu/Adnc/master/doc/adnc_maint_dev.sql
    wget https://raw.githubusercontent.com/AlphaYu/Adnc/master/doc/adnc_cus_dev.sql
    #如果wget下载失败,请手动下载并上传到/root/data目录,文件地址如下
    #https://github.com/AlphaYu/Adnc/tree/master/doc
    
  • 拷贝3个sql文件到mariadb01容器
    docker cp /root/data/adnc_usr_dev.sql mariadb01:/usr/adnc_usr_dev.sql
    docker cp /root/data/adnc_maint_dev.sql mariadb01:/usr/adnc_maint_dev.sql
    docker cp /root/data/adnc_cus_dev.sql mariadb01:/usr/adnc_cus_dev.sql
    
  • 进入mariadb01,创建数据库并导入数据 ```

    进入mariadb01容器

    docker exec -it mariadb01 /bin/bash

    启动mysql client

    mysql -uroot -palpha.abc

创建数据库 adnc_usr

CREATE DATABASE IF NOT EXISTS adnc_usr CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

导入数据

use adnc_usr; source /usr/adnc_usr_dev.sql;

创建数据库 adnc_maint

CREATE DATABASE IF NOT EXISTS adnc_maint CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

导入数据

use adnc_maint; source /usr/adnc_maint_dev.sql;

创建数据库 adnc_cus

CREATE DATABASE IF NOT EXISTS adnc_cus CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; use adnc_cus; source /usr/adnc_cus_dev.sql;

进入mariadb02,mariadb03检查是否同步了。

docker exec -it mariadb02 /bin/bash mysql -uroot -palpha.abc use adnc_usr; select count(1) from sysuser where account='Alpha2008'; ```

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文