前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Docker快速体验MySQL半同步复制机制

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

原创
作者头像
Coder Sam
发布2018-09-14 13:29:33
3K4
发布2018-09-14 13:29:33
举报
文章被收录于专栏:Coder Sam的专栏Coder Sam的专栏

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

1. MySQL Image的选取

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

代码语言:txt
复制
docker pull mysql

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

代码语言:txt
复制
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时就包含定制配置。

在本地创建相应目录:

代码语言:txt
复制
mkdir -p master/conf slave1/conf slave2/conf

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

代码语言:txt
复制
[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,内容如下:

代码语言:txt
复制
[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,内容如下:

代码语言:txt
复制
[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操作。

代码语言:txt
复制
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,执行下面命令:

代码语言:txt
复制
$ docker inspect --format '{{.NetworkSettings.IPAddress}}' master slave1 slave2
172.17.0.100
172.17.0.101
172.17.0.102

登陆Master DB授权:

代码语言:txt
复制
$ 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配置主从关系:

代码语言:txt
复制
$ 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;
代码语言:txt
复制
$ 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已经搭建好了,可以通过下面命令查看同步状态。

代码语言:txt
复制
$ 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:

代码语言:txt
复制
docker stop slave1

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

3.3 两台Slave DB都挂了

再停止Slave DB 2的container:

代码语言:txt
复制
docker stop slave2

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. MySQL Image的选取
  • 2. 搭建一主两备DB
    • 2.1 配置DB
      • 2.2 启动DB container
        • 2.3 配置主从关系
        • 3. 体验半同步复制功能
          • 3.1 正常情况
            • 3.2 Slave DB 1挂了
              • 3.3 两台Slave DB都挂了
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档