您的当前位置:首页 >应用开发 >阿里二面:聊聊 MySQL 主从同步方案的优缺点 正文
时间:2025-11-04 18:30:41 来源:网络整理编辑:应用开发
大家好,我是君哥。今天来聊一聊 MySQL 主从架构。MySQL Replication 是 MySQL 官方提供的主从同步方案,用于将 MySQL 主库的数据同步到从库中,从库可以供应用程序读取数据
大家好,阿里我是面聊君哥。今天来聊一聊 MySQL 主从架构。同步
MySQL Replication 是缺点 MySQL 官方提供的主从同步方案,用于将 MySQL 主库的阿里数据同步到从库中,从库可以供应用程序读取数据。面聊
1.简介Replication 是同步目前 MySQL 使用最多的灾备方案,主要有 3 个作用:
读写分离,缺点写主库读从库。阿里这样大大降低主库的面聊负载,即使主库出现类似锁表之类的同步情况,也不影响应用读取数据。缺点实现灾备,阿里当主库发生故障时,面聊可以方便地把从库切换成主库,同步实现高可用(HA)。水平扩展,当应用访问量导致数据库 I/O 高时,可以通过水平扩展的方式将降低单机负载,降低磁盘 I/O。下面是一个 MySQL Replication 的案例。
图片
在上面的例子中,亿华云有一个主库,三个从库,通过 Replication,主库生成 events 的 binlog 发给 slave,Slave 将收到的 binlog 拷贝到 relaylog,然后解析 relaylog 中的命令进行执行,实现主从数据同步。
2.同步原理MySQL 通过 binlog 实现同步过程中,会用到 3 个线程:
IO thread: 从库执行 START SLAVE 语句时,会创建一个 IO thread,负责连接主节点,请求更新的 binlog,接收到 binlog 后写入 relaylog;dump thread:主库接收到从库的 binlog 请求后,创建一个 dump thread,把 binlog 同步给从库;sql thread:读取 relaylog,解析 relaylog 的命令并执行,将数据落库。整个同步流程如下:
图片
前面讲到,主从同步有读写分离、实现灾备、水平扩展等优点。那主从同步有哪些缺点呢?最大的缺点就是主从延迟。
导致主从延迟的主要原因如下:
从库所在机器性能差,命令执行慢;从库查询压力大,消耗了大量 CPU 资源,影响了 sql thread 执行;主库有大事务(比如大表DDL),这个事务里面执行的 sql 比较多,一方面主库需要等待事务执行完成才能写入 binlog,另一方面同步到从库和在从库执行都需要花费很多时间,导致主从延迟;数据库版本低,在 MySQL 5.6 之前,只支持单线程复制,效率比较低;表上无主键,主库利用索引更改数据,从库只能用全表扫描。要解决主备延迟的问题,服务器租用可以考虑下面方法:
优化业务逻辑,避免使用大事务,或者大事务场景尽量放在业务低峰期执行;提高从库所在机器的性能;保障网络性能,避免网络延迟;引入 semi-sync 半同步复制,配合异步复制。主从同步的第二个缺点就是数据丢失。
MySQL 有 3 种主从复制方式:
异步复制:主库执行完客户端提交的事务后立即将结果返回给客户端,不关心从库是否同步完成。这种方式很容易发生数据丢失,比如主库的日志还未同步给从库就宕机了,这时需要在从库中选择一个作为新主库,之前未同步完成的数据就丢失了;全同步复制:主库执行完客户端提交的事务并且等待从库也执行完成数据同步后再把结果返回给客户端。这种方式能够保证不丢失数据,但是数据库的性能会受到影响;半同步复制:是介于全同步和异步复制的一种方式,主库至少等待一个从库接收 binlog 并成功写入到 relaylog 后给客户端返回结果。主库不需要等待所有从库返回 ACK。MySQL 中默认采用异步复制,这样很容易导致数据丢失。一个好的方式就是采用 semi-sync 半同步复制插件。不过 semi-sync 存在一个问题,主库写数据到 binlog 后执行 commit,才会给从库同步数据。如果从库还没有返回 ACK,主库发生了宕机,从库还没有写完 relaylog 就被选择为主库,也会发生数据丢失。
为了解决这个问题,MySQL 5.7 引入了增强版半同步复制。主库写入数据到 binlog 后,就给从库进行同步,直到至少一个从库返回给主库 ACK,主库才会进行 commit 操作。
4.总结本文介绍了 MySQL 主从同步方案的优缺点,希望能对你使用和理解 MySQL 有所帮助。
福克斯特电脑使用教程(轻松掌握福克斯特电脑操作技巧)2025-11-04 18:20
图解支付系统订单号设计与最佳实践2025-11-04 18:05
.NET Core 与 MySQL 数据库关联技术指南2025-11-04 17:42
MySQL中Int(3)与Int(6)的数值范围相同吗?2025-11-04 16:49
一步学会如何制作引导优盘教程(轻松制作引导优盘,让文件传输更便捷)2025-11-04 16:41
GitHub Actions工具遭黑客攻击,数千个开源项目面临风险2025-11-04 16:39
加密货币盗窃案主犯 Wiz 落网 涉案金额达 2.43 亿美元2025-11-04 16:23
Hive SQL语句的正确执行顺序2025-11-04 16:06
scardsvr服务未启动的解决方法(解决scardsvr服务未启动问题的有效措施)2025-11-04 16:01
像查询数据库一样查询你的 Linux 操作系统信息2025-11-04 15:56
电脑端设置主页教程(简单教你如何在电脑上设置主页)2025-11-04 17:20
波兰极客用一张软盘运行Linux系统,用的还是最新内核2025-11-04 17:15
如何使用 Prometheus 仪表化应用2025-11-04 16:59
恶意 npm 包篡改本地 ethers 库以发起反向 Shell 攻击2025-11-04 16:46
电脑系统升级指南(轻松提升电脑速度,享受高效办公)2025-11-04 16:39
Cloudflare R2 服务中断事件:密码轮换错误引发全球故障2025-11-04 16:26
面试官:Redis 大 key 多 key,你要怎么拆分?2025-11-04 16:21
网络安全解析:你的数据是如何流入暗网的?2025-11-04 16:04
华硕S400E3317CA——性能卓越的笔记本电脑(华硕S400E3317CA引领移动办公新潮流)2025-11-04 16:03
物联网的未来:值得关注的6个趋势和预测2025-11-04 15:53