核心内容摘要
JS反混淆的艺术:在混乱中重构代码之美(二)
予枫个人主页 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》 Debug 这个世界Return 更好的自己引言作为后端程序员谁没被MySQL主从延迟坑过线上数据同步慢、读写分离时查不到新数据排查起来一头雾水。
其实核心就两点搞懂Binlog格式差异摸清复制线程工作逻辑再针对性优化延迟问题。
本文从基础原理到实战方案手把手教你吃透主从复制轻松应对延迟难题文章目录引言
核心基础BINLOG三种格式详解
1 Statement格式语句级复制
2 Row格式行级复制
3 Mixed格式混合级复制
复制流程三大线程如何协同工作
1 核心线程职责
2.
1 Dump Thread主库线程
2.
2 IO Thread从库线程
2.
3 SQL Thread从库线程
2 完整复制流程步骤拆解
重点突破主从延迟的原因与解决方案 ⚡
1 主从延迟的核心原因
3.
1 从库SQL Thread单线程瓶颈最主要
3.
2 主从网络延迟
3.
3 主库Binlog写入延迟
3.
4 大事务/慢查询影响
2 针对性解决方案从易到难
3.
1 基础优化快速见效
3.
2 核心优化并行复制解决单线程瓶颈模式1按库并行复制MySQL
6模式2按逻辑时钟并行复制MySQL
8.
03.
3 其他优化方案
四、
总结
核心基础BINLOG三种格式详解 主从复制的核心是Binlog二进制日志它记录了主库的所有数据变更操作而Binlog的格式直接影响复制效率和数据一致性主流格式有Statement、Row、Mixed三种各有优劣。
1 Statement格式语句级复制特点记录执行的SQL语句而非数据本身。
原理主库执行SQL后将SQL语句写入Binlog从库读取后执行相同SQL完成同步。
优势日志体积小节省磁盘和网络IO记录清晰便于审计。
劣势存在“非确定性语句”问题如NOW()、RAND()可能导致主从数据不一致部分函数和存储过程复制容易出问题。
适用场景简单业务场景无复杂函数和不确定语句对日志体积敏感的场景。
-- 示例Statement格式下Binlog记录的内容UPDATEuserSETnameyufengWHEREid1;-- 直接记录该SQL语句
2 Row格式行级复制特点记录数据行的变更细节而非SQL语句。
原理主库执行SQL后将数据行修改前后的状态写入Binlog从库直接根据行数据变更同步。
优势完全避免非确定性语句问题主从数据一致性最高复制逻辑简单适配所有SQL场景。
劣势日志体积大尤其是批量更新时磁盘和网络压力大日志可读性差需借助工具解析。
适用场景复杂业务场景有大量批量操作或不确定语句对数据一致性要求极高的场景如金融、电商。
-- 示例Row格式下Binlog记录的内容简化版-- 并非记录SQL而是记录行数据变更id1的行name从old改为yufeng
3 Mixed格式混合级复制特点自动切换Statement和Row格式取两者之长。
原理默认使用Statement格式当检测到非确定性语句、复杂函数等场景时自动切换为Row格式。
优势兼顾日志体积和数据一致性适配大多数业务场景。
劣势切换逻辑复杂排查问题时需区分当前格式增加运维成本。
适用场景普通业务场景既想节省日志空间又不想牺牲过多一致性。
小提示建议生产环境优先选择Row格式虽然日志体积大但数据一致性有保障后续排查问题也更便捷。
觉得有用的话点赞收藏一下后续好找~
复制流程三大线程如何协同工作 MySQL主从复制依赖三个核心线程主库的Dump Thread、从库的IO Thread和SQL Thread三者协同完成数据同步流程清晰易懂。
1 核心线程职责
2.
1 Dump Thread主库线程作用接收从库IO Thread的连接请求读取主库Binlog日志内容按顺序发送给从库。
细节不会主动推送日志仅在从库请求时响应每次从库连接都会创建一个Dump Thread。
2.
2 IO Thread从库线程作用主动连接主库接收Dump Thread发送的Binlog日志写入从库的Relay Log中继日志。
细节Relay Log是Binlog的副本避免直接操作Binlog导致的冲突提高复制稳定性。
2.
3 SQL Thread从库线程作用读取Relay Log中的日志内容解析后执行对应的SQL语句将主库数据变更同步到从库。
细节默认单线程执行这也是主从延迟的核心原因之一后续重点优化。
2 完整复制流程步骤拆解从库配置主库信息主库IP、端口、用户名、密码、起始Binlog文件和位置从库启动IO Thread连接主库Dump Thread主库Dump Thread读取Binlog日志从指定位置开始发送给从库IO Thread从库IO Thread将接收的日志写入Relay Log从库SQL Thread读取Relay Log执行SQL语句完成数据同步三个线程循环执行保持主从数据实时同步。
小结整个复制流程是“主库推送-从库接收-从库执行”的异步过程任何一个环节卡顿都会导致主从延迟。
重点突破主从延迟的原因与解决方案 ⚡主从延迟是生产环境高频问题表现为从库数据比主库滞后影响读写分离可用性。
下面先分析核心原因再给出针对性解决方案重点讲解并行复制优化。
1 主从延迟的核心原因
3.
1 从库SQL Thread单线程瓶颈最主要问题默认情况下从库只有一个SQL Thread执行Relay Log中的SQL而主库可以并行执行多个SQL多连接当主库并发高时从库处理不及时延迟递增。
示例主库每秒执行1000条SQL从库单线程每秒只能处理300条延迟会越来越大。
3.
2 主从网络延迟问题主库和从库跨机房部署时网络传输存在延迟Binlog日志发送到从库需要时间。
影响网络延迟越大从库接收日志越慢同步滞后越明显。
3.
3 主库Binlog写入延迟问题主库高并发场景下Binlog写入磁盘可能存在IO瓶颈导致日志生成缓慢间接影响从库同步。
3.
4 大事务/慢查询影响问题主库执行大事务如批量更新10万条数据或慢查询会导致Binlog日志体积大从库执行时间长产生瞬时高延迟。
2 针对性解决方案从易到难
3.
1 基础优化快速见效优化主库Binlog写入开启Binlog缓存binlog_cache_size减少磁盘IO使用SSD磁盘提升读写速度。
优化从库配置关闭从库二进制日志若从库不做级联复制减少日志写入开销调整从库参数如innodb_flush_log_at_trx_commit2平衡一致性和性能。
避免大事务和慢查询主库禁止批量更新全表数据拆分大事务优化慢查询避免长时间锁表。
3.
2 核心优化并行复制解决单线程瓶颈并行复制的核心思路让从库多个线程同时执行Relay Log中的SQL提升从库处理效率降低延迟。
MySQL
6及以上版本支持并行复制主要有两种模式模式1按库并行复制MySQL
6原理以数据库为单位不同库的SQL可以并行执行同一库的SQL仍串行执行。
配置# 从库my.cnf配置 slave_parallel_type DATABASE # 并行复制模式按库 slave_parallel_workers 4 # 并行工作线程数建议设为CPU核心数的
倍 slave_sql_verify_checksum 1 # 开启校验确保数据一致性优势配置简单兼容性好适合多库业务场景。
劣势单库高并发场景下优化效果有限。
模式2按逻辑时钟并行复制MySQL
0原理基于GTID全局事务ID和逻辑时钟同一库中无冲突的事务可以并行执行优化效果更明显。
配置# 从库my.cnf配置 slave_parallel_type LOGICAL_CLOCK # 并行复制模式逻辑时钟 slave_parallel_workers 8 # 并行线程数根据业务调整 binlog_transaction_dependency_tracking WRITESET # 基于写入集判断事务依赖 slave_preserve_commit_order 1 # 保证事务提交顺序与主库一致优势单库高并发场景下优化显著延迟降低效果明显。
劣势配置稍复杂需依赖GTID适合MySQL
0及以上版本。
实操建议生产环境优先使用按逻辑时钟的并行复制MySQL
0线程数根据CPU核心数和业务并发调整一般设为
个即可过多线程会导致资源竞争。
记得点赞收藏实操时直接参考配置~
3.
3 其他优化方案主从同机房部署减少网络延迟若需跨机房使用专线或优化网络带宽。
读写分离优化将读请求路由到延迟低的从库或使用中间件如MyCat、Sharding-JDBC实现延迟检测和自动切换。
级联复制主库→从库1并行复制→从库2减轻主库复制压力提升同步效率。
四、
总结 本文从Binlog格式、复制流程、延迟解决三个核心维度详细讲解了MySQL主从复制的核心知识Binlog三种格式各有优劣生产环境优先选择Row格式保障数据一致性复制流程依赖三大线程协同异步执行特性是延迟的基础原因主从延迟的核心是从库单线程瓶颈通过并行复制尤其是逻辑时钟模式可有效解决配合基础优化可实现低延迟同步。
主从复制是MySQL高可用和读写分离的基础吃透原理、掌握优化技巧才能从容应对生产环境的各类问题。
我是予枫专注于MySQL、Java等后端技术分享如果你觉得本文对你有帮助欢迎点赞、收藏、关注后续会持续输出更多干货内容有任何问题评论区留言交流~