在前期,我们讲到了利用shell脚本,通过ipv6网络将公网服务器数据库备份到本地服务器。但只能做到备份,如果公网服务器数据库挂掉,能不能用本地的数据库呢?这需要我们先配置主从复制。
由于笔者公网服务器和和本地服务器都部署了宝塔。虽然宝塔有主从复制的插件,但要钱~
因此,我们只能手搓主从复制了!
在实验前,先从公网服务器测试ipv6网络是否能连接本地数据库。
点击数据库配置文件,进行修改。
[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = row
expire_logs_days = 7
binlog_do_db = blog

接下来,我们用root账号登录。新增一个用于主从复制的账号。
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 的值:
SHOW MASTER STATUS;

编辑从服务器的MySQL配置文件,添加:
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
replicate_do_db = blog
注意
server-id 必须与主服务器不同。replicate_do_db 指定从服务器需要复制的数据库。接下来,重启MySQL服务。
登录主服务器,我们先将数据库进行手动同步。
mysqldump -u root -p --master-data --databases bbs blog > /root/db_dump.sql

将 db_dump.sql 传输到从服务器,执行导入:
mysql -u root -p < /root/db_dump.sql
登录从服务器MySQL,执行:
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值
启动复制
START SLAVE;
检查复制状态
SHOW SLAVE STATUS\G
关键指标
Slave_IO_Running: YesSlave_SQL_Running: Yes
接下来,我们对测试表中,加入数据,在本地便可以实时同步。

在宝塔面板环境中实现主数据库故障后自动切换到本地从数据库。 打开网站的Nginx配置,添加以下内容
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,是因为主从服务器数据结构或者数据不一样。根据日志,查看数据异常的表。或者用下面命令跳过。
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; -- 跳过1个错误事件