Docker中Mysql主从复制实践总结

本文是在Dockec环境下对Mysql进行主从复制实践,在ubantu中安装docker相对简单,这里不做赘述。

原理:主从服务器利用MySQL的二进制日志文件,实现数据同步。二进制日志由主服务器产生,从服务器响应获取同步数据库。主服务器(Master)负责网站NonQuery操作,从服务器负责Query操作,用户可以根据网站功能模特性块固定访问Slave服务器,或者自己写个池或队列,自由为请求分配从服务器连接。

具体操作:

1、 启动两个容器

在Docker中run两个mysql容器,分别命名为mysql-master和mysql-slave作为主服务器和从服务器。利用docker ps -a查看全部容器:
Docker中Mysql主从复制实践总结_第1张图片
设定连接mysql-slave容器的对外端口为3307,mysql-master对外端口为3306。

2、主服务master配置

修改master的mysql配置my.cnf使其支持二进制文件,使用命令 vi /etc/mysql/my.cnf修改内容:

[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=2

配置描述
1. log-bin=mysql-bin #启动MySQ二进制日志系统,注意:如果原来的配置文件中已经有这一行,就不用再添加;
2. server_id=xx #为服务器设定唯一ID,默认是1,一般取IP最后一段;这里我使用容器ip(172.17.0.2)最后一位2;
3. binlog_format=mixed #mysql日志格式;
Docker中Mysql主从复制实践总结_第2张图片

配置完之后重启mysql服务;

/etc/init.d/mysql restart

3、从服务slave配置

slave操作同2类似修改my.cnf配置,配置如下:

[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=3

Docker中Mysql主从复制实践总结_第3张图片

配置完之后重启mysql服务;

/etc/init.d/mysql restart

4、创建mysql账号并授权给slave服务器

进入master服务,打开mysql服务创建mysql账号用于同步服务,命令如下:

GRANT replication slave ON *.* TO 'slave'@'%' IDENTIFIED BY '1234'; 

以上命令的详细解释,最好百度一下,写太多反到更加更不清思路。
创建完账号后,查看master状态;

Docker中Mysql主从复制实践总结_第4张图片

记录Fil和Position的值,后续配置slave中会用到!

注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化。

5、配置从服务器slave

进入mysql服务后,输入如下命令进行配置:

CHANGE MASTER TO MASTER_HOST='172.17.0.2',MASTER_USER='slave',MASTER_PASSWORD='1234',MASTER_PORT=3306,MASTER_LOG_FILE='**mysql-bin.000001**',MASTER_LOG_POS=**2482**,MASTER_CONNECT_RETRY=10;

注:黑色部分值为第4环节中的相关配置。

配置完之后启动slave复制服务,命名如下:

start slave

检查从服务器复制功能状态,命令如下:

show slave status\G

Docker中Mysql主从复制实践总结_第5张图片

注:
Slave_IO_Running和Salve_SQL_Running都为yes,那么表明可以成功同步了!若其中有一个为no都不行。到此mysq主从配置全部完成!累死我了,花了半个多小时,哈哈!

6、测试主从复制

在master服务中的mysql服务的abccs库中插入一条数据,然后在slave服务中进行查询即可!

7、遇见问题汇总

slave从服务器配置完成后发现Salve_SQL_Running为no,有可能程序可能在slave上进行了写操作,也可能是slave机器重起后,事务回滚造成的.
解决方案1:

mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;

你可能感兴趣的:(Docker中Mysql主从复制实践总结)