1. 主从复制工作原理
MySQL数据复制的基础是二进制日志文件(binary log file)。一旦MySQL数据库启用二进制日志后,该数据库作为主服务器(master),其所有操作都会以”事件”的形式记录在二进制日志中。从服务器(slave)通过I/O线程与主服务器保持通信,监控主服务器二进制日志文件的变化。当检测到变化时,从服务器会将变更复制到自己的中继日志(relay log)中,然后SQL线程会将这些”事件”应用到从服务器的数据库中,从而实现主从数据库的数据一致性。
MySQL实现主从复制的主要方案:
- 基于二进制日志的主从复制
- 基于GTID的主从复制
传统复制基于主库的二进制日志文件和位置标识进行同步。而基于GTID(全局事务标识符)的复制是事务性的,无需指定二进制日志文件和位置,大大简化了复制任务管理。
2. 基于二进制日志的主从复制
2.1 配置要求
- 主库必须开启二进制日志
- 主库和从库必须配置唯一的server_id
2.2 主库创建复制用户
提议创建专用的复制用户:
CREATE USER 'repl'@'%' IDENTIFIED BY 'secure_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
2.3 获取主库二进制日志位置
1.在主库执行以下命令锁定表并阻止写入:
FLUSH TABLES WITH READ LOCK;
2.获取当前二进制日志状态:
SHOW MASTER STATUS;
记录返回的File和Position值。
3.释放锁:
UNLOCK TABLES;
2.4 配置从库
确认从库已设置唯一server_id后,执行以下命令:
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master_host_name',
SOURCE_USER='replication_user_name',
SOURCE_PASSWORD='replication_password',
SOURCE_LOG_FILE='recorded_log_file_name',
SOURCE_LOG_POS=recorded_log_position;
对于多源复制,需指定通道名:
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master_host_name',
SOURCE_USER='replication_user_name',
SOURCE_PASSWORD='replication_password',
SOURCE_LOG_FILE='recorded_log_file_name',
SOURCE_LOG_POS=recorded_log_position
FOR CHANNEL 'master-1';
2.5 启动复制
START REPLICA;
2.6 检查复制状态
SHOW REPLICA STATUSG
当Replica_IO_Running和Replica_SQL_Running均为Yes时,表明主从复制已成功建立。
3. 基于GTID的主从复制
3.1 配置要求
- 主库开启二进制日志
- 主库和从库配置唯一server_id
- 启用GTID模式
3.2 主从库配置
在主库和从库的配置文件(如/etc/my.cnf或
/etc/mysql/mysql.conf.d/mysqld.cnf)中添加:
[mysqld]
# 基础配置
server_id = unique_id
log_bin = mysql-bin
# GTID配置
gtid_mode = ON
enforce_gtid_consistency = ON
重启MySQL服务:
systemctl restart mysqld
# 或使用其他适合您系统的重启命令
3.3 配置从库
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master_ip_address',
SOURCE_PORT=3306,
SOURCE_USER='repl',
SOURCE_PASSWORD='password',
SOURCE_AUTO_POSITION = 1;
多源复制配置:
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master_ip_address',
SOURCE_PORT=3306,
SOURCE_USER='repl',
SOURCE_PASSWORD='password',
SOURCE_AUTO_POSITION = 1
FOR CHANNEL 'master-1';
3.4 启动复制
START REPLICA;
4. 半同步复制
MySQL默认采用异步复制,主库提交事务后立即返回客户端,不等待从库确认。半同步复制模式下,主库会等待至少一个从库接收并写入relay log后才返回客户端,提高数据安全性但增加必定延迟。
4.1 安装插件(MySQL 8.0+)
半同步复制插件在MySQL 8.0中一般已内置,无需手动安装。如需验证:
主库上检查:
SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%semi%';
4.2 配置参数
主库配置:
[mysqld]
# 半同步复制配置
rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000
rpl_semi_sync_source_enabled = 1 # MySQL 8.0新参数
从库配置:
[mysqld]
rpl_semi_sync_replica_enabled = 1
4.3 运行时启用(可选)
# 主库上
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_source_enabled = 1;
# 从库上
SET GLOBAL rpl_semi_sync_replica_enabled = 1;
4.4 状态监控
# 主库半同步状态
SHOW STATUS LIKE 'Rpl_semi_sync_master_status';
SHOW STATUS LIKE 'Rpl_semi_sync_source_status'; # MySQL 8.0+
# 从库连接数
SHOW STATUS LIKE 'Rpl_semi_sync_master_clients';
# 事务统计
SHOW STATUS LIKE 'Rpl_semi_sync_master_yes_tx';
SHOW STATUS LIKE 'Rpl_semi_sync_master_no_tx';
5. 最佳实践和注意事项
5.1 版本兼容性
- 本文档命令适用于MySQL 8.0及以上版本
- 旧版本中使用SLAVE关键字,新版本推荐使用REPLICA
- 提议使用MySQL 8.0或更高版本以获得最佳性能和安全性
5.2 网络和安全
- 确保主从服务器间网络连通性
- 使用SSL加密复制连接(生产环境推荐)
- 定期监控复制延迟和状态
5.3 故障处理
- 监控Seconds_Behind_Source指标判断复制延迟
- 定期检查错误日志
- 设置适当的复制重试策略
5.4 性能优化
- 适当调整binlog_format(推荐ROW格式)
- 优化网络配置减少延迟
- 监控系统资源使用情况
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...