Ubuntu 24.04 服务器调整MySQL 8.0.42 三节点集群(一主两从架构)安装部署配置教程

Ubuntu 24.04 服务器调整MySQL 8.0.42 三节点集群(一主两从架构)安装部署配置教程

Ubuntu 24.04 服务器调整MySQL 8.0.42 三节点集群(一主两从架构)安装部署配置教程

Ubuntu 24.04 服务器部署 MySQL 8.0.42 三节点集群(一主两从架构)安装部署配置教程

一、文档说明

1. 适用场景

本文档适用于在 Ubuntu 24.04 LTS 服务器 环境下,部署 MySQL 8.0.42 一主两从复制集群,满足中小规模业务的高可用、读写分离需求(如电商订单系统、内容管理平台等),从节点可分担读请求,提升整体系统并发能力。
mysql数据库安装参考 Ubuntu 24.04.2 LTS 安装mysql8.0.36保姆级教程(从安装到远程连接)

2. 集群架构

采用 MySQL 异步主从复制 模式,架构包含1个主节点和2个从节点,核心逻辑如下:

  • 主节点(Master):处理所有写入操作(INSERT/UPDATE/DELETE),开启二进制日志(binlog)记录数据变更,作为复制源向从节点同步日志;
  • 从节点1(Slave1)/从节点2(Slave2):仅处理读操作(SELECT),通过IO线程拉取主节点的binlog并写入本地中继日志(relay log),再通过SQL线程重放中继日志,确保与主节点数据一致。

3. 环境准备

3.1 服务器硬件要求(最小配置)
节点角色CPU内存硬盘网络操作系统
主节点2核及以上4GB及以上50GB SSD(数据分区)千兆网卡(固定IP)Ubuntu 24.04 LTS 64位
从节点12核及以上4GB及以上50GB SSD(数据分区)千兆网卡(固定IP)Ubuntu 24.04 LTS 64位
从节点22核及以上4GB及以上50GB SSD(数据分区)千兆网卡(固定IP)Ubuntu 24.04 LTS 64位
3.2 服务器网络规划(示例)
节点角色主机名固定IP地址子网掩码网关DNS服务器
主节点mysql-master192.168.1.100255.255.255.0192.168.1.18.8.8.8, 114.114.114.114
从节点1mysql-slave1192.168.1.101255.255.255.0192.168.1.18.8.8.8, 114.114.114.114
从节点2mysql-slave2192.168.1.102255.255.255.0192.168.1.18.8.8.8, 114.114.114.114
3.3 前置依赖检查

所有节点需执行以下命令,确保系统环境满足安装要求:

# 1. 更新系统软件包
sudo apt update &&
sudo apt upgrade -y
# 2. 安装依赖工具(如wget、vim、net-tools)
sudo apt install -y wget vim net-tools
# 3. 关闭防火墙(或开放MySQL端口,二选一)
# 方式1:关闭防火墙(测试环境推荐)
sudo ufw disable
# 方式2:开放MySQL默认端口3306(生产环境推荐)
sudo ufw allow 3306/tcp
sudo ufw reload
# 4. 关闭SELinux(Ubuntu默认未启用,如需检查执行)
sudo setenforce 0 # 临时关闭
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config # 永久关闭(需重启生效)
# 5. 检查时间同步(确保所有节点时间一致)
sudo apt install -y chrony
sudo systemctl enable --now chronyd
timedatectl set-timezone Asia/Shanghai # 设置时区为上海
sudo chronyc sources # 验证时间同步状态

二、所有节点:MySQL 8.0.42 基础安装

mysql安装教程

三、主节点(mysql-master)配置

1. 修改MySQL配置文件(my.cnf)

# 编辑MySQL主配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

在文件末尾添加以下主节点专属配置(需替换server-idlog-bin路径为实际环境):

[mysqld]
# 主库唯一 ID(1-2^32-1,不可与从库重复)
server-id = 1
# 启用二进制日志(核心,记录数据变更)
log_bin = /var/log/mysql/mysql-bin.log
# 二进制日志格式(推荐 ROW 模式,基于行复制,兼容性好)
binlog_format = ROW
# 仅同步指定数据库(可选,若不配置则同步所有数据库)
binlog_do_db = test_db
# 忽略同步的数据库(可选)
binlog_ignore_db = mysql
binlog_ignore_db = information_schema
# 二进制日志过期时间(避免日志过大,单位天)
expire_logs_days = 7
# 禁止从库写入(主库专用,可选)
read_only = 0
# 允许超级用户在 read_only 模式下写入(必须)
super_read_only = 0

2. 重启MySQL服务使配置生效

sudo systemctl restart mysql
# 验证配置是否生效(查看binlog是否开启)
sudo mysql -u root -p -e "show variables like 'log_bin%';"
# 输出中"log_bin"值为"ON"即表示配置生效

3. 创建主从复制专用账号

