深渊求生免安装绿色版
4.64G · 2025-11-02
作为一名开发者或运维工程师,你是否曾遇到过这些问题:
解决这些问题的核心钥匙之一,就是数据库同步技术。它不仅是高可用、负载均衡的基石,更是构建现代分布式系统的必备技能。今天,我们就来深入浅出地盘点一下那些常见的数据库同步方式,帮你理清思路,做出最适合自己业务的技术选型。
核心目标:我们为什么要做数据同步?
在进行技术选型前,先要明确目标。数据同步主要为了满足以下一个或多个需求:
根据数据一致性的保证程度,我们可以将复制方式分为三类,这直接对应着CAP理论中的权衡。
原理深度解析: 异步复制的核心思想是"先响应,后同步"。主库将事务的变更写入本地二进制日志(Binary Log)后,不等待任何从库的确认,立即向客户端返回成功。数据的复制由一个独立的、异步的线程(如MySQL的Binlog Dump Thread)来完成。
binlog发送给从库前宕机,即使客户端已收到成功响应,该数据也会永久丢失。sequenceDiagram
participant C as Client
participant M as Master DB
participant S as Slave DB
Note over M: 1. 事务开始
C->>M: COMMIT (写操作)
Note over M: 2. 写入Redo Log & Binlog
M->>C: 操作成功! (立即返回)
Note over M: 3. 异步过程开始
M->>S: Binlog Dump Thread: 发送Binlog事件
S->>S: I/O Thread: 写入Relay Log
S->>S: SQL Thread: 重放SQL,更新数据
redo log(重做日志,用于崩溃恢复)、修改内存中的数据页,并在提交时,将事务内容写入binlog。binlog是MySQL服务器层实现的逻辑日志,是复制的基石。Binlog Dump Thread。该线程会从binlog文件中读取事件,并通过网络发送给从库的I/O Thread。这个过程是异步的,主库的事务线程不会阻塞等待。I/O Thread接收到的binlog事件后,会将其写入本地的relay log(中继日志)。SQL Thread再从中继日志中读取事件,并重放(Replay)这些SQL语句,从而使得从库的数据与主库保持一致。1. 主库配置(my.cnf):
[mysqld]
# 启用二进制日志(必须)
log-bin=mysql-bin
# 设置服务器唯一ID(必须)
server-id=1
# 选择二进制日志格式:ROW模式推荐用于生产环境,数据更安全
binlog-format=ROW
# 为InnoDB引擎设置事务隔离级别(推荐)
transaction-isolation=READ-COMMITTED
2. 从库配置(my.cnf):
[mysqld]
# 设置服务器唯一ID,不能与主库相同
server-id=2
# 启用中继日志
relay-log=mysql-relay-bin
# 允许从库将其重放的事件也记录到自己的二进制日志中(便于级联复制)
log-slave-updates=ON
# 设置只读模式,防止从库被意外写入
read-only=ON
3. 配置复制流程(SQL命令):
-- 在主库上创建复制专用用户
CREATE USER 'repl'@'%' IDENTIFIED BY 'SecurePassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 查看主库状态,记录File和Position(用于后续从库配置)
SHOW MASTER STATUS;
-- 输出示例:
-- +------------------+----------+--------------+------------------+
-- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
-- +------------------+----------+--------------+------------------+
-- | mysql-bin.000003 | 785 | | |
-- +------------------+----------+--------------+------------------+
-- 在从库上配置复制源
CHANGE MASTER TO
MASTER_HOST='主库IP地址',
MASTER_USER='repl',
MASTER_PASSWORD='SecurePassword123!',
MASTER_LOG_FILE='mysql-bin.000003', -- 上面SHOW MASTER STATUS查到的File
MASTER_LOG_POS=785; -- 上面SHOW MASTER STATUS查到的Position
-- 启动复制
START SLAVE;
-- 检查复制状态
SHOW SLAVE STATUSG
-- 关键指标:Slave_IO_Running: Yes, Slave_SQL_Running: Yes, Seconds_Behind_Master: 0
原理深度解析: 半同步复制在异步复制的基础上增加了一个确认(Acknowledgment)机制。主库在提交事务时,需要等待至少一个从库确认已收到该事务的binlog事件(并写入其relay log)后,才向客户端返回成功。
sequenceDiagram
participant C as Client
participant M as Master DB
participant S as Slave DB
C->>M: COMMIT (写操作)
Note over M: 1. 准备提交,写入Binlog
M->>S: 发送Binlog事件
Note over M: 2. 等待ACK(阻塞)
S->>S: I/O Thread: 写入Relay Log
S->>M: 发送ACK确认
Note over M: 3. 收到ACK,完成提交
M->>C: 操作成功!
binlog。此时,事务的提交线程会被阻塞,等待从库的确认。I/O Thread在收到binlog事件并成功写入relay log后,向主库发送一个ACK(确认)信号。AFTER_SYNC模式下,在等待前就已提交,但此时才返回给客户端),并向客户端返回成功。rpl_semi_sync_master_timeout,默认10秒)。超时后,主库会自动降级为异步复制模式。当从库恢复后,又会自动升级回半同步。1. 安装半同步插件(主从库都需要):
-- 检查插件是否已安装
SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%semi%';
-- 如果未安装,安装插件(需要文件系统权限)
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
2. 配置半同步复制(my.cnf):
# 主库配置
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_slave_enabled=ON # 主库也启用slave插件,便于角色切换
rpl_semi_sync_master_timeout=1000 # 超时时间,毫秒(默认10秒)
# 从库配置
[mysqld]
plugin-load="rpl_semi_sync_slave=semisync_slave.so;rpl_semi_sync_master=semisync_master.so"
rpl_semi_sync_slave_enabled=ON
rpl_semi_sync_master_enabled=ON # 从库也启用master插件,便于角色切换
3. 动态配置(无需重启):
-- 在主库上
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 1000; -- 1秒超时
-- 在从库上
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
-- 如果复制已运行,需要重启IO线程以应用半同步
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
4. 监控半同步状态:
-- 查看主库半同步状态
SHOW VARIABLES LIKE 'rpl_semi_sync%';
SHOW STATUS LIKE 'Rpl_semi_sync%';
-- 关键状态指标:
-- Rpl_semi_sync_master_status: ON 表示半同步运行中
-- Rpl_semi_sync_master_yes_tx: 成功通过半同步复制的事务数
-- Rpl_semi_sync_master_no_tx: 超时后转为异步复制的事务数
原理深度解析: 同步复制要求最为严格。事务必须在主库和所有配置的从库上都成功提交后,主库才能向客户端返回成功。这确保了数据的强一致性,任何一个节点的数据都与其他节点完全同步。
sequenceDiagram
participant C as Client
participant P as Primary Node
participant S1 as Secondary Node
participant S2 as Secondary Node
C->>P: COMMIT (写操作)
P->>P: 执行事务,准备Certification
P->>S1: 广播事务进行认证
P->>S2: 广播事务进行认证
S1->>P: 投票同意
S2->>P: 投票同意
Note over P: 收到多数派同意
P->>P: 提交事务
P->>C: 操作成功!
P->>S1: 应用事务
P->>S2: 应用事务
1. MGR 前置配置(所有节点):
[mysqld]
# 基本复制配置
server_id=1 # 每个节点唯一
gtid_mode=ON
enforce_gtid_consistency=ON
# MGR 特定配置
plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 集群唯一UUID
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "节点1IP:33061" # 每个节点不同
loose-group_replication_group_seeds= "节点1IP:33061,节点2IP:33061,节点3IP:33061"
loose-group_replication_bootstrap_group=off
# 单主模式配置(推荐)
loose-group_replication_single_primary_mode=ON
loose-group_replication_enforce_update_everywhere_checks=OFF
2. 初始化 MGR 集群:
-- 在第一个节点上执行(引导集群)
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
-- 检查节点状态
SELECT * FROM performance_schema.replication_group_members;
3. 添加其他节点:
-- 在第二个、第三个节点上执行
START GROUP_REPLICATION;
-- 验证集群状态(所有节点都应显示ONLINE)
SELECT MEMBER_HOST, MEMBER_PORT, MEMBER_STATE
FROM performance_schema.replication_group_members;
4. MGR 监控和管理:
-- 集群健康状态监控
SELECT * FROM performance_schema.replication_group_member_stats;
-- 事务流量监控
SELECT
COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE as pending_transactions,
COUNT_TRANSACTIONS_REMOTE_APPLIED as applied_transactions,
COUNT_TRANSACTIONS_LOCAL_PROPOSED as local_proposed,
COUNT_TRANSACTIONS_LOCAL_ROLLBACK as local_rollbacks
FROM performance_schema.replication_group_member_stats;
-- 冲突检测统计
SELECT
COUNT_TRANSACTIONS_CHECKED as transactions_checked,
COUNT_CONFLICTS_DETECTED as conflicts_detected,
COUNT_TRANSACTIONS_ROWS_VALIDATING as rows_validating
FROM performance_schema.replication_group_member_stats;
-- 手动故障转移(主节点切换)
SELECT group_replication_set_as_primary('node-uuid-here');
-- 集群维护命令
-- 暂停节点流量(维护模式)
SET GLOBAL group_replication_group_seeds = ''; -- 临时移除节点
-- 恢复节点
SET GLOBAL group_replication_group_seeds = '192.168.1.101:33061,192.168.1.102:33061,192.168.1.103:33061';
通过本文的深入探讨,可以看到数据库同步已成为支撑现代分布式系统高可用、高性能架构的核心基石。让我们回顾一下关键要点:
异步复制作为最基础的同步方式,以其极致的性能表现成为非核心业务的首选。它像是一个高效的邮递系统,保证快速投递但不保证对方一定收到,适用于日志记录、行为分析等可容忍数据丢失的场景。
半同步复制在性能和数据安全之间找到了黄金平衡点。通过引入ACK确认机制,它确保了数据至少存在于两个节点,成为绝大多数核心业务系统的标准配置。这就像发送带有"已读回执"的重要邮件,既保证了可靠性,又不会过度影响效率。
同步复制(Group Replication) 代表了数据库同步技术的最高水准,实现了金融级的强一致性。基于分布式共识算法,它确保了数据的零丢失和服务的自动故障转移,虽然复杂度最高,但对于关键业务系统来说是不可或缺的保障。
2025-11-02
蔡司 2 亿长焦 + 天玑 9400:vivo X200 Pro 手机 5999 → 4050 元上市一年新低
2025-11-02
LPL 最后的希望,《英雄联盟》S15 半决赛 TES 对阵 T1 今天下午 3 点开战