需求
我希望将位于北京阿里云的 MariaDB 中的 typecho 表,同步到上海腾讯云中去,并且只要北京阿里云的这个表发生了变化,便马上进行同步
假设北京为主库(Master),上海为从库(Slave),两台服务器已通过 WireGuard 互通,如何使用 WireGuard 进行互联可以看我别的文章,我觉得数据库直接暴露在公网还是不咋安全,也可以使用别的虚拟局域网或者 SSH Tunnel 的方法解决
主库
修改 my.cnf 配置
编辑 /etc/mysql/my.cnf
,修改或添加以下内容:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=typecho
bind-address = 10.0.0.1
server-id=1
:就是设置主库的id
为 1binlog-do-db=typecho
:设置要同步的数据库bind-address = 10.0.0.1
:监听的 IP 白名单,不建议直接填写0.0.0.0
,这里填写你的 WireGuard 的 IP 即可
重启 MariaDB
sudo systemctl restart mariadb
创建同步账户
登陆到主库的数据库中:
mysql -u root -p
执行:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.2' IDENTIFIED BY 'slave_password';
FLUSH PRIVILEGES;
这里的 slave_password
要换成你自己设置的密码,10.0.0.2
要换成从库的 IP 地址,不可乱写,这里让 repl
用户只能从 10.0.0.2
进行登陆
随机密码设置可使用 openssl
openssl rand -hex 16
锁表,导出
锁表是为了不让在导出的过程中有写入的操作,避免出现问题
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
执行 SHOW MASTER STATUS;
后要记录下对应的值:
另开终端,导出 sql
文件
mysqldump -u root -p --databases typecho > /root/typecho.sql
从库
安装 MariaDB
sudo apt update
sudo apt install mariadb-server
修改 my.cnf
编辑 /etc/mysql/my.cnf
,修改或添加以下内容:
[mysqld]
server-id=2
relay-log=relay-log
重启 MariaDB:
sudo systemctl restart mariadb
导入主库数据
需要将主库导出的 sql
导入到从库中:
mysql -u root -p < /root/typecho.sql
配置主从同步
登陆上海的 MariaDB:
mysql -u root -p
执行:
CHANGE MASTER TO
MASTER_HOST='10.0.0.1',
MASTER_USER='repl',
MASTER_PASSWORD='slave_password',
MASTER_LOG_FILE='mysql-bin.000001', -- 用主库SHOW MASTER STATUS查到的File
MASTER_LOG_POS=12345; -- 用主库SHOW MASTER STATUS查到的Position
START SLAVE;
SHOW SLAVE STATUS\G
一定要注意,这里的:
MASTER_PASSWORD
MASTER_LOG_FILE
MASTER_LOG_POS
要填写你上面设置的和找到的,不能随便写
最后使用检查一下是否设置同步成功:
SHOW SLAVE STATUS\G
这两个为 Yes
基本上就没啥大问题了
解锁主库
回到北京 MariaDB:
UNLOCK TABLES;
检查是否插入成功
因为这个是实际用于部署到 typecho 作为数据库的,所以只要在 typecho 发一篇文章或者有个评论,数据库就会发生变化
写操作只在北京,当发生变化后,只要在上海的从库上测试看看是否能查到即可
在上海从库执行:
USE typecho;
SELECT * FROM information_schema.tables WHERE table_schema='typecho' ORDER BY UPDATE_TIME DESC LIMIT 10;
确实发生了改变,说明同步成功