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位 |
从节点1 | 2核及以上 | 4GB及以上 | 50GB SSD(数据分区) | 千兆网卡(固定IP) | Ubuntu 24.04 LTS 64位 |
从节点2 | 2核及以上 | 4GB及以上 | 50GB SSD(数据分区) | 千兆网卡(固定IP) | Ubuntu 24.04 LTS 64位 |
3.2 服务器网络规划(示例)
节点角色 | 主机名 | 固定IP地址 | 子网掩码 | 网关 | DNS服务器 |
---|---|---|---|---|---|
主节点 | mysql-master | 192.168.1.100 | 255.255.255.0 | 192.168.1.1 | 8.8.8.8, 114.114.114.114 |
从节点1 | mysql-slave1 | 192.168.1.101 | 255.255.255.0 | 192.168.1.1 | 8.8.8.8, 114.114.114.114 |
从节点2 | mysql-slave2 | 192.168.1.102 | 255.255.255.0 | 192.168.1.1 | 8.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-id
和log-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设置过小)。
排查步骤:
- 测试从节点到主节点3306端口连通性:
telnet 192.168.1.100 3306 # 或 nc -zv 192.168.1.100 3306
- 验证复制账号权限(主节点执行):
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.%';"
- 检查主节点binlog是否存在:
sudo ls -l /var/lib/mysql/mysql-bin.000001 # 替换为实际File值
2. 从节点Slave_SQL_Running为No
可能原因:
- 主从节点数据不一致(如从节点已存在主节点要创建的表);
- 从节点执行中继日志时遇到SQL错误(如主节点使用了从节点不支持的函数)。
排查步骤:
- 查看错误日志(从节点执行):
sudo cat /var/log/mysql/error.log | grep -i "error"
- 若数据不一致,可重新初始化从节点(需停止复制,删除从节点数据,重新同步主节点全量数据):
# 主节点导出全量数据 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文件已包含)
八、注意事项
- 数据安全:
- 定期备份主节点数据(使用mysqldump或xtrabackup);
- 二进制日志保留时间不宜过短(建议7-15天),避免从节点同步时binlog已被清理。
- 性能优化:
- 主节点避免开启不必要的日志(如general log);
- 从节点可根据读请求压力调整配置(如增大innodb_buffer_pool_size)。
- 高可用扩展:
- 若需更高可用性,可在主节点故障时手动将从节点提升为主节点(执行
STOP SLAVE; RESET MASTER;
); - 生产环境建议搭配MHA(Master High Availability)或Orchestrator实现主从自动切换。
- 若需更高可用性,可在主节点故障时手动将从节点提升为主节点(执行
- 版本一致性:
- 所有节点MySQL版本必须一致(本文均为8.0.42),避免因版本差异导致复制异常。