🛠️ 第一步:打通网络与权限(前置条件)
在操作之前,必须确保 A、B、C 之间能通过局域网 IP 或公网域名/IP 互相连通。
进入mysql方法
Linux:mysql -u root -p
Docket: docker ps 查看mysql名称 在执行docker exec -it 容器名称 mysql -u root -p
源站 A (OpenWrt Docker):
容器里的 MySQL 必须把 3306 端口映射到 OpenWrt 宿主机(比如 ip:3306)。
源站 B (群晖 NAS) & 源站 C (宝塔):
因为要被其它机器连接,所以你在后续配置命令里,不能再用 localhost,必须用它们在网络中的真实 IP(例如群晖的局域网 IP,或者宝塔的公网 IP/局域网 IP)。
放行权限:
源站 B 的 root 账号默认可能限制了只能本地登录。建议在 B 和 C 的数据库里,分别执行一下允许外网连接的命令,或者直接按上一步的方法统一创建一个同步专用的账号(这里为了方便演示,我们直接用你现有的账号,但确保权限已放开)。
💡 第二步:修改三端的配置文件 (my.cnf)
你需要分别进入这三个环境的 MySQL 配置文件,在 [mysqld] 配置块下,加入自增步长和环形参数:
- 源站 A (OpenWrt Docker)
进入 Docker 容器挂载的 my.cnf里面的!includedir /etc/mysql/conf.d/上面添加:
#======= 新增的实时互同步参数 =======
server-id = 1
log_bin = mysql-bin
log_slave_updates = 1
binlog_format = ROW
auto_increment_increment = 3
auto_increment_offset = 1
# 过滤 C 站发过来的系统库变动
# 降级 binlog 字符集,强迫 8.4 向下兼容旧版 MySQL (核心破局点)
源站 B (群晖 NAS)
通过群晖的文本编辑器或 SSH 进入修改 my.cnf:sudo- vi /var/packages/MariaDB10/etc/my.cnf
添加
[mysqld]
server-id = 2 log_bin = mysql-bin binlog_format = ROW # B 作为纯备份,不需要 log_slave_updates,也不用配自增步长 slave_skip_errors = 22,1062,1146 replicate_ignore_db = mysql replicate_ignore_db = information_schema replicate_ignore_db = performance_schema replicate_ignore_db = sys
- 源站 C (宝塔面板)
直接在宝塔面板 -> 软件商店 -> MySQL -> 设置 -> 【配置修改】里添加:
目标在/etc/my.cnf 里面expire_logs_days = 10上面添加
# 找到这两行并修改它们的值:
#log-bin=mysql-bin #binlog_format=ROW # <--- 原来是 mixed,必须改成 ROW #server-id = 3 # <--- 原来是 1,必须改成 3 log-bin=mysql-bin binlog_format=ROW server-id = 3 # 在它们下方直接粘贴这三行新参数: log_slave_updates = 1 auto_increment_increment = 3 auto_increment_offset = 3 # ======= 物理隔离系统垃圾,避开字符集雷区 ======= replicate-ignore-db = mysql replicate-ignore-db = information_schema replicate-ignore-db = performance_schema replicate-ignore-db = sys # 强制忽略高版本 MySQL 8.4 传过来的所有异构语法和管理日志报错 slave_skip_errors = all
修改完成后,分别重启这三个环境的 MySQL 服务。
⛓️ 第三步:开始构建环形链路 (A ➡ B ➡ C ➡ A)
确定好三台机器在网络中互相访问的真实 IP(这里假设群晖 NAS 的局域网 IP 是 10.0.0.X,宝塔面板如果是公网就填公网域名/IP 或内网 IP)。
步骤 1:让源站 B(群晖)去复制 源站 A(OpenWrt)
登录 源站 A (ip) 的数据库,执行:
SQL
SHOW MASTER STATUS;
记下返回的 File(如 mysql-bin.000001)和 Position(如 154)。
登录 源站 B (群晖) 的数据库,执行(填入 A 的信息和账号密码):
SQL
CHANGE MASTER TO
master_host='ip',
master_user='用户',
master_password='密码',
master_port=3306,
master_log_file='刚才记录的A的File',
master_log_pos=刚才记录的A的Position;
START SLAVE;
步骤 2:让源站 C(宝塔)去复制 源站 B(群晖)
登录 源站 B (群晖) 的数据库,执行:
SQL
SHOW MASTER STATUS;
记下 B 的 File 和 Position。
登录 源站 C (宝塔) 的数据库,执行(填入 B 的真实 IP 和 root 密码):
SQL
CHANGE MASTER TO
master_host='群晖的实际IP',
master_user='root',
master_password='YangSuo1995..',
master_port=3306,
master_log_file='刚才记录的B的File',
master_log_pos=刚才记录的B的Position;
START SLAVE;
步骤 3:让源站 A(OpenWrt)去复制 源站 C(宝塔)—— 完成闭环
登录 源站 C (宝塔) 的数据库,执行:
SQL
SHOW MASTER STATUS;
记下 C 的 File 和 Position。
登录 源站 A (OpenWrt) 的数据库,执行(填入 C 的实际访问地址):
SQL
CHANGE MASTER TO
master_host='宝塔的实际IP或域名',
master_user='用户',
master_password='密码',
master_port=3306,
master_log_file='刚才记录的C的File',
master_log_pos=刚才记录的C的Position;
START SLAVE;
🔍 第四步:检查与日常维护
完成上述配置后,在三台机器上分别输入命令检查状态:
SQL
#群晖
SHOW SLAVE STATUS\G
#宝塔
SHOW SLAVE STATUS\G
#openwrt
SHOW REPLICA STATUS\G
只要看到 Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes,就说明跨设备的环形实时同步已经成功跑起来了。
⚠️ 注意事项:
由于你的配置代码中涉及到 $db->addServer(...),当数据库实现互相同步后,你网站代码里的连接地址不需要改成远程的。
源站 A 依然连 ip
源站 B 依然连 localhost
源站 C 依然连 localhost
它们各自读写本地的数据库,速度最快。而底层的 MySQL 会在暗中把 A、B、C 的数据全部串联同步,任何一个站更新,另外两个站秒同步;任何一台机器挂了,另外两台的数据也是完整的
版权属于:小杨的生活
本文链接:https://web.akkdiy.cn/archives/943/
转载时须注明出处及本声明