Administrator
发布于 2026-03-24 / 4 阅读
0
0

CT机+MySQL主从与Redis哨兵集群部署

引言

某公司,需要部署MySQL主从集群。防止数据库因为故障,导致公司业务因数据库down掉导致不必要损失。我将以实验的方式来介绍部署过程。

实验环境

Master和Slave环境确认

角色

IP 地址

核心配置

核心作用

Master

192.168.112.104/24

server-id=1、开启 binlog

写入数据,记录所有数据变更

Slave

192.168.112.105/24

server-id=2、开启中继日志

同步 Master 数据,提供读服务

CT

192.168.112.106/24

-

通过Salve查看数据同步情况,确保主从部署成功搭建。

Redis-master

192.168.112.107/24

-

为主数据库提供缓存

Redis-slave

192.168.112.108/24

-

为从数据库提供缓存

同步账号

demo

密码 123456

仅用于 Slave 连接 Master 同步数据

同步账号

ct

密码 654321

用于CT 连接并管理主从数据库

同步库

Demo

忽略系统库

仅同步业务库,避免系统库干扰

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_IO_Running

Yes

IO 线程正常(读取 103 的 binlog)

Slave_SQL_Running

Yes

SQL 线程正常(执行中继日志)

Last_IO_Errno

0

无 IO 错误

Last_SQL_Errno

0

无 SQL 错误

Seconds_Behind_Master

0

数据无延迟

在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 全部开放

    整个架构无任何阻碍


评论