在现代Web应用中,数据库往往是性能瓶颈所在。MySQL主从复制(Master-Slave Replication)是一种常见的数据同步方案,它不仅能提高系统的读取性能,还能增强数据安全性并提供故障转移能力。本文将详细介绍如何从零开始搭建一个MySQL主从同步架构。
MySQL主从复制基于二进制日志(binlog)实现,其核心流程如下:
主库(Master)将所有数据更改操作记录到二进制日志中
从库(Slave)的I/O线程从主库请求二进制日志
主库的Binlog Dump线程将二进制日志发送给从库
从库的SQL线程重放(Replay)接收到的日志事件,实现数据同步
这种架构提供了几个关键优势:
读写分离:主库处理写操作,从库处理读操作
数据备份:从库可作为主库的热备份
负载均衡:多个从库分担读取压力
高可用性:主库故障时可快速切换到从库
至少两台服务器(或虚拟机/容器)
主库服务器:192.168.1.100
从库服务器:192.168.1.101
MySQL版本:建议5.7或8.0
操作系统:Linux
在两台服务器上安装MySQL:
bash
# 更新软件包列表 sudo apt update # 安装MySQL服务器 sudo apt install mysql-server -y # 安全配置(设置root密码等) sudo mysql_secure_installation
编辑主库的MySQL配置文件(通常位于/etc/mysql/mysql.conf.d/mysqld.cnf
):
ini
[mysqld] # 服务器ID,主从库必须不同 server-id = 1 # 启用二进制日志 log_bin = /var/log/mysql/mysql-bin.log # 需要同步的数据库(可选,不设置则同步所有库) binlog_do_db = mydb # 设置二进制日志格式(推荐ROW格式) binlog_format = ROW # 其他保持默认配置
登录MySQL,创建用于复制的用户:
sql
CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'repl_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101'; FLUSH PRIVILEGES;
bash
sudo systemctl restart mysql
然后锁定主库表以防止数据变化:
sql
FLUSH TABLES WITH READ LOCK;
获取主库当前二进制日志位置:
sql
SHOW MASTER STATUS;
记下输出中的File和Position值,例如:
text
+------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 107 | mydb | | +------------------+----------+--------------+------------------+
bash
mysqldump -u root -p --all-databases --master-data > master_dump.sql
sql
UNLOCK TABLES;
编辑从库的MySQL配置文件:
ini
[mysqld] server-id = 2 relay-log = /var/log/mysql/mysql-relay-bin.log log_bin = /var/log/mysql/mysql-bin.log read_only = 1
将主库导出的数据导入从库:
bash
mysql -u root -p < master_dump.sql
登录从库MySQL,配置主库信息:
sql
CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl', MASTER_PASSWORD='repl_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;
sql
START SLAVE;
sql
SHOW SLAVE STATUS\G
查看输出中的Slave_IO_Running
和Slave_SQL_Running
是否为Yes
,以及是否有错误信息。
sql
CREATE DATABASE IF NOT EXISTS mydb; USE mydb; CREATE TABLE test_table (id INT, name VARCHAR(50)); INSERT INTO test_table VALUES (1, 'Test Data');
sql
USE mydb; SELECT * FROM test_table;
应该能看到与主库相同的数据。
Slave_IO_Running为Connecting
检查网络连接
验证复制用户权限
确认主库防火墙设置
Slave_SQL_Running为No
查看Last_Error
字段
常见原因:主从数据不一致、SQL线程错误
复制延迟
监控Seconds_Behind_Master
值
优化主库写入性能
考虑增加从库硬件资源
定期检查复制状态:
sql
SHOW SLAVE STATUS\G
监控复制延迟:
sql
SHOW SLAVE STATUS\G -- 查看Seconds_Behind_Master
设置自动报警脚本,监控关键指标
MySQL主从复制是构建高可用数据库架构的基础。通过本文的步骤,您已经成功搭建了一个基本的MySQL主从同步环境。在实际生产环境中,您需要根据企业自身的需求来决定搭建环境的方式以及所需要的功能。包括企业系统版本、复杂的拓扑结构(如主-主复制、级联复制)、自动故障转移机制以及完善的监控方案等等。