专栏首页Coder Sam的专栏使用Docker快速体验MySQL半同步复制机制
原创

使用Docker快速体验MySQL半同步复制机制

近期研究了下MySQL的半同步复制机制(可参考《使用MySQL半同步复制保障关键数据可靠性和一致性》),想要体验一下。搭建环境是件麻烦事,然后就想到用Docker快速搭建环境。

1. MySQL Image的选取

MySQL官方提供了标准Image,能够满足基本的MySQL功能。假如本地没有这个Image,可以通过以下命令获取。

docker pull mysql

默认拉取的是latest版本,也可指定具体版本,如:

docker pull mysql:5.7

但需要注意的是,半同步复制是从5.5版本开始支持的,所以最低需要5.5版本。

2. 搭建一主两备DB

2.1 配置DB

MySQL官方Image提供的my.cnf只包含基本配置,假如有自己定制的DB配置,可以放到/etc/mysql/conf.d目录下,这个目录下后缀为.cnf文件内的配置,会补充和覆盖my.cnf中的配置。一种最简单的方法是使用volume机制,将本地的配置挂载到container中,这样既方便本地修改,也可以在创建container时就包含定制配置。

在本地创建相应目录:

mkdir -p master/conf slave1/conf slave2/conf

编辑Master DB的补充配置,vi master/conf/my.cnf,内容如下:

[mysqld]
binlog-format=ROW
log-bin=master-bin
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=1
report-port=3306
report-host=master
plugin_load="rpl_semi_sync_master=semisync_master.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000

说明:使用MySQL的复制功能需要打开binlog。半同步复制可以在启动DB后安装semisync_master.so,这里在配置文件中加上,启动DB时自动加载。rpl_semi_sync_master_enabled=1启用半同步复制的主DB角色功能。体验时设置半同步复制超时时间rpl_semi_sync_master_timeout为1秒。

编辑Slave DB 1的补充配置,vi slave1/conf/my.cnf,内容如下:

[mysqld]
binlog-format=ROW
log-bin=mysql-bin.log
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=11
report-port=3306
report-host=slave1
plugin_load="rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_slave_enabled=1

说明:与主DB类似,打开binlog,启动DB时自动加载semisync_slave.so,并通过rpl_semi_sync_slave_enabled=1启用半同步复制的备DB角色功能。超时时间由Master设置,Slave不需要设置。

编辑Slave DB 2的补充配置,vi slave2/conf/my.cnf,内容如下:

[mysqld]
binlog-format=ROW
log-bin=mysql-bin.log
log-slave-updates=true
gtid-mode=on
enforce-gtid-consistency=true
master-info-repository=TABLE
relay-log-info-repository=TABLE
sync-master-info=1
slave-parallel-workers=2
binlog-checksum=CRC32
master-verify-checksum=1
slave-sql-verify-checksum=1
binlog-rows-query-log_events=1
server-id=12
report-port=3306
report-host=slave2
plugin_load="rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_slave_enabled=1

与Slave 1类似,需要注意的是server-id不能重复。

2.2 启动DB container

执行一下命令,创建三个DB container,并挂载相应的补充配置文件。这里指定了端口映射,方便登陆DB操作。

docker run --name master -p 53306:3306 -v /data/test/master/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker run --name slave1 -p 53307:3306 -v /data/test/slave1/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker run --name slave2 -p 53308:3306 -v /data/test/slave2/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql

2.3 配置主从关系

首先获取3个container的内部IP,执行下面命令:

$ docker inspect --format '{{.NetworkSettings.IPAddress}}' master slave1 slave2
172.17.0.100
172.17.0.101
172.17.0.102

登陆Master DB授权:

$ mysql -h127.0.0.1 -uroot -p123456 -P53306
> GRANT REPLICATION SLAVE ON *.* TO slave@172.17.0.101 IDENTIFIED BY '123456';
> GRANT REPLICATION SLAVE ON *.* TO slave@172.17.0.102 IDENTIFIED BY '123456';
> FLUSH PRIVILEGES;

分别登陆Slave DB 1和Slave DB 2配置主从关系:

$ mysql -h127.0.0.1 -uroot -p123456 -P53307
> CHANGE MASTER TO MASTER_HOST='172.17.0.100',MASTER_USER='slave',MASTER_PASSWORD='123456', MASTER_AUTO_POSITION=1;
> START SLAVE;
$ mysql -h127.0.0.1 -uroot -p123456 -P53308
> CHANGE MASTER TO MASTER_HOST='172.17.0.100',MASTER_USER='slave',MASTER_PASSWORD='123456', MASTER_AUTO_POSITION=1;
> START SLAVE;

至此,一主两备DB已经搭建好了,可以通过下面命令查看同步状态。

$ mysql -h127.0.0.1 -uroot -p123456 -P53306
> show slave hosts;

$ mysql -h127.0.0.1 -uroot -p123456 -P53307
> show slave hosts;

$ mysql -h127.0.0.1 -uroot -p123456 -P53308
> show slave hosts;

3. 体验半同步复制功能

3.1 正常情况

在Master DB创建test库t1表,并写入一条记录,操作都是立即返回成功。检查Slave DB 1和Slave DB 2,发现数据已经成功同步。

3.2 Slave DB 1挂了

停止Slave DB 1的container:

docker stop slave1

