本篇讲解的是基于docker+mysql底层的log日志完成的主从复制(暂没有使用到mycat做)
(一)看log的主从复制原理图
(二)搭建步骤
0.省略docker操作mysql容器等步骤...
1.启动主从两台mysql
启动主机:docker run -p 3307:3306 --name mysql-master -v $PWD/mysql-master/conf:/etc/mysql/conf.d -v $PWD/mysql-master/logs:/logs -v $PWD/mysql-master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
启动从机:docker run -p 3306:3306 --name mysql-slave -v $PWD/mysql-salve/conf:/etc/mysql/conf.d -v $PWD/mysql-salve/logs:/logs -v $PWD/mysql-salve/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
注:启动容器后,可以使用:docker inspect mysql-master|grep IP 命令查询当前容器的IPAddress,在后面需要使用到
2.进入mysql-master容器中: docker exec -it mysql-master /bin/bash
2.1 复制my-default.cnf文件:cp /usr/share/mysql/my-default.cnf /etc/my.cnf
2.2 编辑my.cnf文件:
在此文件的#logbin内容下面指定两个语句:
#指定当前mysql主机的唯一id
server_id=1
#指定(打开)当前mysql主机的二进制日志文件(看mysql主从复制原理图)
log-bin=mysql-bin
2.3 重新启动mysql服务器 systemctl restart mysql
3.进入mysql-slave容器中: docker exec -it mysql-slave /bin/bash
3.1 复制my-default.cnf文件:cp /usr/share/mysql/my-default.cnf /etc/my.cnf
3.2 编辑my.cnf文件:
在此文件的#logbin内容下面指定一个语句:
#指定当前mysql主机的唯一id
server_id=2
[上面为单向主从复制,如果执行为双向主从复制,就要将与主机中一样,指定二进制日志文件]
2.3 重新启动mysql服务器 systemctl restart mysql
接下来的4与5步是:打通主从两台机之间的通道,进行二进制文件之间的复制传输数据
4 打通主机通道
4.1 进入mysql-master容器中: docker exec -it mysql-master /bin/bash
4.2 登录进mysql中:mysql -uroot -p123456
4.3 创建用于管理传输通道的一个用户:mysql> create user 'repl'@'172.17.0.%' identified by '123456';
[注:172.17.0.%为上面查询到的IPAddress,%为通配符,此句的意思就是172.17.00.%这个网段下的所有机器都能使用到这个repl用户]
4.4 赋权限给此用户:mysql> grant replication slave on *.* to 'repl'@'172.17.0.%' identified by '123456';
4.5 把权限重新刷新下:mysql>flush privileges;
4.6 mysql>exit
4.7 在容器中重启mysql
[注:两种方式重启mysql:
第一种:由于当前mysql容器的系统是Ubuntu,所以需要使用service mysql restart重启mysql,但这样会自动退出当前容器,所以需要重新创建容器;
第二种(这种方式较为极端):
打开一个新的窗口,以mysql-master容器的基础上使用commit构建一个新的镜像,然后再在此新的镜像my-mysql-master,
并在此镜像上创建新的容器my-mysql-master的基础上操作,同时可以删除原先的mysql-master容器
]
检查是否成功:mysql>show master status;/G
5 打通从机通道
5.1 打开一个新的窗口,以mysql-slave容器的基础上使用commit构建一个新的镜像,然后再在此新的镜像my-mysql-slave,
并在此镜像上创建新的容器my-mysql-slave的基础上操作,同时可以删除原先的mysql-slave容器
5.2 进入my-mysql-slave容器后,先停止从机通道 mysql>stop slave;
5.3 mysql>change master to master_host='172.17.2.4',master_user='repl',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=120;
[注:master_host的值为主机的IPAddress,master_log_file与master_log_pos就是在主机容器中使用mysql>show master status;/G查出来的结果]
5.4 重启:mysql>start slave;
5.5 mysql>show slave status \G;
6.mysql检查创建的用户是否存在;
列:SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = 'username');
如:SELECT EXISTS(SELECT 1 FROM mysql.user WHERE user = 'repl');
7.增加注意:
mysql的主从复制在高并发的情况下会有错误,因为mysql底层主从复制是采用的单线程来进行二进制流文件的复制,而在多线程的情况下它是无法处理的了的。
也就是数据量大的情况下,一定要将底层单线程模式设置为多线程模式去做主从复制。