本文共 2421 字,大约阅读时间需要 8 分钟。
MySQL 主从复制是数据库高可用性的重要手段,常用于读写分离架构中。以下将详细介绍 MySQL 主从复制的几种方式及其搭建方法。
MySQL 主从复制基于二进制日志(BinLog)机制。主库在执行增删改操作时,会将事务写入二进制日志文件。从库定期连接主库,下载二进制日志,并通过重放这些日志操作数据库,确保数据与主库一致。
以一主两从的架构为例,写请求统一交给主库处理,读请求则由从库处理。为了保证数据一致性,主库会将写入的数据同时复制到各个从库上。
主库接收写请求
当主库接收到增删改操作时,会将操作记录到二进制日志中。主库推送二进制日志
主库为每个从库创建一个二进制日志传输线程(BinLog Dump),将二进制日志发送到从库。从库接收并解析日志
从库上的 IO 线程接收主库发送的二进制日志,并将其写入本地的 RelayLog。从库执行重放操作
从库上的 SQL 线程解析 RelayLog,重执行主库的操作,确保数据一致性。创建复制账号
mysql> create user 'backup_user'@'192.168.31.%' identified by 'backup_123';mysql> grant replication slave on *.* to 'backup_user'@'192.168.31.%';mysql> flush privileges;
备份主库数据
在低峰期对主库进行全量备份:$ /usr/local/mysql/bin/mysqldump --single-transaction -uroot -proot --master-data=2 -A > backup.sql
复制备份文件
使用 scp 将备份文件传输到从库服务器。配置从库
从库执行以下命令:mysql> CHANGE MASTER TO MASTER_HOST='192.168.31.229', MASTER_USER='backup_user', MASTER_PASSWORD='backup_123', MASTER_LOG_FILE='mysql-bin.000015', MASTER_LOG_POS=1689;
启动主从复制
mysql> start slave;mysql> show slave status;
检查 Slave_IO_Running 和 Slave_SQL_Running 是否为 Yes。
验证数据一致性
在主库插入一条数据,检查从库是否能查询到该数据。异步复制可能导致数据丢失。主库提交事务前,二进制日志可能尚未传输到从库,导致主库宕机后数据丢失。
半同步复制确保主库事务提交前,二进制日志已传输到从库,避免数据丢失。适合搭建高可用架构。
安装半同步复制插件
在主库和从库上安装半同步复制插件:mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';mysql> set global rpl_semi_sync_master_enabled=on;mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';mysql> set global rpl_semi_sync_slave_enabled=on;
重启 IO 线程
mysql> stop slave io_thread;mysql> start slave io_thread;
验证半同步状态
检查主库状态:mysql> show global status like '%semi%';
GTID 复制通过记录全局事务 ID,确保从库能够准确还原主库的数据。其优点是配置简单,适合经常更换主从的情况。
启用 GTID 模式
主库配置:mysql> set global gtid_mode=on;mysql> set global enforce_gtid_consistency=on;mysql> set global log_bin=on;
从库配置
mysql> set global gtid_mode=on;mysql> set global enforce_gtid_consistency=on;mysql> set global log_slave_updates=1;
导入数据
使用 mysqldump 备份并复制数据。验证 GTID 状态
检查SHOW MASTER STATUS
,确认 executed_gtid_set
是否正确。并行复制通过增加从库的复制线程数量,提升数据同步速度,减少主从延迟。
设置并行复制线程
从库配置:mysql> set slave_parallel_workers=4;mysql> set slave_parallel_type=logical_clock;
强制读主库
使用中间件(如 MyCat)实现强制读写分离,确保新写入数据能立即读取。通过以上方法,可以根据实际需求选择最适合的主从复制方式,确保数据库高可用性和数据一致性。
转载地址:http://lmbfk.baihongyu.com/