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

CT机+MySQL主从搭建

一、Master和Slave环境确认

角色

IP 地址

核心配置

核心作用

Master

192.168.101.103/24

server-id=1、开启 binlog

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

Slave

192.168.101.104/24

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

同步 Master 数据,提供读服务

同步账号

yxwa

密码 123456

仅用于 Slave 连接 Master 同步数据

同步库

Demo

忽略系统库

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

  1. MySQL 主从架构权限机制说明

在 MySQL 主从复制架构中,主节点(Master)与从节点(Slave)仅存在数据层面的单向同步关系,二者是相互独立的数据库实例,拥有独立的权限管控体系、用户配置与访问控制规则。主从复制仅同步业务库数据,不会同步 MySQL 系统权限库(mysql 库),因此主节点的授权配置无法作用于从节点。

客户端(CT 机)作为外部访问主体,其访问权限遵循目标实例独立管控原则

  1. 若客户端需查询主节点(Master) 数据,必须由主节点对客户端进行授权;

  2. 若客户端需查询从节点(Slave) 数据,必须由从节点对客户端进行授权;

  3. 主从之间的复制权限,仅用于保障数据同步链路通畅,与客户端的访问授权无任何关联。

二、CT 机 、 Master 、 Slave的关系

  • Master可以当作总公司

  • Slave 当作分公司

  • Ct机 当作 自己

  1. 总公司 Master 授权你 能给总公司写文件 -> 你(CT)能在 Master 写入 Demo 数据;

  2. 总公司把文件同步分公司 Slave -> Slave 有了和 Master 一样的 Demo 数据

  3. 你要去分公司 Slave 查这份同步过来的文件 -> 分公司有自己的门卫(Slave 权限表),总公司的授权没用,必须分公司门卫单独认你(Slave 给 CT 授权)

注意⚠️:所以无论Master还是slave,我们(CT机)在查询(类似远程连接)的那一刻都需要进行授权

  • 拓扑图


三、前置准备 Master 和 Slave配置固定 IP

在 Master 控制台里执行:

1. 查看网卡名

ip link

你会看到类似 ens6s18 的网卡名(记下来)

2. 编辑网络配置

sudo nano /etc/netplan/00-installer-config.yaml

输入密码 YXwa@2023,编辑模式,把内容改成:

network:
  ethernets:
    ens6ps18:  # 这里换成你查到的网卡名
      addresses: [192.168.101.103/24]
      gateway4: 192.168.101.1
      nameservers:
        addresses: [8.8.8.8, 114.114.114.114]
  version: 2
  • 如图

3. 应用配置

sudo netplan apply

4. 验证 IP

ip a
  • 看到 inet 192.168.101.103/24 就成功了。


在 Slave 控制台里执行:

1. 查看网卡名

ip link

2. 编辑网络配置

sudo vim /etc/netplan/00-installer-config.yaml

输入密码 YXwa@2023,把内容改成:

network:
  ethernets:
    ens6s18:  # 这里换成你查到的网卡名
      addresses: [192.168.101.11/24]
      gateway4: 192.168.101.1
      nameservers:
        addresses: [8.8.8.8, 114.114.114.114]
  version: 2
  • 如图

3. 应用配置

sudo netplan apply

4. 验证 IP

ip a

看到 inet 192.168.101.104/24 就成功了。


在Master、Slave、CT机上执行

  • 执行代码

# 1. 检查MySQL服务状态
sudo systemctl status mysql

# 2. 关闭防火墙(三机互通必需)
sudo ufw disable

# 3. 测试网络连通性(互相ping)
# Master上执行:
ping 192.168.101.104 -c 3
ping 192.168.101.107 -c 3

# Slave上执行:
ping 192.168.101.103 -c 3
ping 192.168.101.107 -c 3

# 在CT机上执行
ping 192.168.101.103 -c 3
ping 192.168.101.104 -c 3
# 确保0%丢包,网络互通
  • 结果图

四、Master 配置

步骤 1:修改 MySQL 配置文件

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

替换 [mysqld] 段核心配置(保留原有基础配置):

