首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >宝塔环境如何 主从复制 主从切换

宝塔环境如何 主从复制 主从切换

作者头像
逍遥子大表哥
发布于 2025-07-28 20:17:26
发布于 2025-07-28 20:17:26
4940
举报
文章被收录于专栏:kali blogkali blog

在前期,我们讲到了利用shell脚本,通过ipv6网络将公网服务器数据库备份到本地服务器。但只能做到备份,如果公网服务器数据库挂掉,能不能用本地的数据库呢?这需要我们先配置主从复制。

由于笔者公网服务器和和本地服务器都部署了宝塔。虽然宝塔有主从复制的插件,但要钱~

因此,我们只能手搓主从复制了!

环境

  • 公网MySQL 5.7.44
  • 本地MySQL 5.7.44
  • ipv6网络

在实验前,先从公网服务器测试ipv6网络是否能连接本地数据库。

配置主数据库

点击数据库配置文件,进行修改。

代码语言:javascript
复制
[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = row
expire_logs_days = 7
binlog_do_db = blog

接下来,我们用root账号登录。新增一个用于主从复制的账号。

代码语言:javascript
复制
mysql -u root -p
#输入密码后,分别执行下面命令
CREATE USER 'repl_user'@'%' IDENTIFIED BY 'YourStrongPassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;

请将repl_user 和YourStrongPassword更改为你的密码。 接下来,获取主服务器二进制日志状态 执行以下命令并记录 File 和 Position 的值:

代码语言:javascript
复制
SHOW MASTER STATUS;

本地服务器配置 (从)

编辑从服务器的MySQL配置文件,添加:

代码语言:javascript
复制
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
replicate_do_db = blog

注意

  • server-id 必须与主服务器不同。
  • replicate_do_db 指定从服务器需要复制的数据库。

接下来,重启MySQL服务。

初始化数据

登录主服务器,我们先将数据库进行手动同步。

代码语言:javascript
复制
mysqldump -u root -p --master-data --databases bbs blog > /root/db_dump.sql

将 db_dump.sql 传输到从服务器,执行导入:

代码语言:javascript
复制
mysql -u root -p < /root/db_dump.sql

启动从服务器复制

登录从服务器MySQL,执行:

代码语言:javascript
复制
CHANGE MASTER TO
MASTER_HOST = 'nas.nb.cn',  #主服务器地址
MASTER_PORT = 3306,
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'YourStrongPassword',
MASTER_LOG_FILE = 'mysql-bin.000001',  # 替换为记录的File值
MASTER_LOG_POS = 1234;                # 替换为记录的Position值

启动复制

代码语言:javascript
复制
START SLAVE;

检查复制状态

代码语言:javascript
复制
SHOW SLAVE STATUS\G

关键指标

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes

接下来,我们对测试表中,加入数据,在本地便可以实时同步。

主从切换

在宝塔面板环境中实现主数据库故障后自动切换到本地从数据库。 打开网站的Nginx配置,添加以下内容

代码语言:javascript
复制
upstream backend {
    # 主库对应的应用服务器(默认使用主库)
    server 公网应用服务器IP:端口 weight=10 max_fails=3 fail_timeout=30s;

    # 从库对应的应用服务器(本地IPv6地址,备用)
    server [本地IPv6地址]:端口 backup;
}

server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

假设,http://backend 应用读的数据库为本地数据库。当主服务器不可用时自动切换。但是,这样有个缺陷,该如何确保数据一致性,尤其是在主库恢复后,是否需要重新同步数据,或者将本地数据库提升为新的主库。这可能涉及到主从复制的重新配置。

常见故障分析

Slave_SQL_Running的值为NO,是因为主从服务器数据结构或者数据不一样。根据日志,查看数据异常的表。或者用下面命令跳过。

代码语言:javascript
复制
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;  -- 跳过1个错误事件
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 环境
  • 配置主数据库
  • 本地服务器配置 (从)
  • 初始化数据
  • 启动从服务器复制
  • 主从切换
  • 常见故障分析
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档