本文是在Dockec环境下对Mysql进行主从复制实践,在ubantu中安装docker相对简单,这里不做赘述。
原理:主从服务器利用MySQL的二进制日志文件,实现数据同步。二进制日志由主服务器产生,从服务器响应获取同步数据库。主服务器(Master)负责网站NonQuery操作,从服务器负责Query操作,用户可以根据网站功能模特性块固定访问Slave服务器,或者自己写个池或队列,自由为请求分配从服务器连接。
具体操作:
1、 启动两个容器
在Docker中run两个mysql容器,分别命名为mysql-master和mysql-slave作为主服务器和从服务器。利用docker ps -a查看全部容器:
设定连接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日志格式;
配置完之后重启mysql服务;
/etc/init.d/mysql restart
3、从服务slave配置
slave操作同2类似修改my.cnf配置,配置如下:
[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=3
配置完之后重启mysql服务;
/etc/init.d/mysql restart
4、创建mysql账号并授权给slave服务器
进入master服务,打开mysql服务创建mysql账号用于同步服务,命令如下:
GRANT replication slave ON *.* TO 'slave'@'%' IDENTIFIED BY '1234';
以上命令的详细解释,最好百度一下,写太多反到更加更不清思路。
创建完账号后,查看master状态;
记录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
注:
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 ;