laradocker(docker)下实现主从复制

发布于 2018-08-10  987 次阅读


前言

MySQL复制技术可以异步地将主数据库的数据同步到从数据库。根据设置可以复制所有数据库、指定数据库甚至可以指定表。在laradock或者说docker里实现主从同步其实和一般实现步骤大体相同,多出来的步骤就是需要进入mysql容器。本文主要就是科普下怎么使用laradock进行mysql的主从复制技术,使用的方法是master(主服务器)开启binary logging(binlog),slave(从服务器)重放并复制日志中的事件。 至于什么叫mysql主从同步,不明白的可以去自行查询下,大概可以以一张图来阐述其原理。

master端设置

修改配置文件,开启binlog

一般来说mysql的配置文件存在于/etc/mysql/conf.d/,我们可以进入mysql容器里去修改,但是这样很麻烦,因为mysql容器里并没有编辑器,你必须自己去下一个,而且docker的通常做法也是把需要修改的东西挂载出来,同步进容器。所以在laradock里可以这样做,编辑mysql/my.cnf添加以下的配置,注意server-id一定不能和slave端相同。其中binlog-do-db等参数都可以按自己需要设置。
mysql/my.cnf添加的配置:

log-bin=mysql-bin # 使用binary logging,mysql-bin是log文件名的前缀  
server-id=1       # 唯一服务器ID,非0整数,不能和其他服务器的server-id重复  
binlog-do-db = studyabroad #需要同步的数据库名字,如果是多个,就以此格式在写一行即可。  
binlog-ignore-db = mysql  #不需要同步的数据库名字,如果是多个,就以此格式在写一行即可。  
log-slave-updates  #当Slave从Master数据库读取日志时更新新写入日志中,如果只启动log-bin 而没有启动log-slave-updates则Slave只记录针对自己数据库操作的更新。  
expire_logs_days=7 #设置bin-log日志文件保存的天数,此参数mysql5.0以下版本不支持。  
binlog_format="MIXED"   #设置bin-log日志文件格式为:MIXED,可以防止主键重复。

然后删除容器,重新打开mysql容器,就开启了binlog。怎么查看呢?
首先,进入mysql容器,输入账号密码进入mysql程序。

$ docker-compose exec mysql bash
$ mysql -u root -p

然后查询下bin_log,如果是值是ON则是开启了(当然OFF说明开启失败)

$ mysql> show variables like '%log_bin%';

或者,你还可以查询下master状态,如果不为空,也说明binlog开启成功,这里的有几个参数我们将会在slave端连接master端的时候用到。

$ mysql> show master status;

slave端设置

修改配置文件,设置server-id

slave端的配置文件设置方法和master端一模一样!只是参数不同,只需要一个server-id。方法参照master端,千万记得要删除mysql容器再启动一次,server-id一定不能和master端一样,否则同步的时候会报错。 mysql/my.cnf添加的配置:

server-id=2       # 唯一服务器ID,非0整数,不能和其他服务器的server-id重复

连接master端,进行主从复制

首先设置一个复制账号

进入master端的mysql

$ mysql> create user repl;  
$ mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'xxx.xxx.xxx.xx' IDENTIFIED BY 'mysql';  
$ mysql> flush privileges;

这样我们设置了一个账号为repl,密码为mysql,权限只有复制的账号

slave端进行连接

进入slave端的mysql

$ mysql> change master to master_host='xxx.xxx.xxx.xx',master_port=3306,master_user='repl',master_password='mysql',master_log_file='master-bin.000004',master_log_pos=1069;

其中master_host是主机ip,master_port是主机端口,master_usermaster_password是mysql账号密码。而master_log_filemaster_log_pos刚好就是我们在master$ mysql> show master status;得到的参数,一个是日志名,一个是开始位置。 然后启动配置:

$ mysql> start slave;

当然,你又要问了,怎么查看呢?

$ mysql> show slave status \G; 

其中Later_Io_Error如果为空则证明成功了。Slave_SQL_Running_State还提示你Slave has read all relay log; waiting for more update呢,如下:

当然也许会报错,也会在Later_Io_Error提示你到底哪错了,比如我有一次因为master_log_file的值设置错了,导致报错,如图:

验证

如果你在master的配置文件中设置了binlog-do-db(需要同步的数据库名字),那么就只有此数据库的操作会同步。可以更改这个数据库里表的参数,然后在slave端进行对比,可以发现slave端也跟着修改了。

结尾

这样基本就完成了mysqllaradock下的主从同步。当然masterslave其中可以只有一端由laradock启动的mysql容器,另外一端是平常的mysql。说白了,laradock或者docker只是一个载体,最终操作的都是mysql,只要熟悉mysql开启主从同步的方案就够用了。

参考文档:
1、基于docker的MySQL主从复制(replication)
2、数据库读写分离,主从同步实现方法
3、Mysql数据库主从心得整理


夏之日,冬之夜。百岁之后,归於其居。 冬之夜,夏之日。百岁之后,归於其室。 我们终将化为尘土,留下的都是点滴回忆。