文章来源公众号ytao ,前言
作者ytao
MySQL的主从复制是实现应用的高性能,高可用的基础 。对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同 MySQL服务器,可有效减轻数据库压力 。当遇到 MySQL单点故障中,也能在短时间内实现故障切换 。本文就 MySQL的内建的复制功能进行阐述 。版本
- MySQl: 5.7.17
- centos: 7.4.1708
- Docker: 1.13.1
- 主库在数据更新提交事务之前,将事件异步记录到binlog二进制日志文件中,日志记录完成后存储引擎提交本次事务
- 从库启动一个I/O线程与主库建立连接,用来请求主库中要更新的binlog 。这时主库创建的binlog dump线程,这是二进制转储线程,如果有新更新的事件,就通知I/O线程;当该线程转储二进制日志完成,没有新的日志时,该线程进入sleep状态 。
- 从库的I/O线程接收到新的事件日志后,保存到自己的relay log(中继日志)中
- 从库的SQL线程读取中继日志中的事件,并执行更新保存 。
在主库的my.cnf中打开二进制日志,并设置服务Id 。
log-bin = mysql-bin注意 server-id必须是一个唯一的数字,必须主从不一致, 且主从库必须设置项 。
server-id = 1
从库my.cnf配置
【基于Docker实现MYSQL主从复制】log-bin = mysql-bin从库也开启 log-bin,log-slave-updates设置为从库重放中继日志时,记录到自己的二进制日志中,可以让从库作为其他服务器的主库,将二进制日志转发给其他从库,在做一主多从方案时可考虑该种方案 。
server-id = 2
log-slave-updates = 1
read-only = 1
Dockerfile构建MySQL镜像构建所需文件
这里master和slave文件各自保存不共用,先创建文件夹/usr/local/mysql然后在目录创建master和slave两个目录,再各自创建data文件夹
文章插图
- data 目录用来保存数据文件的目录
- Dockerfile 保存Dockerfile内容
- init.sql 初始化数据库的SQL
- my.cnf 数据库配置文件,配置方式上面已提到
- start.sh Dockerfile构建MySQL时的脚本
文章插图
这里的master和slave都是基于同一个镜像构建,使用的存储引擎和其他的组件最好是同一中,不然在复制过程中可能会出现异常 。
init.sql 初始化数据
文章插图
创建data_copy数据库和person表 。
start.sh 脚本
文章插图
构建master和slave镜像并运行容器
构建master镜像
docker build -t master/mysql .构建slave镜像
docker build -t slave/mysql .构建成功会返回Successfuly,或通过docker images命令查看镜像
文章插图
使用刚构建的镜像来运行容器
# master 容器docker run --name master -p 3306:3306 -v /usr/local/mysql/master/data/:/var/lib/mysql -d master/mysql# slave 容器docker run --name slave -p 3307:3306 -v /usr/local/mysql/slave/data/:/var/lib/mysql -d slave/mysql指定 master端口为 3306, slave端口为 3307,挂载data目录为保存数据的目录 。
连接到数据库后验证数据库是否初始化成功
文章插图
查看 log-bin 是否开启
文章插图
创建复制账号前面有提到从库I/O线程要与主库建立连接,所以需要用到账号进行验证 。账号除了要有连接权限(REPLICATION CLIENT),同时还要有复制权限(REPLICATION SLAVE) 。
GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO muser@'%' IDENTIFIED BY 'ytao';这里设置的访问地址是开放的,实际使用过程中安全起见一定要指定访问地址 。
从库启动复制从库连接到主库,获取到二进制日志后重放 。这里首先要配置上面创建的账号进行连接,使用命令进行相应的设置 。
推荐阅读
- 利用python微信库itchat实现微信自动回复功能
- 古丈县实现茶叶总产值580万元
- docker搭建自己的文件服务器
- 全连接神经网络的原理及Python实现
- docker镜像文件导入与导出,支持批量
- 一文看懂docker部署PostgreSQL 11.5及数据持久化教程
- 使用ffmpeg及nginx实现直播、点播、安防监控
- 桂平金田林场茶叶基地实现增产增收
- 深入理解Java继承的实现原理
- 没落重生辉煌 修水茶叶实现大嬗变