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

栏目: 数据库 · 发布时间: 7年前

内容简介:近期研究了下MySQL的半同步复制机制(可参考《MySQL官方提供了标准Image,能够满足基本的MySQL功能。假如本地没有这个Image,可以通过以下命令获取。默认拉取的是latest版本,也可指定具体版本,如:

近期研究了下 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自动切换成异步复制模式,后面再次写入记录就不需要等待了。


以上所述就是小编给大家介绍的《使用Docker快速体验MySQL半同步复制机制》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Fluent Python

Fluent Python

Luciano Ramalho / O'Reilly Media / 2015-8-20 / USD 39.99

Learn how to write idiomatic, effective Python code by leveraging its best features. Python's simplicity quickly lets you become productive with it, but this often means you aren’t using everything th......一起来看看 《Fluent Python》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码