引言
某公司,需要部署MySQL主从集群。防止数据库因为故障,导致公司业务因数据库down掉导致不必要损失。我将以实验的方式来介绍部署过程。
实验环境
Master和Slave环境确认
Master,Slave与CT机的关系
Master 当作总部
Slave 当作分部
CT机 当作公司员工
1.总部Master授权公司员工 为总部写入数据,但因为总部会将数据同步到分部,所以分部也将获得公司员工写入的数据。
2.但如果公司员工想查询分布同步的该数据,但分部没有该员工的权限,该员工也无法查询,必须单独获取分部的权限才能查询。
3.所以无论Master还是slave,我们(CT机)在查询(类似远程连接)的那一刻都需要进行授权。
拓扑图

MySQL搭建与IP绑定。
设置静态IP。
sudo nano /etc/netplan/50-cloud-init.yaml #编辑网络配置修改内容:
# Master配置
network:
version: 2
ethernets:
ens6ps18:
addresses: [192.168.112.104/24]
routes:
- to: default
via: 192.168.112.1
nameservers:
addresses: [8.8.8.8, 114.114.114.114]如图:

# Slave配置
network:
version: 2
ethernets:
ens6ps18:
addresses: [192.168.112.105/24]
routes:
- to: default
via: 192.168.112.1
nameservers:
addresses: [8.8.8.8, 114.114.114.114]如图:

应用配置
sudo netplan apply在Master与Slave都部署MySQL服务端。
sudo apt update #更新索引
sudo apt install mysql-server -y #部署MySQL服务端
mysql --version #查看数据库版本测试连通性
sudo systemctl status mysql # 检查MySQL服务状态
sudo ufw disable # 关闭防火墙(三机互通必需配置)# Master上执行:
ping 192.168.112.105 -c 3
ping 192.168.112.106 -c 3
# Slave上执行:
ping 192.168.112.104 -c 3
ping 192.168.112.106 -c 3
# 在CT机上执行
ping 192.168.112.104 -c 3
ping 192.168.112.105 -c 3
Master 配置
修改 MySQL 配置文件
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf[mysqld]
# 基础配置(保留)
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
datadir = /var/lib/mysql
# 主库核心配置
bind-address = 0.0.0.0 # 允许所有IP访问(必配,让Slave能连接)
server-id = 1 # 唯一ID,Slave必须不同
log_bin = /var/log/mysql/mysql-bin.log # 开启binlog(记录数据变更)
binlog_format = ROW # 行级复制,数据一致性最高
binlog_do_db = Demo # 仅同步Demo库
binlog_ignore_db = mysql,information_schema,performance_schema,sys # 忽略系统库
max_binlog_size = 100M # binlog文件大小限制

重启MySQL使生效配置
sudo systemctl restart mysql创建同步账号并授权(允许Slave IP同步数据)
# 登录MySQL(MySQL DB默认空密码)
sudo mysql -uroot执行以下SQL,精准授权给Slave数据库IP。
# 创建Demo库(提前准备同步库)
CREATE DATABASE IF NOT EXISTS Demo CHARACTER SET utf8mb4;
# 创建同步账号(仅允许105访问,更安全)
CREATE USER 'demo'@'192.168.112.105' IDENTIFIED WITH mysql_native_password BY '123456';
# 授予主从同步必需权限(最小权限原则)
GRANT REPLICATION SLAVE ON *.* TO 'demo'@'192.168.112.105';
# 刷新权限使配置生效
FLUSH PRIVILEGES;
# 查看主库状态(记录File和Position,Slave配置用)
SHOW MASTER STATUS;

创建同步账号并授权(允许CT机IP访问)
# 创建同步账号(仅允许106访问,更安全)
CREATE USER 'ct'@'192.168.112.106' IDENTIFIED BY '654321';
# 授予CT机最高管权限(允许这个账号再去授权给其他账号:超级管理员)
GRANT ALL PRIVILEGES ON *.* TO 'ct'@'192.168.112.106' WITH GRANT OPTION;
# 刷新权限使配置生效
FLUSH PRIVILEGES;

测试CT连接数据库Master
# 安装 MySQL 客户端
apt update && apt install mysql-client -y
#测试
mysql -h 192.168.112.104 -uct -p654321 -e "SELECT VERSION();"返回结果。

Slave 配置
修改 MySQL 配置文件
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf[mysqld]
# 基础配置(保留)
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
datadir = /var/lib/mysql
# 从库核心配置
bind-address = 0.0.0.0
server-id = 2 # 必须与Master的1不同
relay-log = /var/log/mysql/relay-bin.log # 开启中继日志(存储Master的binlog)
read_only = 1 # 从库只读(防止误写)
super_read_only = 0 # 先关闭,创建库后再开启(验证用)
replicate_do_db = Demo # 仅同步Demo库
replicate_ignore_db = mysql,information_schema,performance_schema,sys

