数据库好多玄学问题啊(
最初想搞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
可以查看运行状态
参考资料
主从/双主
并行复制
- MySQL 5.7并行复制实践 - 墨天轮
- Mysql解决主从慢同步问题(下)
- MySQL Case-MySQL8.0真正的并行复制writeset
- 发挥MySQL 8.0的优势-马楚成(2018).pdf
- MySQL实战 8/32 并行复制
其他
版权属于:ShiroKumo
所有原创文章采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。