MySQL Replication与Mirroring有何区别?二者分别如何实现?
MySQL Replication vs Mirroring:核心区别与实现指南
一、核心区别
- 数据同步机制:
- Replication:默认异步,主库完成事务提交后异步发送二进制日志到从库;可选半异步模式,但仅保证日志传输,不保证从库执行完成,存在极短数据不一致窗口。
- Mirroring:严格同步(或准同步),主库事务提交必须等待镜像节点确认数据已写入(或持久化),确保主备数据实时一致,无数据丢失风险。
- 架构与角色:
- Replication:支持一主多从架构,从库可承担读请求、数据分析、备份等任务,角色灵活。
- Mirroring:通常为双节点主备架构,镜像节点仅用于故障切换,一般不对外提供读服务(或只读),角色单一。
- 性能与开销:
- Replication:异步模式下主库性能开销极低,半异步仅增加少量网络等待时间。
- Mirroring:同步机制会增加主库事务提交延迟,跨机房场景下性能损耗明显。
- 故障切换特性:
- Replication:切换需手动或借助MHA、Orchestrator等工具,主库故障时未同步日志可能导致数据丢失。
- Mirroring:切换可自动触发(如InnoDB Cluster),切换后数据完全一致,RTO(恢复时间目标)更短。
二、实现方法
1. MySQL Replication(异步/半异步)
主库配置
- 修改
my.cnf(或my.ini):[mysqld] server-id = 1 log-bin = mysql-bin binlog_format = ROW # 推荐行格式,保证数据一致性 # 可选:仅同步指定数据库 # binlog_do_db = your_database - 重启MySQL服务,创建同步专用账号:
CREATE USER 'repl_user'@'slave_ip' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'slave_ip'; FLUSH PRIVILEGES; - 锁表并备份主库数据:
用FLUSH TABLES WITH READ LOCK;mysqldump导出数据:
解锁表:mysqldump -u root -p --all-databases --master-data=2 > master_backup.sqlUNLOCK TABLES; - 查看主库binlog状态,记录
File和Position:SHOW MASTER STATUS;
从库配置
- 修改
my.cnf:[mysqld] server-id = 2 # 必须与主库唯一 relay-log = mysql-relay-bin read_only = 1 # 普通用户只读,超级用户仍可写 - 重启MySQL,导入主库备份:
mysql -u root -p < master_backup.sql - 配置主从同步连接:
CHANGE MASTER TO MASTER_HOST='master_ip', MASTER_USER='repl_user', MASTER_PASSWORD='your_password', MASTER_LOG_FILE='mysql-bin.xxxxxx', # 主库SHOW MASTER STATUS返回的File值 MASTER_LOG_POS=xxxx; # 主库SHOW MASTER STATUS返回的Position值 - 启动同步并验证:
确保START SLAVE; SHOW SLAVE STATUS\GSlave_IO_Running和Slave_SQL_Running均为Yes。
2. MySQL Mirroring(准同步/同步镜像)
MySQL原生无官方"Mirroring"术语,通常通过半同步复制(准镜像)或Group Replication单主模式(严格镜像)实现:
方案1:半同步复制(准镜像)
- 主库配置:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; SET GLOBAL rpl_semi_sync_master_enabled = ON; SET GLOBAL rpl_semi_sync_master_timeout = 1000; # 超时后降级为异步 - 从库配置:
此方案保证主库事务提交前,从库已接收并持久化binlog,但不保证从库已执行事务,属于准镜像。INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; SET GLOBAL rpl_semi_sync_slave_enabled = ON; STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;
方案2:Group Replication单主模式(严格镜像)
- 所有节点修改
my.cnf:[mysqld] server-id = 1 # 每个节点唯一 gtid_mode = ON enforce_gtid_consistency = ON binlog_format = ROW log-slave-updates = ON plugin_load_add = 'group_replication.so' group_replication_group_name = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' # 自行生成UUID group_replication_start_on_boot = OFF group_replication_local_address = 'node_ip:33061' # 节点间通信端口 group_replication_group_seeds = 'node1_ip:33061,node2_ip:33061' group_replication_single_primary_mode = ON # 单主模式 group_replication_enforce_update_everywhere_checks = OFF - 初始化主节点:
SET SQL_LOG_BIN=0; CREATE USER 'repl_user'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'; FLUSH PRIVILEGES; SET SQL_LOG_BIN=1; CHANGE MASTER TO MASTER_USER='repl_user', MASTER_PASSWORD='your_password' FOR CHANNEL 'group_replication_recovery'; SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF; - 加入镜像节点:
此时主节点可写,镜像节点只读,数据实时同步,主节点故障后自动切换镜像节点为主。SET SQL_LOG_BIN=0; CREATE USER 'repl_user'@'%' IDENTIFIED BY 'your_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'; FLUSH PRIVILEGES; SET SQL_LOG_BIN=1; CHANGE MASTER TO MASTER_USER='repl_user', MASTER_PASSWORD='your_password' FOR CHANNEL 'group_replication_recovery'; START GROUP_REPLICATION;
内容的提问来源于stack exchange,提问作者Mitchell CSharp
相关产品推荐
相关产品推荐

