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=ROWlog-bin=master-binlog-slave-updates=truegtid-mode=onenforce-gtid-consistency=truemaster-info-repository=TABLErelay-log-info-repository=TABLEsync-master-info=1slave-parallel-workers=2binlog-checksum=CRC32master-verify-checksum=1slave-sql-verify-checksum=1binlog-rows-query-log_events=1server-id=1report-port=3306report-host=masterplugin_load="rpl_semi_sync_master=semisync_master.so"rpl_semi_sync_master_enabled=1rpl_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=ROWlog-bin=mysql-bin.loglog-slave-updates=truegtid-mode=onenforce-gtid-consistency=truemaster-info-repository=TABLErelay-log-info-repository=TABLEsync-master-info=1slave-parallel-workers=2binlog-checksum=CRC32master-verify-checksum=1slave-sql-verify-checksum=1binlog-rows-query-log_events=1server-id=11report-port=3306report-host=slave1plugin_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=ROWlog-bin=mysql-bin.loglog-slave-updates=truegtid-mode=onenforce-gtid-consistency=truemaster-info-repository=TABLErelay-log-info-repository=TABLEsync-master-info=1slave-parallel-workers=2binlog-checksum=CRC32master-verify-checksum=1slave-sql-verify-checksum=1binlog-rows-query-log_events=1server-id=12report-port=3306report-host=slave2plugin_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-p53306:3306-v/data/test/master/conf:/etc/mysql/conf.d-e MYSQL_ROOT_PASSWORD=123456-d mysqldocker run--name slave1-p53307:3306-v/data/test/slave1/conf:/etc/mysql/conf.d-e MYSQL_ROOT_PASSWORD=123456-d mysqldocker run--name slave2-p53308: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 slave2172.17.0.100172.17.0.101172.17.0.102
登陆Master DB授权:
$ mysql-h127.0.0.1-uroot-p123456-P53306>GRANT REPLICATION SLAVE ON*.*TO slave@172.17.0.101IDENTIFIED BY'123456';>GRANT REPLICATION SLAVE ON*.*TO slave@172.17.0.102IDENTIFIED 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自动切换成异步复制模式,后面再次写入记录就不需要等待了。
欢迎工作一到五年的Java工程师朋友们加入Java工程师学习交流群:795632998
群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!
网友评论