# 登录MySQL(输入root密码)
sudo mysql -u root -p
# 1. 创建复制账号(允许从节点192.168.1.0/24网段访问)
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'Repl@123456';
# 密码建议复杂
# 2. 授予复制权限(仅授予REPLICATION SLAVE权限,最小权限原则)
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
# 3. 刷新权限
FLUSH PRIVILEGES;
# 4. 查看主节点状态(记录File和Position值,后续从节点配置需用到)
SHOW MASTER STATUS;

记录关键信息(示例,实际以命令输出为准):
在这里插入图片描述

四、从节点(mysql-slave1、mysql-slave2)配置

1. 修改MySQL配置文件(my.cnf)

两个从节点配置完全一致,执行以下命令编辑配置文件:

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

在文件末尾添加从节点专属配置(注意server-id与主节点、另一从节点不重复):

[mysqld]
# 从库唯一 ID(不可与主库及其他从库重复)
server-id = 2  # Slave2 此处改为 3
# 启用中继日志(核心,存储主库二进制日志的副本)
relay_log = /var/log/mysql/relay-bin.log
# 中继日志索引文件
relay_log_index = /var/log/mysql/relay-bin.index
# 从库只读(禁止写入,仅允许超级用户操作)
read_only = 1
# 超级用户也只读(可选,进一步加强只读限制)
super_read_only = 1
# 启用从库二进制日志(可选,若需要从库作为其他从库的主库,需开启)
log_bin = /var/log/mysql/mysql-bin.log
# 中继日志自动恢复(重启后自动继续同步)
relay_log_recovery = 1

2. 重启MySQL服务使配置生效

sudo systemctl restart mysql
# 验证从节点配置(查看read-only状态)
sudo mysql -u root -p -e "show variables like 'read_only';"
# 输出中"read_only"值为"ON"即表示配置生效

3. 配置主从复制关系

两个从节点执行相同操作,步骤如下:

# 1. 登录从节点MySQL
sudo mysql -u root -p
# 2. 停止从节点复制进程(首次配置可跳过,但建议执行)
STOP SLAVE;
# 3. 配置主节点信息(替换以下参数为实际主节点信息)
CHANGE MASTER TO
MASTER_HOST='192.168.1.100', # 主节点IP
MASTER_USER='repl', # 主节点创建的复制账号
MASTER_PASSWORD='Repl@123456', # 复制账号密码
MASTER_LOG_FILE='mysql-bin.000001', # 主节点SHOW MASTER STATUS输出的File值
MASTER_LOG_POS=156;
# 主节点SHOW MASTER STATUS输出的Position值
# 4. 启动从节点复制进程
START SLAVE;
# 5. 查看从节点复制状态(关键看Slave_IO_Running和Slave_SQL_Running是否均为Yes)
SHOW SLAVE STATUS\G;

4. 验证从节点复制状态

执行SHOW SLAVE STATUS\G;后,重点检查以下字段:

  • Slave_IO_Running: Yes(IO线程正常,能拉取主节点binlog)
  • Slave_SQL_Running: Yes(SQL线程正常,能重放中继日志)
  • Last_IO_Error: 无错误信息(如有错误,需根据提示排查,如网络、账号密码、binlog文件名/位置是否正确)
  • Last_SQL_Error: 无错误信息(如有错误,需排查数据一致性或SQL兼容性问题)
    在这里插入图片描述
    在这里插入图片描述

五、集群功能验证

1. 数据同步验证(主节点写入,从节点读取)

步骤1:主节点创建测试数据库和表
# 登录主节点MySQL
sudo mysql -u root -p
# 创建测试数据库(与主从配置中replicate-do-db一致)
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;
# 创建测试表
CREATE TABLE IF NOT EXISTS user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
# 插入测试数据
INSERT INTO user (name, age) VALUES ('Alice', 25), ('Bob', 30);
步骤2:从节点验证数据同步

分别在slave1和slave2执行

# 登录从节点MySQL
sudo mysql -u root -p
# 查看test_db数据库是否存在
SHOW DATABASES LIKE 'test_db';
# 查看user表数据(应与主节点一致)
USE test_db;
SELECT * FROM user;

若输出结果与主节点一致,说明数据同步正常。

2. 读写分离验证(从节点只读)

步骤1:从节点尝试写入数据
# 登录从节点MySQL
sudo mysql -u root -p
USE test_db;
# 尝试插入数据(因从节点开启super-read-only,会报错)
INSERT INTO user (name, age) VALUES ('Charlie', 35);

预期结果:报错The MySQL server is running with the --super-read-only option so it cannot execute this statement,说明从节点只读限制生效。

步骤2:主节点更新数据,从节点验证
# 主节点执行更新
sudo mysql -u root -p -e "USE test_db; UPDATE user SET age=26 WHERE name='Alice';"
# 从节点验证更新结果(slave1和slave2均执行)
sudo mysql -u root -p -e "USE test_db; SELECT * FROM user WHERE name='Alice';"

