位置: 文档库 > 数据库 > Linux下MySQL主从配置

Linux下MySQL主从配置

埋头苦干 上传于 2020-08-27 16:40

《Linux下MySQL主从配置》

一、引言

在分布式系统与高可用架构中,MySQL主从复制(Master-Slave Replication)是核心组件之一。通过主库(Master)记录所有数据变更(如INSERT、UPDATE、DELETE),并将变更以二进制日志(Binary Log)形式同步至从库(Slave),实现数据冗余、读写分离和故障转移。Linux作为MySQL最常用的操作系统环境,其主从配置的稳定性直接影响数据库集群的可靠性。本文将详细阐述Linux环境下MySQL主从复制的完整流程,涵盖环境准备、主库配置、从库配置、验证测试及常见问题处理。

二、环境准备

1. 硬件与软件要求

主从服务器需满足以下条件:

- 操作系统:CentOS 7/8或Ubuntu 20.04+(推荐使用LTS版本)

- MySQL版本:5.7或8.0(需主从版本一致或从库版本高于主库)

- 网络连通性:主从服务器间需开放3306端口(默认MySQL端口)

- 磁盘空间:主库需预留足够空间存储二进制日志(binlog)

2. 安装MySQL

以CentOS 8为例,使用YUM仓库安装:


# 添加MySQL官方YUM仓库
sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el8-3.noarch.rpm
# 安装MySQL服务器
sudo yum install mysql-community-server -y
# 启动服务并设置开机自启
sudo systemctl enable --now mysqld

安装完成后,通过mysql_secure_installation脚本设置root密码并移除匿名用户。

三、主库配置

1. 修改主库配置文件

编辑主库的/etc/my.cnf(或/etc/mysql/mysql.conf.d/mysqld.cnf),添加以下配置:


[mysqld]
server-id = 1               # 主库ID,必须唯一
log_bin = mysql-bin         # 启用二进制日志
binlog_format = ROW         # 推荐使用ROW格式(支持所有SQL类型)
binlog_do_db = test_db      # 可选:指定要复制的数据库(不指定则复制所有)
expire_logs_days = 7        # 二进制日志保留天数
sync_binlog = 1             # 每次事务提交后同步到磁盘

重启主库使配置生效:


sudo systemctl restart mysqld

2. 创建复制专用用户

登录MySQL后执行:


CREATE USER 'repl'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

此用户用于从库连接主库并获取二进制日志。

3. 获取主库二进制日志位置

执行以下命令查看当前二进制日志文件名及位置:


SHOW MASTER STATUS;

输出示例:


+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      154 | test_db      |                  |
+------------------+----------+--------------+------------------+

记录FilePosition值,后续从库配置需使用。

四、从库配置

1. 修改从库配置文件

编辑从库的/etc/my.cnf,添加以下配置:


[mysqld]
server-id = 2               # 从库ID,必须唯一且不同于主库
relay_log = mysql-relay-bin # 中继日志文件名
log_slave_updates = ON      # 允许从库作为其他从库的主库
read_only = ON              # 从库设为只读(可选,防止误写)

重启从库服务:


sudo systemctl restart mysqld

2. 配置主从复制关系

登录从库MySQL后执行:


CHANGE MASTER TO
  MASTER_HOST='主库IP地址',
  MASTER_USER='repl',
  MASTER_PASSWORD='StrongPassword123!',
  MASTER_LOG_FILE='mysql-bin.000003',  # 替换为主库SHOW MASTER STATUS输出的File值
  MASTER_LOG_POS=154;                  # 替换为主库SHOW MASTER STATUS输出的Position值

启动复制进程:


START SLAVE;

3. 验证复制状态

执行以下命令查看从库状态:


SHOW SLAVE STATUS\G

关键字段说明:

- Slave_IO_Running: Yes:I/O线程(从主库读取日志)是否运行

- Slave_SQL_Running: Yes:SQL线程(执行日志中的SQL)是否运行

- Seconds_Behind_Master: 0:从库落后主库的秒数(0表示完全同步)

