通知:即日起,禁止携带Note 7登机,且不得作为航空货物托运或承运
06-17
前言上面《MySQL数据被误删怎么办?》介绍了MySQL出现故障或者误删除数据后,可以通过备份+binlog来恢复数据。但是当备份文件和binlog都丢失时会发生什么呢?因此,单个节点是不可靠的。
为了避免单节点故障和MySQL服务的可用性造成的数据丢失,生产环境通常采用高可用或集群模式。这背后,离不开主从复制技术,因此本文介绍主从复制的原理和操作,以全面了解这项技术。
主从复制原理复制源MySQL的主从复制主要是将主节点的数据同步到从节点。这个数据的来源是binlog(上一篇文章也提到过)。
binlog文件中的格式是这样的: 代码语言:bash copy |日志名称|邮政 |事件类型 |服务器 ID |结束日志位置 |信息 | mysql-bin.04 | |匿名_Gtid | 1 | | SET @@SESSION.GTID_NEXT= '匿名' | | mysql-bin.04 | |查询 | 1 | |开始 || mysql-bin.04 | |查询 | 1 | |使用“测试”; INSERT INTO 帐户(id、用户、余额)VALUES (30, 'CCV' ,)|| mysql-bin.04 | |西德 | 1 | | COMMIT /* xid=*/ 那么,MySQL是如何将主节点的binlog同步到从节点的呢?通过binlog文件可以看到master节点的工作情况。每个事务提交后,对应的SQL语句都会清晰地记录在binlog中。
因此,当binlog中添加新的日志时,可以将这些日志传输到从节点来完成工作。它由主节点中的“binlog dump”线程处理。
从节点接收到主节点发来的日志后,剩下的工作由从节点完成。在主从复制的情况下,从节点主要使用两个线程和一个日志文件来完成工作。
这两个线程是“IO线程”和“SQL线程”。 “IO线程”用于连接主节点,接收日志(一些SQL语句)并记录到“relaylog”,“SQL线程”用于执行“relaylog”执行SQL执行,以达到复制目的。
如果设计了复制流程不是可以直接执行SQL吗?为什么需要两个线程+一个日志才能完成主从复制?试想一下,如果直接执行SQL的时候出现故障怎么办?如果执行时间过长,阻塞积压导致复制延迟怎么办?因此,MySQL的设计有两个好处:使用两个线程可以在发生错误时提供故障隔离。例如,如果SQL线程遇到错误,它可以停止并等待IO线程发送下一个日志。
如果 IO 线程遇到错误,它可以从最后一个已知的成功位置重新开始拉取日志。 IO操作和SQL操作可以并行执行,提高复制效率。
另一个重要原因是:为了满足高一致性的需求,MySQL还提供了半同步和组复制模式。简单来说,主节点需要确认从节点已经接收到数据才同步成功,即实现日志。
到“中继日志”。如果直接执行SQL,然后响应主节点,可想而知复制效率极低。
这里给出一个主从复制的工作流程图,方便理解。这里插一张图来描述一下主从复制环境的搭建。
接下来我将演示如何搭建主从复制环境。1、主从节点配置 在搭建主从复制环境之前,需要保证主从实例之间能够通信。
另外,需要注意两点:需要保证主从实例的serverid不一致。如果一致,则需要在配置文件/etc/my.cnf中进行设置。
cnf 进行修改。 master节点需要开启binlog,也是在/etc/my.cnf中配置。
在此插入图片说明。另外,主节点需要创建两个角色供从节点使用。
创建角色的命令如下: sql copy--创建'repl'用户并授权slave节点复制权限 CREATE USER 'repl'@ '%' IDENTIFIED WITH mysql_native_password BY 'repl56';GRANTreplicationslave on * .* to 'repl'@'%';--创建'replroot'用户并授予从节点所有权限,以便从节点可以远程备份数据 CREATE USER 'replroot'@'%' IDENTIFIED WITH mysql_native_password BY 'root56';将 *.* 上的所有内容授予 'replroot'@'%'; 2. 启用从从节点的复制。配置完成后,从节点即可启用复制。
复制 步骤如下: 1. 备份主节点数据 远程备份主节点数据。命令如下: 代码语言:bash copy mysqldump -ureplroot -proot56 -h ..0.39 -P -A --master-data=2 --single-transaction -R -E --triggers >/root/full。
sql这里插入图片描述2.将数据同步到从节点,并对从节点进行恢复操作,使从节点的状态最接近主节点的状态。这样,从节点就可以根据最新的状态开始复制。
恢复命令如下: 代码语言:sql copy set sql_log_bin=0;源 /root/full.sql 设置 sql_log_bin=1;命令执行后,可以在从节点上看到主节点的数据。此处插入图片说明 3. 从节点 复制参数配置数据同步后,可以执行以下命令查看从节点开始复制的位置。
代码语言: bash copy grep "\--\ CHANGE MASTER" /root/full.sql 在这里插入图片描述,你是否觉得这些操作很熟悉?是的,到目前为止,以上操作都是上面介绍的备份和恢复操作。最后在从节点上执行以下命令配置复制参数,实现主从复制。
代码语言:sql复制--修改复制相关参数 CHANGE MASTER TO MASTER_HOST='主节点的ip', MASTER_PORT=, MASTER_USER='repl', MASTER_PASSWORD='repl56', MASTER_LOG_FILE='mysql-bin.01', MASTER_LOG_POS= ,MASTER_CONNECT_RETRY=60;--启动复制进程start Slave;其中 MASTER_LOG_FILE 和 MASTER_LOG_POS 是二进制日志以及从节点应开始复制主节点的位置。至此,主从复制就搭建起来了,mom再也不用担心节点故障或者数据误删了。
3. 验证复制环境。如何验证复制环境已经搭建完成?我们可以执行show Slave status \G;在从节点上命令查看复制进度、错误信息、复制状态等,如果有结果输出,则说明环境搭建成功。
类似下图,这里插入图片描述或者执行show Slave Hosts;在主节点上命令查看从节点信息。如果有输出则说明设置成功。
类似下图,这里插入图片描述。设置好环境后就可以看到复制效果了。
在启用复制之前,从节点的数据状态如下:此处插入图片描述。此时我在主节点上执行两条DML命令,然后在从节点上检查数据是否同步。
代码语言:sql copy INSERT INTO `account` VALUES(80,'LKJ',.00)UPDATE `account` SET Balance=WHERE id=1;从下图可以看到从节点的数据已经同步。此处插入图片 描述主从复制失败。
监控主从复制。主从复制会失败吗?如果出现问题我该怎么办?当然,失败也会发生。
通常可以通过 show Slave status \G 监控复制进度、错误消息和复制状态;并在出现问题时制定正确的补救措施。监控主从复制状态重点关注Slave_IO_Running和Slave_SQL_Running状态。
两种状态均应显示“是”,表明复制运行正常。 Last_Errno 和 Last_Error 字段表示错误代码或错误消息,它们可以指示复制过程中的问题。
例如,查询中出现以下错误: Code language: bash copy Last_Error: Error 'ER_BAD_SLAVE: Slave I/O thread Killed while Reading event from master' has gone in query: 'SELECT * FROM my_table' 该错误表示从节点正在尝试读取事件 当遇到问题时,要看是网络问题还是权限问题。监控主从复制延迟可以通过比较主从节点上的时间戳、数据版本等信息来检测复制延迟。
例如,Seconds_Behind_Master字段指示从节点落后于主节点的秒数。如果该值持续较高,则可能存在复制延迟问题。
这时,我们需要检查\color{blue}{主从节点之间是否存在网络延迟}。我们需要增加网络带宽吗? \color{blue}{主库并发事务高吗}?需要改成复制模式组复制吗? \color{blue}{从从库刷盘还是慢}。
是否需要增加从节点的复制线程数?具体情况具体分析。当然,故障情况还是有很多的。
可以使用一些开源监控工具,如Zabbix、Prometheus、pt-slave-delay等,实时监控主从复制的状态和性能指标。这些工具通常都提供报警功能,以便在出现异常时能够及时发现并处理。
总结无论是备份恢复还是主从复制,目的都是为了提高MySQL的可靠性和可用性。两者本质上都是数据的复制+传输。
前者是为了故障恢复,后者更多的是为了高可用、故障转移、读写分离等需求。在复制的基础上,可以使用MHA、MMM、ProxySQL、MyCAT等中间件来实现高可用、读写分离等需求。
当然,现在大多数公司更喜欢云上的高可用性、集群数据库。即便如此,您仍然需要知道发生了什么以及为什么发生,以防万一您需要。
我正在参加第五期腾讯科技创造特训营有奖征文比赛。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-21
06-18
06-18
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用