Mysql 主从同步

Mysql 主从同步

索拉布特在天上 #

腾迅更新了协议,机器人登录过身份严重越来越难了,我现在也在希望 Mirai 在 2.15-RC 能修复登录问题。
SoraBot 宕了几天,换了 3 个号,一天干废一个。
没办法,我现在唯一能登录的手段,是通过安卓手表协议、启用 QR 码验证,并且只能在「扫码设备和机器人在同一个局域网下」的情况下才能成功登录。
在各个 issues 里,论坛里,其他机器人群里,都可以看到这次影响的广泛和严重。

手表协议很多消息和事件无法正确收到,功能性上大打折扣。

SoraBot 使用 Mysql 数据库存储用户和配置信息。
关于橙汁的查询,很多资料也是存储在 Mysql。
现在机器人托管在 sugurip 上,discord 机器人、pixiv 爬虫、twitter 爬虫 以及一堆功能都无法正常使用。

sugurip 上并没有原设置的数据库,也没有橙汁的数据库。虽然可以通过远程访问,但不如本地数据库原生。而且 sumika 的服务最近也不是很稳定,我的阿里云服务器前天才宕过一次。于是便有了这次数据库同步。


本篇日志记录了一次 Myql Replication 的建立,创建了原生的 Msql Master-Slave 主从同步。

导入导出原数据 #

我们假定 sumika 是主服务器,sugurip 是从服务器。同步的范畴在 data_ethene 和 data_oj 这两个库。 haneki 是我的常用用户,后续章节将新建一个新用户 ‘repl’@'%' 专门用于同步。

# 在主服务器 sumika 上
mysqldump -u haneki -p data_ethene > data_ethene.sql
mysqldump -u haneki -p data_edata_ojthene > data_oj.sql

# 在从服务器 sugurip 上
mysql -u haneki -p data_ethene < data_ethene.sql
mysql -u haneki -p data_oj < data_oj.sql

#这将保证在进行主从同步前,两个数据库的内容是一致的。

开启同步设置 建立专用用户 #

哈哈,就在我写这篇日志的中途,机器人又被风控了群消息。好想把腾迅的头给拧下来。

在 sumika 和 sugurip 分别编辑 /etc/mysql/mysql.conf.d/mysqld.cnf ,确保区分 server-id
replicate-do-db 设置需要同步的库。

# /etc/mysql/mysql.conf.d/mysqld.cnf
# sumika 上
server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
replicate-do-db = data_ethene
replicate-do-db = data_oj

# sugurip 上
server-id               = 2
log_bin                 = /var/log/mysql/mysql-bin.log
replicate-do-db = data_ethene
replicate-do-db = data_oj

在两台服务器上都重启 Mysql 服务。

#sumika 和 sugurip 上
systemctl restart mysql

在主服务器 sumika 上建立专用用户 ‘repl’@'%'

#sumika 上
#新建用户
mysql>create user 'repl'@'%' identified by '******';

#赋权
mysql>grant replication slave on data_ethene.* to 'repl'@'%';
mysql>grant replication slave on data_oj.* to 'repl'@'%';

#查看状态
mysql>show master status \G
*************************** 1. row ***************************
             File: mysql-bin.000003
         Position: 13228
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

这里的 File: mysql-bin.000003Position: 13228 会在同步时用到。

在从服务器 sugurip 上开启 slave。

#设置主服务器、文件、节点
mysql>change replication source to source_host='***.***.***.***',source_log_file='mysql-bin.000003',source_log_pos=13228;
Query OK , 0 rows affected (0.02 sec)

#通过刚设置的专用用户进行同步
mysql>start replica user='repl'@'%' password='******';
Query OK , 0 rows affected (0.02 sec)

#查看状态
mysql>show replica status \G

在输出中查看以下两项。

Replica_IO_Running: Yes
Replica_SQL_Running: Yes

到此既完成了主从同步的建设。在 sumika 上 data_ethene 和 data_oj 的变动将被同步到 sugurp 上。

如果输出是

Replica_IO_Running: No
Replica_SQL_Running: Yes

可能原因是从服务器的 source_log_pos=source_log_file= 与主服务器不一致。