五、主从复制原理深度解析

1. 二进制日志(Binlog)

主库将所有数据变更记录到二进制日志中,支持三种格式:

- STATEMENT:记录SQL语句(可能因函数差异导致主从不一致)

- ROW:记录行变更(推荐,兼容性最好)

- MIXED:自动选择STATEMENT或ROW格式

2. 复制线程模型

从库启动两个线程:

- I/O线程:连接主库并请求二进制日志,写入中继日志(Relay Log)

- SQL线程:读取中继日志并重放其中的SQL

3. 半同步复制(可选)

默认异步复制可能丢失数据。启用半同步复制可确保至少一个从库收到日志后才返回成功:

主库安装插件:


INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;

从库安装插件:


INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;

六、常见问题与解决方案

1. 复制中断(Error Code: 1236)

原因:主库二进制日志被清除或从库位置无效。

解决方案:

- 在主库执行SHOW BINARY LOGS;确认日志是否存在

- 从库重新配置CHANGE MASTER TO并指定新的日志位置

2. 主键冲突(Error Code: 1062)

原因:从库手动插入数据导致与主库冲突。

解决方案:

- 确保从库为只读模式(read_only=ON

- 跳过特定错误(不推荐长期使用):


STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;

3. 性能瓶颈

现象:从库延迟(Seconds_Behind_Master持续增大)。

优化方案:

- 启用并行复制(MySQL 5.7+):


STOP SLAVE;
SET GLOBAL slave_parallel_workers = 4;  # 根据CPU核心数调整
START SLAVE;

- 优化从库硬件(SSD、增加内存)

- 避免在主库执行大事务

七、高级配置场景

1. 多源复制(MySQL 5.7+)

从库可同时从多个主库复制数据:


CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='主库1',
  SOURCE_USER='repl',
  SOURCE_PASSWORD='pass',
  SOURCE_LOG_FILE='binlog.000001',
  SOURCE_LOG_POS=120
FOR CHANNEL 'channel1';

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='主库2',
  SOURCE_USER='repl',
  SOURCE_PASSWORD='pass',
  SOURCE_LOG_FILE='binlog.000002',
  SOURCE_LOG_POS=200
FOR CHANNEL 'channel2';

START SLAVE FOR CHANNEL 'channel1';
START SLAVE FOR CHANNEL 'channel2';

2. GTID复制(全局事务标识符)

使用GTID替代文件名+位置,简化故障恢复:

主库配置:


[mysqld]
gtid_mode = ON
enforce_gtid_consistency = ON

从库配置:


CHANGE MASTER TO
  MASTER_HOST='主库IP',
  MASTER_USER='repl',
  MASTER_PASSWORD='pass',
  MASTER_AUTO_POSITION=1;

八、监控与维护

1. 监控指标

- 复制延迟:SHOW SLAVE STATUS中的Seconds_Behind_Master

- 二进制日志增长速率:SHOW BINARY LOGS;

- 错误日志:/var/log/mysqld.log

2. 定期维护任务

- 每周清理过期二进制日志:


PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

- 每月检查主从数据一致性(使用pt-table-checksum工具)

九、总结

Linux下MySQL主从配置的核心步骤包括:环境准备、主库配置(启用binlog、创建复制用户)、从库配置(设置server-id、启动复制)、验证与监控。通过合理配置二进制日志格式、复制线程数和半同步机制,可显著提升复制的可靠性与性能。实际应用中需结合监控工具(如Prometheus+Grafana)实现自动化告警,确保主从集群长期稳定运行。

关键词:Linux、MySQL主从复制、二进制日志、GTID、半同步复制、复制延迟、数据一致性

简介:本文详细介绍了Linux环境下MySQL主从复制的完整流程,包括环境准备、主从库配置、复制原理、常见问题处理及高级场景(如多源复制、GTID复制)。通过配置示例和监控方案,帮助DBA快速搭建高可用的MySQL主从架构。

《Linux下MySQL主从配置.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档