如何搭建MySQL主从同步架构:实现数据库高可用与读写分离

前言:

在现代Web应用中,数据库往往是性能瓶颈所在。MySQL主从复制(Master-Slave Replication)是一种常见的数据同步方案,它不仅能提高系统的读取性能,还能增强数据安全性并提供故障转移能力。本文将详细介绍如何从零开始搭建一个MySQL主从同步架构。

一、主从复制原理简介

MySQL主从复制基于二进制日志(binlog)实现,其核心流程如下:

  1. 主库(Master)将所有数据更改操作记录到二进制日志中

  2. 从库(Slave)的I/O线程从主库请求二进制日志

  3. 主库的Binlog Dump线程将二进制日志发送给从库

  4. 从库的SQL线程重放(Replay)接收到的日志事件,实现数据同步

这种架构提供了几个关键优势:

  • 读写分离:主库处理写操作,从库处理读操作

  • 数据备份:从库可作为主库的热备份

  • 负载均衡:多个从库分担读取压力

  • 高可用性:主库故障时可快速切换到从库

二、环境准备

1. 服务器要求

  • 至少两台服务器(或虚拟机/容器)

    • 主库服务器:192.168.1.100

    • 从库服务器:192.168.1.101

  • MySQL版本:建议5.7或8.0

  • 操作系统:Linux

2. 安装MySQL

在两台服务器上安装MySQL:

bash

# 更新软件包列表
sudo apt update

# 安装MySQL服务器
sudo apt install mysql-server -y

# 安全配置(设置root密码等)
sudo mysql_secure_installation

三、主库(Master)配置

1. 修改MySQL配置文件

编辑主库的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

# 其他保持默认配置

2. 创建复制专用账户

登录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;

3. 重启MySQL并锁定表

bash

sudo systemctl restart mysql

然后锁定主库表以防止数据变化:

sql

FLUSH TABLES WITH READ LOCK;

4. 记录主库状态

获取主库当前二进制日志位置:

sql

SHOW MASTER STATUS;

记下输出中的File和Position值,例如:

text

+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      107 | mydb         |                  |
+------------------+----------+--------------+------------------+

5. 导出主库数据

bash

mysqldump -u root -p --all-databases --master-data > master_dump.sql

6. 解锁主库表

sql

UNLOCK TABLES;

四、从库(Slave)配置

1. 修改MySQL配置文件

编辑从库的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

2. 导入主库数据

将主库导出的数据导入从库:

bash

mysql -u root -p < master_dump.sql

3. 配置复制链路

登录从库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;

4. 启动复制进程

sql

START SLAVE;

5. 检查复制状态

sql

SHOW SLAVE STATUS\G

查看输出中的Slave_IO_RunningSlave_SQL_Running是否为Yes,以及是否有错误信息。

五、验证主从同步

1. 在主库创建测试数据

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');

2. 在从库检查数据

sql

USE mydb;
SELECT * FROM test_table;

应该能看到与主库相同的数据。

六、常见问题排查

  1. Slave_IO_Running为Connecting

    • 检查网络连接

    • 验证复制用户权限

    • 确认主库防火墙设置

  2. Slave_SQL_Running为No

    • 查看Last_Error字段

    • 常见原因:主从数据不一致、SQL线程错误

  3. 复制延迟

    • 监控Seconds_Behind_Master

    • 优化主库写入性能

    • 考虑增加从库硬件资源

七、监控与维护

  1. 定期检查复制状态:

    sql

    SHOW SLAVE STATUS\G
  2. 监控复制延迟:

    sql

    SHOW SLAVE STATUS\G
    -- 查看Seconds_Behind_Master
  3. 设置自动报警脚本,监控关键指标

结语

MySQL主从复制是构建高可用数据库架构的基础。通过本文的步骤,您已经成功搭建了一个基本的MySQL主从同步环境。在实际生产环境中,您需要根据企业自身的需求来决定搭建环境的方式以及所需要的功能。包括企业系统版本、复杂的拓扑结构(如主-主复制、级联复制)、自动故障转移机制以及完善的监控方案等等。

你可能感兴趣的:(adb)