当前位置: 首页 > news >正文

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),避免因版本差异导致复制异常。
http://www.wxhsa.cn/company.asp?id=3669

相关文章:

  • 使用almalinux基础镜像创建nginx镜像
  • docke容器版Nessus登录+破解+激活+特征库更新
  • 我把Cursor当磁盘清理工具用,非常棒! - ukyo-
  • vue项目
  • 第九篇:数据库服务克隆应用
  • Anti-Proxy Attendance 题解
  • 【2024-2025第二学期】助教工作总结
  • 开始每小时记录日程
  • 5【鸿蒙/OpenHarmony/NDK】使用Node-API进行异步任务开发
  • 控制器指令
  • 题解:AT_abc421_c [ABC421C] Alternated
  • MySQL数据库:SQL数据类型
  • Ubuntu 安装
  • 幼等数论
  • 搭建rocketmq的三主三从遇到的坑
  • 深入解析:轻松Linux-9.进程间通信
  • 2025.9.14——1黄1绿
  • Ubuntu 中改图片大小
  • Day01
  • 认识眼图和眼图的参数
  • 【芯片设计-信号完整性 SI 学习 1.2 -- loopback 回环测试】 - 实践
  • 【科研绘图系列】R语言绘制地图和散点图 - 指南
  • Java NIO 学习小记
  • 扩展欧几里得算法求乘法逆元
  • redis实现缓存3-封装redis工具类
  • 高阻态
  • 鸿蒙应用开发从入门到实战(四):ArkTS 语言概述
  • 命令模式的深度解析:从标准实现到TPL Dataflow高性能架构
  • JavaWeb
  • 读书笔记:为什么数据在磁盘上的存放顺序如此重要?