为什么要主从复制与读写分离

随着现代信息科技的飞速发展,导致现在的数据库数据量越来越大,在高并发读写的情况下,单机数据库很难满足需求。容易出现难以扩容、读写压力大、单机QPS过大等情况。所以我们需要使用集群数据库,进行动态扩容,以满足需求。

什么是主从复制

在任意集群模式下都涉及两个内容,一个是master另一个是slave,尤其是数据库这种管理与储存数据库的软件,都需要有主数据和从数据,MySQL 主从复制(Master-Slave Replication)是一种数据复制技术,用于在多个数据库服务器之间的数据同步。在主从复制架构中,一个服务器被设置为主服务器(Master),充当数据源,其他服务器被设置为从服务器(Slave),用来复制主服务器的数据。

具体的主从复制是什么、原理、和发展史可以网上搜索一下,这里不详细介绍

什么是读写分离

读写分离的实现是基于主从复制架构:一主多从,只写主库,主库会自动将数据同步到从库。读和写的操作在不同的数据库中进行,减少单数据库的压力。

读写分离是高并发场景下MySQL的一种优化方案,依靠主从复制使得MySQL实现了数据复制为多份,增强了抵抗 高并发读请求的能力,提升了MySQL查询性能同时,也提升了数据的安全性。当某一个MySQL节点,无论是主库还是从库故障时,还有其他的节点中存储着全量数据,保证数据不会丢失。

如何部署主从复制

部署主从复制需要多台mysql服务器(至少两台做一主一从)这里我们用三台msyql服务器做一主多从的模式。

安装并配置mysql

在上一篇文章中有详细的描述怎么安装mysql,这里不在赘述,你可以参照我的文章或者使用包管理器

Linux安装mysql使用压缩包方式安装前言:这篇文章是以ArchLinux使用压缩包的方式进行安装配置MySQL,并且安装的是5.7的版本,其他版本可以使用包管理器来安装,比较方便快捷,只有MySQL5.7安装的时候比较麻烦,而且会出现各种各样的情况,所以本文将安装MySQL5.7

安装完成以后请一定检查你的mysql是否启动,是否能正常使用

image-20250331172458402
image-20250331172458402
image-20250331172552075
image-20250331172552075

安装完成后请配置mysql开启远程登录并设置密码

Bash
sudo mysql_secure_installation

按提示操作:

  • 启用密码验证策略(可选,推荐输入 Y)。
  • 设置 root 密码(输入你的新密码)。
  • 删除匿名用户(输入 Y)。
  • 禁止 root 远程登录(输入 N)。
  • 删除测试数据库(输入 Y)。
  • 重新加载权限表(输入 Y)。
image-20250331173305036
image-20250331173305036

每一节点都需要安装并且配置

查看主节点ip

使用net-tools或者直接使用ip a命令就可以看见ip地址了,我这里是虚拟机所以内网ip就行了,如果是服务器,请使用自己的外网ip

image-20250331175923262
image-20250331175923262

配置主节点

1、修改 MySQL 配置

主服务器上,修改 /etc/mysql/mysql.conf.d/mysqld.cnf:

Bash
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

找到 [mysqld] 段,添加或修改以下内容:

INI
[mysqld]bind-address = 0.0.0.0server-id=1log_bin=mysql-binbinlog_format=rowexpire_logs_days=7  # 设置 binlog 日志保留 7 天

保存并退出

2、重启 MySQL

Bash
sudo systemctl restart mysql

重启后看一下主节点监听的3306端口是不是外网

Bash
sudo netstat -tulnp | grep 3306
image-20250331180503187
image-20250331180503187

3、 创建复制用户

执行以下 SQL:

SQL
CREATE USER 'replicator'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;

请替换 'yourpassword' 为你的实际密码,请设置复杂密码并将这个密码保存或记住

image-20250331180749119
image-20250331180749119

4、 获取 Master 状态

SQL
SHOW MASTER STATUS;
image-20250331180840441
image-20250331180840441

记住 FilePosition 值(这里是 mysql-bin.000002 和 1173),稍后用在从服务器上。

配置从节点

我这里俩台从节点服务器,每一个从节点的配置都是一样的,除了id,id一定不能一样

1、修改 MySQL 配置

在 从服务器 上,编辑 /etc/mysql/mysql.conf.d/mysqld.cnf:

Bash
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

找到 [mysqld] 段,添加或修改以下内容:

Bash
[mysqld]
server-id=2 #id要确保唯一
relay-log=relay-bin
log_bin=mysql-bin
log_slave_updates=1
read_only=1  # 只读模式,防止意外修改

2、 重启 MySQL

Bash
sudo systemctl restart mysql

3、连接主服务器

在 MySQL 终端执行以下命令(替换IP、File、Password 、Position 值):

SQL
CHANGE MASTER TO
    MASTER_HOST='198.19.249.99',
    MASTER_USER='replicator',
    MASTER_PASSWORD='@k^U%NQMs4^fVz3N',
    MASTER_LOG_FILE='mysql-bin.000002',
    MASTER_LOG_POS=1173,
    GET_MASTER_PUBLIC_KEY=1;  -- MySQL 8.0 需要此选项
image-20250331194847333
image-20250331194847333

4、启动复制和检查复制状态

SQL
START SLAVE;
SHOW SLAVE STATUS\G

如果 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes,说明主从复制配置成功。

image-20250331195010545
image-20250331195010545

测试主从复制

Master 上创建测试数据库:

SQL
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO users VALUES (1, 'Alice');
image-20250331195244042
image-20250331195244042

然后在 Slave 查询:

SQL
SHOW DATABASES;
SELECT * FROM test_db.users;
image-20250331195309789
image-20250331195309789

这样就是没有问题了