小知识:基于Docker如何实现MySQL主从复制详解

前言

mysql的主从复制是实现应用的高性能,高可用的基础。对于数据库读操作较密集的应用,通过使数据库请求负载均衡分配到不同mysql服务器,可有效减轻数据库压力。当遇到mysql单点故障中,也能在短时间内实现故障切换。本文就mysql的内建的复制功能进行阐述。

版本

mysql: 5.7.17 centos: 7.4.1708 docker: 1.13.1

概述

mysql复制数据流程:

主库在数据更新提交事务之前,将事件异步记录到binlog二进制日志文件中,日志记录完成后存储引擎提交本次事务 从库启动一个i/o线程与主库建立连接,用来请求主库中要更新的binlog。这时主库创建的binlog dump线程,这是二进制转储线程,如果有新更新的事件,就通知i/o线程;当该线程转储二进制日志完成,没有新的日志时,该线程进入sleep状态。 从库的i/o线程接收到新的事件日志后,保存到自己的relay log(中继日志)中 从库的sql线程读取中继日志中的事件,并执行更新保存。

%小知识:基于Docker如何实现MySQL主从复制详解-猿站网-插图

配置主从库

主库my.cnf配置

在主库的my.cnf中打开二进制日志,并设置服务id。

?
1
2
log-bin = mysql-bin
server-id = 1

注意server-id必须是一个唯一的数字,必须主从不一致, 且主从库必须设置项。

从库my.cnf配置

?
1
2
3
4
log-bin = mysql-bin
server-id = 2
log-slave-updates = 1
read-only = 1

从库也开启log-bin,log-slave-updates设置为从库重放中继日志时,记录到自己的二进制日志中,可以让从库作为其他服务器的主库,将二进制日志转发给其他从库,在做一主多从方案时可考虑该种方案。

dockerfile构建mysql镜像

构建所需文件

这里master和slave文件各自保存不共用,先创建文件夹 /usr/local/mysql 然后在目录创建master和slave两个目录,再各自创建data文件夹

%小知识:基于Docker如何实现MySQL主从复制详解-1猿站网-插图

data 目录用来保存数据文件的目录 dockerfile 保存dockerfile内容 init.sql 初始化数据库的sql my.cnf 数据库配置文件,配置方式上面已提到 start.sh dockerfile构建mysql时的脚本

dockerfile 内容

?
1
2
3
4
5
6
7
8
9
10
11
# 利用 mysql 镜像创建新的镜像
from mysql:5.7.17
env mysql_root_password ytao
copy start.sh /mysql/start.sh
copy my.cnf /etc/mysql/my.cnf
copy init.sql /mysql/init.sql
expose 3306
cmd [“sh”, “/mysql/start.sh”]

这里的master和slave都是基于同一个镜像构建,使用的存储引擎和其他的组件最好是同一中,不然在复制过程中可能会出现异常。

init.sql 初始化数据

?
1
2
3
4
5
6
7
8
9
10
11
12
— 创建 data_copy 数据库
drop database if exists `data_copy`;
create database `data_copy` /*!40100 default character set utf8mb4 collate utf8mb4_general_ci */;
— 创建 person 表
use `data_copy`;
drop table if exists `person`;
create table `person` (
`id` int(32) not null,
`name` varchar(255) default null,
primary key (`id`)
) engine=innodb default charset=utf8mb4;

创建data_copy数据库和person表。

start.sh 脚本

?
1
2
3
4
5
6
7
8
9
#!/bin/sh
echo 启动mysql
service mysql start
sleep 5
echo 初始化数据库
mysql -uroot -pytao < /mysql/init.sql
echo 初始化完成!
tail -f /dev/null

构建master和slave镜像并运行容器

构建master镜像

?
1
docker build -t master/mysql .

构建slave镜像

?
1
docker build -t slave/mysql .

构建成功会返回 successfuly,或通过docker images命令查看镜像

%小知识:基于Docker如何实现MySQL主从复制详解-2猿站网-插图

使用刚构建的镜像来运行容器

?
1
2
3
4
5
# 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目录为保存数据的目录。

连接到数据库后验证数据库是否初始化成功

%小知识:基于Docker如何实现MySQL主从复制详解-3猿站网-插图

查看 log-bin 是否开启

%小知识:基于Docker如何实现MySQL主从复制详解-4猿站网-插图

创建复制账号

前面有提到从库i/o线程要与主库建立连接,所以需要用到账号进行验证。账号除了要有连接权限(replication client),同时还要有复制权限(replication slave)。

?
1
grant replication client, replication slave on *.* to muser@% identified by ytao;

这里设置的访问地址是开放的,实际使用过程中安全起见一定要指定访问地址。

从库启动复制

从库连接到主库,获取到二进制日志后重放。这里首先要配置上面创建的账号进行连接,使用命令进行相应的设置。

?
1
2
3
4
5
6
change master to
master_host = 47.107.xx.xxx,
master_port = 3306,
master_user = muser,
master_password = ytao,
master_log_file = mysql-bin.000006;

到这里复制还没有启动,需要再从库中启动

?
1
start slave;

使用show slave status\g;命令查看启动后的情况

%小知识:基于Docker如何实现MySQL主从复制详解-5猿站网-插图

上面标记的输出信息slave_io_running: yes和slave_sql_running: yes可以看到i/o线程和sql线程已启动运行中。

测试同步数据

如果在主库中添加,更新或删除一个数据,那么从库中应该也有与主库对应的数据变化。

向主库添加一条数据

?
1
insert into `data_copy`.`person` (`id`, `name`) values (1, ytao);

查询从库数据,数据已被同步过来。

%小知识:基于Docker如何实现MySQL主从复制详解-6猿站网-插图

总结

上述是最简单最基本的配置,但是理解上面的配置过程,就可以根据自身情况定制不同方案,实现一主多从,主主复制(主动-主动或主动-被动模式)等等来满足自身需求。

mysql的复制虽然使用简单方便,但也伴随着一些问题需要我们在使用中进行解决,比如:不能从服务器异常停止中恢复,数据同步的延迟等等,还好现在遇到的大部分问题在行业中已得到相应的解决。对这方面感兴趣的可以去了解下现在解决这些问题的中间件实现方案。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。

原文链接:https://segmentfault.com/a/1190000020841305

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:Docker部署springboot项目实例解析

2023-4-1 12:38:15

建站知识

小知识:Docker底层技术Namespace Cgroup应用详解

2023-4-1 12:53:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索