shigen
坚持日更的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考,不断沉淀和成长。
shigen
今天带来的文章是mysql主从服务的搭建,原谅这篇迟到的文章。
先说一下我想搭建的原因的吧。我必须申明的是:我们目前的项目接触不到。shigen
是一个比较喜欢折腾的人,在接触腾讯云的云数据库(CDB)的时候,有很多的主从节点。我一想,我也可以尝试去搭建一个呢。
所以,本文的设计优点在于:
一个
docker-compose
文件即可启动; 详细的搭建过程; 结合实际业务的思考。
首先,我们需要整明白为什么需要主从节点的mysql服务,这就要对比我们单一节点的mysql了。
高可用,实时灾备,用于故障切换。比如主库挂了,可以切从库,保证系统的稳定性; 读写分离,提供查询服务,减少主库压力,提升性能; 备份数据,避免影响业务。
那好处在这里,mysql主从服务的原理是什么呢?我找到了一张图解释整个过程:
具体的过程是这样的:
- 主库提交完事务后,写入binlog日志
- 从库连接到主库,请求获取binlog日志
- 主库创建一个dump线程,将binlog推送到从库
- 从库开启一个IO线程读取同步过来的binlog,并记录到relay log中继日志中
- 从库再开启一个sql线程读取relay log中的记录,同步到数据库中
- 从库记录自己的binlog日志
好的,以上就是基本的理论,现在我们开始激动人心的实战篇。
Docker-compose.yaml
⚠️注意:
需要制定相同的同步数据库,这里是
test
指定
links
实现两个容器之间的内网访问 数据文件、配置文件的挂载
My.cnf
master
这里炫酷一点是为了改变默认显示灰色的字体,看起来效果不大理想。具体的配置代表的含义都有详细的注释。
好的,现在万事俱备,只欠东风了
。
执行docker-compose up -d
命令,会发现拉取镜像、启动容器了。
我们尝试连接一下mysql的主节点:
此时发现mysql的主节点上已经有一个数据库test
了,但是数据表是空的。
用魔法
生成表结构哥模拟数据:
此时,我们查询一下mysql主节点的状态:
出现以上的结果,代表主节点的配置完成了,现在我们中心在slave
节点。
我们进入slave容器,并用 curl mysql-master:3306
尝试一下是否能获得相应。
shigen
这里也是先执行docker inspect xxx
查看了容器的详细信息,才发现可以直接用mysql-master
作为主节点的IP。
进入容器的mysql,执行一下的命令:
参数代表的含义:
master_host master的ip master_port master的端口 master_user master 用户名 master_password master 密码 master_log_file master中此时的File 参数 master_log_pos master中此时的Position 参数
现在,我们看一下从节点的状态:
此时发现配置上没啥问题了,但是数据没同步怎么回事呢?分析了发现:master_log_pos master中此时的Position 参数设置的有问题,我们应该从0开始。
那怎么办,复制一下之前的建表语句和数据的插入语句。
我们再次在主节点插入一条数据,看看从节点会不会同步过来。
查询了从节点的数据,发现同步过来了,代表着我的主从节点的搭建成功了!
其实还有其他的一主多从架构,加上keepalive nginx,实现负载均衡……感兴趣的伙伴可以再去研究下。
以上就是今天分享的全部内容了,觉得不错的话,记得点赞 在看 关注
支持一下哈,您的鼓励和支持将是shigen
坚持日更的动力。
与shigen
一起,每天不一样!