MySQL主从复制技术详解

阿里云教程2个月前发布
16 3 0

1. 主从复制工作原理

MySQL数据复制的基础是二进制日志文件(binary log file)。一旦MySQL数据库启用二进制日志后,该数据库作为主服务器(master),其所有操作都会以”事件”的形式记录在二进制日志中。从服务器(slave)通过I/O线程与主服务器保持通信,监控主服务器二进制日志文件的变化。当检测到变化时,从服务器会将变更复制到自己的中继日志(relay log)中,然后SQL线程会将这些”事件”应用到从服务器的数据库中,从而实现主从数据库的数据一致性。

MySQL实现主从复制的主要方案:

  • 基于二进制日志的主从复制
  • 基于GTID的主从复制

传统复制基于主库的二进制日志文件和位置标识进行同步。而基于GTID(全局事务标识符)的复制是事务性的,无需指定二进制日志文件和位置,大大简化了复制任务管理。

2. 基于二进制日志的主从复制

2.1 配置要求

  1. 主库必须开启二进制日志
  2. 主库和从库必须配置唯一的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 配置要求

  1. 主库开启二进制日志
  2. 主库和从库配置唯一server_id
  3. 启用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格式)
  • 优化网络配置减少延迟
  • 监控系统资源使用情况
© 版权声明

相关文章

3 条评论

none
暂无评论...