[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  # 忽略系统库
max_binlog_size = 100M           # binlog文件大小限制
  • 结果图

步骤 2:重启 MySQL 生效配置

sudo systemctl restart mysql

步骤 3:创建同步账号并授权(允许 Slave IP 访问)

# 登录MySQL(Ubuntu免密登录)
sudo mysql -uroot -pYXwa@2023

执行以下 SQL(精准授权给 Slave 的 104 IP):

-- 1. 创建Demo库(提前准备同步库)
CREATE DATABASE IF NOT EXISTS Demo CHARACTER SET utf8mb4;

-- 2. 创建同步账号(仅允许104访问,更安全)
CREATE USER 'yxwa'@'192.168.101.104' IDENTIFIED WITH mysql_native_password BY '123456';

-- 3. 授予主从同步必需权限(最小权限原则)
GRANT REPLICATION SLAVE ON *.* TO 'yxwa'@'192.168.101.104';

-- 4. 刷新权限使配置生效
FLUSH PRIVILEGES;

-- 5. 查看主库状态(记录File和Position,Slave配置用)
SHOW MASTER STATUS;

关键输出示例

步骤4: 创建同步帐号授权CT机 (允许CT IP 访问)

CREATE USER 'root'@'192.168.101.107' IDENTIFIED BY '654321';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.101.107' WITH GRANT OPTION;

FLUSH PRIVILEGES;

步骤5: CT上连接测试master

# 装 MySQL 客户端
apt update && apt install -y mysql-client

# 测试
mysql -h 192.168.101.103 -u root -p654321 --skip-ssl -e "SELECT VERSION();"
  • 结果图

五、Slave 配置

步骤 1:修改 MySQL 配置文件

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

替换 [mysqld] 段核心配置:

[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
  • 结果图

步骤 2:重启 MySQL 生效配置

sudo systemctl restart mysql

步骤 3:绑定 Master 并启动同步

# 登录MySQL
sudo mysql -uroot

执行以下 SQL(替换 Master 的 File 和 Position):

-- 1. 提前创建Demo库(与Master一致)
CREATE DATABASE IF NOT EXISTS Demo CHARACTER SET utf8mb4;

-- 2. 停止旧同步(首次配置也建议执行)
STOP SLAVE;

-- 3. 重置同步状态(清空旧配置)
RESET SLAVE ALL;

-- 4. 绑定Master(核心命令,IP填103)
CHANGE MASTER TO
MASTER_HOST='192.168.101.103',        # Master的IP(103)
MASTER_USER='yxwa',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003',   # 替换为Master的File值
MASTER_LOG_POS=2657,                  # 替换为Master的Position值
GET_MASTER_PUBLIC_KEY=1;           # MySQL8.0必需(解决认证)

-- 5. 启动主从同步
START SLAVE;

-- 6. 查看同步状态(验证是否成功)
SHOW SLAVE STATUS\G;
  • 解析

这一套 SQL 执行完成后,Slave 就会:

  1. 连接到指定的 Master 节点

  2. 从指定的日志位置开始,实时同步 Master 上 Demo 库的所有增删改操作

  3. 最终实现 Master 写,Slave 自动同步 的主从架构

  • 结果图

步骤 4:验证同步状态

执行 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

数据无延迟

步骤5 :在Slave上给CT 授权并验证

--  在 Slave 上执行
CREATE USER 'root'@'192.168.101.107' IDENTIFIED BY '654321';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.101.107' WITH GRANT OPTION;

FLUSH PRIVILEGES;

步骤6: CT上连接测试Slave

mysql -h 192.168.101.104 -u root -p654321 --skip-ssl -e "SELECT VERSION();"
  • 结果图

六、验证主从同步效果

步骤 1:Master 写入测试数据

USE Demo;
CREATE TABLE IF NOT EXISTS sync_test (
    id INT PRIMARY KEY AUTO_INCREMENT,
    content VARCHAR(50),
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO sync_test (content) VALUES ('cesshi1'),('ceshi2');

步骤 2:Slave 查询验证

USE Demo;
SELECT * FROM sync_test;
  • 结果图

步骤3:CT 查询验证

# 验证CT机 在 Master上 是否能得到数据
mysql -h 192.168.101.103 -u root -p654321 --skip-ssl -e "USE Demo; SELECT * FROM sync_test;"

# 验证 CT机 在 Slave 上 是否能得到数据
mysql -h 192.168.101.104 -u root -p654321 --skip-ssl -e "USE Demo; SELECT * FROM sync_test;"
  • 结果图

七、常见问题排查

1. Slave_IO_Running: No

  • 原因:网络不通 / 账号密码错误 / IP 授权错误

# Slave上测试连接Master
mysql -uyxwa -p123456 -h192.168.101.103

能登录则账号密码正常,否则检查 Master 的账号授权(确保是192.168.101.104

2. Slave_SQL_Running: No

  • 原因:数据不一致(如 Demo 库表已存在)

解决

STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;

总结

  1. 核心配置:Master(103)开启 binlog 并授权 104 访问,Slave(104)绑定 103 的 IP 和同步参数,确保server-id不同。

  2. 成功标志:Slave 的Slave_IO_RunningSlave_SQL_Running均为Yes,且能查询到 Master 写入的数据。

  3. 关键注意:双机场景必须确保网络互通,Master 的bind-address0.0.0.0,同步账号精准授权给 Slave 的 104 IP。

  4. 权限问题:主(Madter)和从(Slave)的关系只是数据同步,类似多一个备份,但主和从数据库是单独的,想有独自的权限表单,因此主节点的授权配置无法作用于从节点



评论