数据库好多玄学问题啊(

最初想搞MySQL主从主要是想把博客的访问速度稍微提一下(因为主服务器在日本),所以我设置完也不算是负载均衡,因为我就单纯把网站原封不动搬到香港然后加了个cloudflare解析;好像就算前台CloudFlare给你解析到IPV6地址也可以访问到只支持IPV4的服务器?

说回正事,MySQL主从主要还是做负载均衡以及灾难备份的,也可以做读写数据库分离等功能。

我不是DBA或者程序员,相关的原理以及实现可以参考这篇文章:

配置

主从之间要保持数据库版本一致

MySQL主从配置需要先修改my.cnf文件,主要涉及到的有:

log-bin=mysql-bin
# 开启binlog
relay_log = mysql-relay-bin
# 开启relaylog
relay-log-purge = 1
# 自动删除relaylog,虽然不删也没事但是可能会在主从崩溃的时候产生奇怪的问题
relay_log_recovery = 1
# 在relaylog损坏时重新生成一个relay log,并将从库的io线程的position重新指向新的relay log。
# 同时sql线程的position退回到跟io线程的position保持一致,重新开始同步。
server_id=1
# 主与从之间要不同,一般是取IP地址的最后三位
# 如果在双主复制结构中没有设置ID的话就会导致循环同步问题
binlog_format=mixed
# 有三种参数,宝塔默认是mixed,也就是混合
# 不过WordPress数据库用mixed经常报错
binlog-do-db = <dbname1>
binlog-do-db = <dbname2>
# 选择要同步的数据库,不设置这项就是全部同步
log-slave-updates
# 允许备库将重放的事件也记录到自身的二进制日志中去
# 可以将备库当做另外一台主库的从库,也就是双主
sync_binlog = n
# 在进行n次事务提交以后,Mysql将执行一次fsync的磁盘同步指令。将缓冲区数据刷新到磁盘。
# 为0的话由Mysql自己控制频率。建议设置为1
innodb_flush_logs_at_trx_commit=1
# 为0的话,log buffer将每秒一次地写入log file中并且刷新到磁盘。
# mysqld进程崩溃会丢失一秒内的所有事务。
# 为1的话,每次事务log buffer会写入log file并刷新到磁盘。(较为安全)
# 在崩溃的时候,仅会丢失一个事务。
# 为2的话,每次事务log buffer会写入log file,但一秒一次刷新到磁盘
auto-increment-increment=2
auto-increment-offset=1
# 对应的从服务器设置为 auto-increment-offset=2 保证主从生成数字不重复
# 开启GTID模式就不需要了,直接默认就好
replicate-do-db = <dbname1>
replicate-do-db = <dbname1>
# 从库接收的数据库,双主结构会需要的设置,可以跟binlog-do-db选择一个设置
# 同时设置不影响
skip_slave_start=1
# 避免复制进程在mysql进程重启后自启
slave-net-timeout = 20
# 从库的设置。从库在第一次连接失败后等待的秒数

开启复制

在主服务器中创建一个拥有 REPLICATION SLAVE 权限的账户,最好把IP限定在只有从服务器能访问.

运行 show master status;得到主服务器的‘File’与‘Position’值,然后在从服务器中执行:

change master to master_host='<master ip>',master_user='<user>',master_password='<password>',master_log_file='<File>',master_log_pos=<Position>;
start slave;

执行 show slave status\G 可以查看运行状态

参考资料

主从/双主

并行复制

其他

最后修改:2022 年 05 月 08 日
如果觉得我的文章对你有用,请随意赞赏