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

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;

记录关键信息(示例,实际以命令输出为准):

  • File: mysql-bin.000001
  • Position: 156
  • Binlog_Do_DB: test_db
  • Binlog_Ignore_DB: mysql,information_schema,performance_schema,sys

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

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

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

sudo vim /etc/mysql/my.cnf

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

[mysqld]
# 1. 集群节点唯一标识(slave1设为2,slave2设为3,不可重复)
server-id = 2  # slave1用2,slave2用3# 2. 关闭二进制日志(从节点默认关闭,如需级联复制可开启,此处不开启)
log-bin = OFF# 3. 中继日志配置
relay-log = /var/lib/mysql/relay-bin
relay-log-index = /var/lib/mysql/relay-bin.index
read-only = ON  # 从节点设为只读(root用户不受限,可通过super-read-only严格限制)
super-read-only = ON  # 严格只读(所有用户均无法写入,生产环境推荐)# 4. 同步过滤配置(与主节点保持一致,仅同步指定数据库)
replicate-do-db = test_db  # 仅同步test_db数据库
replicate-ignore-db = mysql
replicate-ignore-db = information_schema
replicate-ignore-db = performance_schema
replicate-ignore-db = sys# 5. 其他优化配置
skip-name-resolve = ON  # 禁用DNS解析
relay_log_recovery = ON  # 中继日志损坏时自动恢复

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

可能原因:
  • 主从节点数据不一致(如从节点已存在主节点要创建的表);
  • 从节点执行中继日志时遇到SQL错误(如主节点使用了从节点不支持的函数)。
排查步骤:
  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.xdnf.cn/news/19630.html

相关文章:

  • ubuntu部署MySQL服务
  • 数据结构——树(04二叉树,二叉搜索树专项,代码练习)
  • 【硬核干货】把 DolphinScheduler 搬进 K8s:奇虎 360 商业化 900 天踩坑全记录
  • 从零开始:用代码解析区块链的核心工作原理
  • linux开发板(rk3568,树莓派)自动连接保存好的WIFI
  • 模板商城探秘:DINO-X 定制模板指南(2)
  • Stop-Process : 由于以下错误而无法停止进程“redis-server (26392)”: 拒绝访问。
  • HTTPS如何保证数据传输过程中的安全性?
  • HQX SELinux 权限问题分析与解决
  • 2025 年,这些求职技能利用空闲时间就能学,轻松提升职场竞争力​
  • 亚马逊的领导力原则
  • Photoshop - Ps 处理图层
  • Qt模型/视图编程详解:QStringListModel与多视图数据同步
  • linux 命令 awk的常见用法
  • Zynq中级开发七项必修课-第四课:S_AXI_HP0 高速端口访问 DDR
  • OCR 识别准确率的关键影响因素
  • NAT与内网穿透
  • 【python】python进阶——pip命令
  • 【完整源码+数据集+部署教程】粘土石实例分割系统源码和数据集:改进yolo11-LVMB
  • Qt Demo(3) 之 deepseek 帮我写的关于图像显示的小界面
  • 【Vue2 ✨】Vue2 入门之旅(十):Vuex 入门
  • 精读:《VideoMAE V2: Scaling Video Masked Autoencoders with Dual Masking》
  • 一键换装玩疯了!3个AI魔法提示词让你秒变时尚达人
  • lua脚本在redis中执行是否是原子性?
  • Java反序列化漏洞揭秘:从原理到攻击实战
  • RT-DETR模型训练中断,接着训练的方法
  • 单片机day1
  • DevExpress WPF中文教程:如何将WPF数据网格绑定到本地数据库?
  • MyBatis:让 SQL 与代码和谐共处的持久层框架
  • Windows 和 Linux 服务器 IP 与域名强制绑定方法