在Master DB写入一条记录,操作也是立即返回成功。检查Slave DB 2,发现数据已经成功同步。

3.3 两台Slave DB都挂了

再停止Slave DB 2的container:

docker stop slave2

在Master DB写入一条记录,操作需要等待1秒才返回成功;再写入一条记录,立即返回成功。等待1秒对应半同步复制的超时时间,超时时间内两台Slave DB都没有响应,Master DB自动切换成异步复制模式,后面再次写入记录就不需要等待了。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL Case-使用Wireshark窥探异步复制、半同步、组复制

    我们知道异步复制、5.6版本半同步和MySQL 5.7出来的增强半同步,还有MGR在主从复制的过程中流程是不同的,那么我们能不能通过tcpdump或wiresh...

    姚崇
  • 使用MySQL半同步复制保障关键数据可靠性和一致性

    对于一些关键数据,例如账户数据,对可靠性和一致性的要求非常高。我们宁可牺牲短暂时间内的可用性,也不允许数据出现错误或丢失。所以早期我们会发现业界存在这种现象:D...

    Coder Sam
  • Docker安装Mysql 5.7主从互备

    原因:1.数据安全问题,如果你将数据存贮在容器中,当容器rm后,你就无了,当然你可以使用外挂数据卷的方式,但我在某些大佬的文章上看到,即使你外挂的数据卷,doc...

    憨批程序员
  • 如何通过Docker管理自动化测试数据

    其中setup和teardown就是给正式测试做前提准备和收尾的工作,而数据的准备和恢复就经常会出现在这2个环节。对于少量的数据可以通过mysql快速恢复,或者...

    上帝De助手
  • 「实战篇」开源项目docker化运维部署-搭建mysql集群(四)

    PS:如果通过docker的方式直接拉取haproxy和keepalived镜像,比直接在镜像里面安装应用方便很多,建议各位老铁尽量避免在容器内安装应用,这样真...

    IT架构圈
  • MySQL集群搭建方案(PXC)

    技术层面上,传统的单节点数据库,万一宕机了,就凉凉了。容灾性能差、抗并发能力有限,数据量大的时候查询有瓶颈。学习层面上,作为一个技术人了解一些技术相关的知识那也...

    江涛同志
  • docker搭建pxc集群

    随着mysql存储的数据量越来越大,mysql查询单表时的响应速度也会随之变慢,尤其是当单节点承载的数据量超出一定的范围后,比如单表超过2000万之后,查询响应...

    1850810
  • Docker On Gaia——腾讯Docker管理解决方案

    要问2015年什么最火,耐人寻味的股票走势?黄晓明baby领证?Apple Watch 销量会有多好?我无法准确回答你,每个人心中都有自己的答案。不过要问技术领...

    腾讯大数据
  • 『互联网架构』软件架构-mysql主从(二)

    PS:其实很多公司都是通过代理的方式来管理主从数据库的。它可以有选择控制从哪个数据库走。感觉挺爽的,102走的是insert,103走的是select。

    IT架构圈
  • 不忘初心,砥砺前行|暨 InfoQ 写作平台一周年

    与 InfoQ 相识的时间不算短了,2017 年 10 月 22 日加入,但 2020 年 9 月才在平台上发布第一篇文章,11 月后才开始连载。

    程序员架构进阶
  • 借力 Docker ,三分钟搞定 MySQL 主从复制!

    hello 各位小伙伴大家好,今年 5 月份的时候,松哥和大家聊过如何搭建 MySQL 主从复制:

    江南一点雨
  • Docker下实战zabbix三部曲之二:监控其他机器

    版权声明:欢迎转载,请注明出处,谢谢。 ...

    天涯泪小武
  • Docker搭建disconf环境,三部曲之三:细说搭建过程

    在前两章中,我们利用远程或本地的镜像,快速体验了本地启动disconf的过程,本章我们一起来分析和梳理整个定制和搭建过程,了解这些后,我们就能根据自己的需要来定...

    程序员欣宸
  • Docker下实战zabbix三部曲之二:监控其他机器

    在上一章《Docker下实战zabbix三部曲之一:极速体验》中,我们快速安装了zabbix server,并登录管理页面查看了zabbix server所在机...

    程序员欣宸
  • MySQL 5.7 多主一从(多源复制)同步配置

    注:使用docker部署mysql实例,方便快速搭建演示环境。但本文重点是讲解主从配置,因此简略描述docker环境构建mysql容器实例。

    java思维导图
  • MySQL中的半同步复制(r11笔记第65天)

    关于MySQL的复制架构,大体有下面三种方式,异步,全同步复制,半同步复制。 三种复制方式 第一种是异步复制,是比较经典的主从复制,搭建主从默认的架构方...

    jeanron100
  • 金融应用场景下跨数据中心的MGR架构方案(1)

    在金融应用场景下,经常会要求在同城多中心部署高可用数据库架构,以期实现在发生故障时能达到快速切换的目标。

    老叶茶馆
  • kubernetes(二十)SpringCloud微服务容器化迁移

    详情参考: https://blog.csdn.net/qinaye/article/details/82840625

    alexhuiwang
  • MySQL与容器

    最近经常被问到,MySQL可以适用于容器吗?在这一篇里,简单地为大家介绍一下MySQL在容器上的使用。

    MySQLSE

扫码关注云+社区

领取腾讯云代金券