若从节点输出age=26,说明更新同步正常。

六、集群运维与监控

1. 查看主节点binlog信息

# 主节点查看binlog列表
sudo mysql -u root -p -e "SHOW BINARY LOGS;"
# 查看指定binlog内容(示例:查看mysql-bin.000001)
sudo mysqlbinlog /var/lib/mysql/mysql-bin.000001

2. 查看从节点中继日志信息

# 从节点查看中继日志列表
sudo ls -l /var/lib/mysql/relay-bin*
# 查看中继日志内容(示例:查看relay-bin.000001)
sudo mysqlbinlog /var/lib/mysql/relay-bin.000001

3. 配置MySQL监控(可选,使用prometheus+grafana)

步骤1:安装mysqld_exporter(所有节点)
# 下载mysqld_exporter(对应MySQL 8.0版本)
wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz
# 解压并移动到指定目录
tar -zxvf mysqld_exporter-0.15.1.linux-amd64.tar.gz
sudo mv mysqld_exporter-0.15.1.linux-amd64/mysqld_exporter /usr/local/bin/
# 给MySQL创建监控账号(主节点执行,从节点自动同步)
sudo mysql -u root -p
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'Exporter@123';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
FLUSH PRIVILEGES;
EXIT;
# 创建mysqld_exporter配置文件
sudo vim /etc/mysql/exporter.cnf

配置文件内容:

[client]
user=exporter
password=Exporter@123
host=localhost
port=3306
步骤2:配置systemd服务(所有节点)
sudo vim /etc/systemd/system/mysqld_exporter.service

服务文件内容:

[Unit]
Description=MySQL Exporter for Prometheus
After=mysql.service
[Service]
User=mysql
Group=mysql
Environment="DATA_SOURCE_NAME=--config.my-cnf=/etc/mysql/exporter.cnf"
ExecStart=/usr/local/bin/mysqld_exporter $DATA_SOURCE_NAME
[Install]
WantedBy=multi-user.target
步骤3:启动并验证mysqld_exporter
sudo systemctl daemon-reload
sudo systemctl enable --now mysqld_exporter
# 验证端口(默认9104)
netstat -tulnp | grep 9104

后续可在Prometheus中添加节点监控配置,通过Grafana导入MySQL监控模板(如模板ID:7362)实现可视化监控。

七、常见问题排查

1. 从节点Slave_IO_Running为Connecting

可能原因:
  • 主节点防火墙未开放3306端口;
  • 复制账号密码错误;
  • 主节点IP或binlog文件名/位置错误;
  • 主节点binlog已被清理(expire_logs_days设置过小)。
排查步骤:
  1. 测试从节点到主节点3306端口连通性:
    telnet 192.168.1.100 3306 # 或 nc -zv 192.168.1.100 3306
  2. 验证复制账号权限(主节点执行):
    sudo mysql -u root -p -e "SELECT user,host FROM mysql.user WHERE user='repl';"
    sudo mysql -u root -p -e "SHOW GRANTS FOR 'repl'@'192.168.1.%';"
  3. 检查主节点binlog是否存在:
    sudo ls -l /var/lib/mysql/mysql-bin.000001 # 替换为实际File值

2. 从节点Slave_SQL_Running为No

可能原因:
排查步骤:
  1. 查看错误日志(从节点执行):
    sudo cat /var/log/mysql/error.log | grep -i "error"
  2. 若数据不一致,可重新初始化从节点(需停止复制,删除从节点数据,重新同步主节点全量数据):
    # 主节点导出全量数据
    sudo mysqldump -u root -p --all-databases --master-data=2 --single-transaction > master_full.sql
    # 复制数据到从节点
    scp master_full.sql root@192.168.1.101:/tmp/ # slave1
    # 从节点导入数据
    sudo mysql -u root -p < /tmp/master_full.sql
    # 重新配置主从复制(参考步骤四.3,无需修改MASTER_LOG_FILE和MASTER_LOG_POS,dump文件已包含)

八、注意事项

  1. 数据安全
    • 定期备份主节点数据(使用mysqldump或xtrabackup);
    • 二进制日志保留时间不宜过短(建议7-15天),避免从节点同步时binlog已被清理。
  2. 性能优化
    • 主节点避免开启不必要的日志(如general log);
    • 从节点可根据读请求压力调整配置(如增大innodb_buffer_pool_size)。
  3. 高可用扩展
    • 若需更高可用性,可在主节点故障时手动将从节点提升为主节点(执行STOP SLAVE; RESET MASTER;);
    • 生产环境建议搭配MHA(Master High Availability)或Orchestrator实现主从自动切换。
  4. 版本一致性
    • 所有节点MySQL版本必须一致(本文均为8.0.42),避免因版本差异导致复制异常。