重启MySQL使配置生效
sudo systemctl restart mysql连接Master数据库启动同步
# 登录MySQL
sudo mysql -uroot执行以下 SQL(替换 Master 的 File 和 Position):
# 提前创建Demo库(与Master一致)
CREATE DATABASE IF NOT EXISTS Demo CHARACTER SET utf8mb4;
# 停止旧同步(首次配置也建议执行)
STOP SLAVE;
# 重置同步状态(清空旧配置)
RESET SLAVE ALL;
# 绑定Master(核心命令,IP填104)
CHANGE MASTER TO
MASTER_HOST='192.168.112.104', # Master的IP(104)
MASTER_USER='demo',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001', # 替换为Master的File值
MASTER_LOG_POS=1814, # 替换为Master的Position值
GET_MASTER_PUBLIC_KEY=1; # MySQL8.0必需(解决认证)
# 启动主从同步
START SLAVE;
# 查看同步状态(验证是否成功)
SHOW SLAVE STATUS\G


验证同步状态
执行 SHOW SLAVE STATUS\G; 后,重点检查以下字段:
在Slave上给CT 授权并验证
# 在 Slave 上执行
CREATE USER 'ct'@'192.168.112.106' IDENTIFIED BY '654321';
GRANT ALL PRIVILEGES ON *.* TO 'ct'@'192.168.112.106' WITH GRANT OPTION;
FLUSH PRIVILEGES;
测试CT连接数据库Slave
mysql -h 192.168.112.105 -u root -p654321 "SELECT VERSION();"
验证主从同步效果
Master写入数据
USE Demo;
CREATE TABLE test_sync (
id INT PRIMARY KEY AUTO_INCREMENT,
info VARCHAR(50)
);
INSERT INTO test_sync (info) VALUES ('主从同步正常');
INSERT INTO test_sync (info) VALUES ('CT机数据同步成功');

Slave 查询验证
USE Demo;
SELECT * FROM sync_test;同步成功。

Redis哨兵集群
安装Redis服务
sudo apt update
sudo apt install redis-server -y配置Redis服务(主从库配置相同)
sudo nano /etc/redis/redis.conf修改配置内容(允许访问 + 密码)
bind 0.0.0.0 #大概在80行左右(NETWORK区域)
protected-mode no #大约在100行左右(NETWORK区域)
requirepass Redis@123456 #大约在1000行左右(SECURITY区域)


重启并自启Redis服务 + 关闭防火墙
systemctl restart redis-server
systemctl enable redis-server
ufw disable
主库连接自己的缓存
安装Redis客户端
sudo apt install redis-tools -y测试连接(替换为Redis-master的IP)
redis-cli -h 192.168.112.107 -a Redis@123456 ping返回 PONG ✅

从库连接自己的缓存
安装Redis客户端
sudo apt install redis-tools -y测试连接(替换为Redis-slave的IP)
redis-cli -h 192.168.112.108 -a Redis@123456 ping返回 PONG ✅

测试缓存是否正常
Redis-master
# 缓存虚拟机启动监听
redis-cli -a 你的Redis密码 MONITOR在 Redis-master 缓存虚拟机 或任意能连接 Redis-master 的机器上执行:
# 写入测试缓存
redis-cli -h 192.168.112.107 -a Redis@123456 SET sync_test:1 '{"id":1,"content":"hollow","create_time":"2026-03-24 18:51:54"}'
# 手动读取测试缓存(模拟 CT 机查询)
redis-cli -h 192.168.112.107 -a Redis@123456 GET sync_test:1 
能看到监控日志说明缓存 Redis-master 读写使用正常

Redis-slave
# 缓存虚拟机启动监听
redis-cli -a 你的Redis密码 MONITOR在 Redis-slave 缓存虚拟机 或任意能连接 Redis-slave 的机器上执行:
# 写入测试缓存
redis-cli -h 192.168.112.108 -a Redis@123456 SET sync_test:1 '{"id":1,"content":"hollow","create_time":"2026-03-24 18:51:54"}'
# 手动读取测试缓存(模拟 CT 机查询)
redis-cli -h 192.168.112.108 -a Redis@123456 GET sync_test:1 
能看到监控日志说明缓存 Redis-slave 读写使用正常

结论
1️⃣ MySQL 主从部署 ✅ 完全成功
主库写入数据
从库能查询到一模一样的数据
你截图里已经明确查到:
hollow
ashe
→ 主从同步 100% 正常运行
2️⃣ Redis 缓存服务 ✅ 完全成功
Redis 独立虚拟机运行
密码认证成功
远程连接成功
SET 写入缓存成功
GET 读取缓存成功
MONITOR 看到真实缓存日志
→ 缓存 100% 可用、可写、可读、可监控
3️⃣ 网络环境 ✅ 完全通畅
虚拟机之间互通
防火墙已关闭
数据库 3306、Redis 6379 全部开放
→ 整个架构无任何阻碍