<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>复制 on PlumePHP</title><link>https://plumephp.com/tags/%E5%A4%8D%E5%88%B6/</link><description>Recent content in 复制 on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Fri, 14 Aug 2026 16:09:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/tags/%E5%A4%8D%E5%88%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>09. 主从复制与数据同步</title><link>https://plumephp.com/database-replication/</link><pubDate>Fri, 14 Aug 2026 16:09:00 +0800</pubDate><guid>https://plumephp.com/database-replication/</guid><description>&lt;h2 id="1-复制架构"&gt;1. 复制架构&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; ┌──────────────┐
 │ Client │
 └──────┬───────┘
 │
 ┌─────▼─────┐
 │ Master │ ← 处理写请求，记录 binlog
 │ (主库) │
 └─────┬─────┘
 │ binlog dump
 ┌─────────────┼─────────────┐
 ↓ ↓ ↓
 ┌────────┐ ┌────────┐ ┌────────┐
 │ Slave 1│ │ Slave 2│ │ Slave 3│ ← 读请求
 │(IO线程) │ │(IO线程) │ │(IO线程) │
 │(SQL线程)│ │(SQL线程)│ │(SQL线程)│
 └────────┘ └────────┘ └────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="2-复制模式"&gt;2. 复制模式&lt;/h2&gt;
&lt;h3 id="21-异步复制asynchronous"&gt;2.1 异步复制（Asynchronous）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Client → Master (写入成功) → 立即返回
 ↓ 后台异步
 Slave（可能有延迟）

特点：快，不阻塞客户端，但 Master 宕机时可能丢失未同步数据
MySQL 默认模式
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="22-半同步复制semi-synchronous"&gt;2.2 半同步复制（Semi-Synchronous）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Client → Master (prepare) → 等待至少 1 个 Slave ACK
 ↓
 Slave (收到 relay log)
 → ACK → Master commit → 返回客户端

特点：返回慢一些，但保证至少一个 Slave 已接收数据，降低丢失风险
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="23-组复制group-replication"&gt;2.3 组复制（Group Replication）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;多主或单主模式，多数派确认后提交（Paxos 协议）。
自动故障检测和切换，数据强一致。
MySQL 5.7+ 内置。
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;模式&lt;/th&gt;
					&lt;th&gt;一致性&lt;/th&gt;
					&lt;th&gt;性能&lt;/th&gt;
					&lt;th&gt;故障场景数据丢失&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;异步&lt;/td&gt;
					&lt;td&gt;最终一致&lt;/td&gt;
					&lt;td&gt;最高&lt;/td&gt;
					&lt;td&gt;可能丢失所有未同步&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;半同步&lt;/td&gt;
					&lt;td&gt;至少一个副本&lt;/td&gt;
					&lt;td&gt;中&lt;/td&gt;
					&lt;td&gt;最多丢失一个事务&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;组复制&lt;/td&gt;
					&lt;td&gt;强一致&lt;/td&gt;
					&lt;td&gt;较低&lt;/td&gt;
					&lt;td&gt;不丢失（多数派确认）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="3-binlog"&gt;3. Binlog&lt;/h2&gt;
&lt;h3 id="31-格式"&gt;3.1 格式&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;格式&lt;/th&gt;
					&lt;th&gt;内容&lt;/th&gt;
					&lt;th&gt;优点&lt;/th&gt;
					&lt;th&gt;缺点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;STATEMENT&lt;/td&gt;
					&lt;td&gt;原始 SQL 语句&lt;/td&gt;
					&lt;td&gt;体积小&lt;/td&gt;
					&lt;td&gt;非确定性函数（UUID/ NOW()）问题&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;ROW&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;行变更前后镜像&lt;/td&gt;
					&lt;td&gt;精确、安全&lt;/td&gt;
					&lt;td&gt;体积大（UPDATE 全表时膨胀）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MIXED&lt;/td&gt;
					&lt;td&gt;混合策略&lt;/td&gt;
					&lt;td&gt;平衡&lt;/td&gt;
					&lt;td&gt;复杂&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 推荐配置（ROW 格式）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;binlog_format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ROW&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;binlog_row_image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;FULL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- FULL / MINIMAL / NOBLOB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- ROW 格式示例
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- UPDATE users SET status = &amp;#39;active&amp;#39; WHERE id = 1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- binlog 记录：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- before_image: id=1, status=&amp;#39;inactive&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- after_image: id=1, status=&amp;#39;active&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="32-gtid全局事务标识"&gt;3.2 GTID（全局事务标识）&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;GTID = Master_UUID:Transaction_Sequence

示例：
 a1b2c3d4-e5f6-7890-abcd-ef1234567890:1-100
 
优势：
 - 自动定位复制位点，避免 file:position 管理
 - 故障切换更简单（CHANGE MASTER TO ... AUTO_POSITION=1）
 - 避免跳过事务导致的脑裂
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="4-复制延迟"&gt;4. 复制延迟&lt;/h2&gt;
&lt;h3 id="41-延迟原因"&gt;4.1 延迟原因&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;原因&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;单线程 SQL 线程&lt;/td&gt;
					&lt;td&gt;经典 MySQL 只有 1 个 SQL 线程重放&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;大事务&lt;/td&gt;
					&lt;td&gt;一个事务修改大量行，Slave 重放慢&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Slave 性能差&lt;/td&gt;
					&lt;td&gt;Slave 硬件弱于 Master&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;锁竞争&lt;/td&gt;
					&lt;td&gt;Slave 上也有读请求，与 SQL 线程竞争&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="42-并行复制"&gt;4.2 并行复制&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- MySQL 5.7+ 并行复制配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slave_parallel_type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;LOGICAL_CLOCK&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;GLOBAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slave_parallel_workers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- SQL 线程数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- LOGICAL_CLOCK：基于组提交（同一时刻提交的事务可并行）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- DATABASE：基于库级别并行（不同库的事务并行）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="43-监控延迟"&gt;4.3 监控延迟&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 查看延迟
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SLAVE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;STATUS&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="k"&gt;G&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Seconds_Behind_Master: 0 ← 延迟秒数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- 更精确的方法（pt-heartbeat）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- Master 每秒写 heartbeat 表，Slave 计算差值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="延伸阅读"&gt;延伸阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://plumephp.com/database-read-write-split/"&gt;读写分离与分库分表&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plumephp.com/database-mysql-innodb/"&gt;MySQL InnoDB 存储引擎&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>