共计 2019 个字符,预计需要花费 6 分钟才能阅读完成。
这篇文章主要介绍 MySQL 保证复制高可用的重要参数有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
expire_logs_days,binlog 清理的时间。
从库上 relay-log-recovery = 1 和 relay-log-info-repository = TABLE; 保证了主从数据的一致性,不论从机怎么出错都能保证,主从一致。
为什么呢?
首先说 SQL 线程,SQL 线程 apply 应用二进制日志,并且将 binlog 应用到的位置记录到 relay-info.log 中。
并且并不是 relay log 应用一次就刷盘写 relay-log.info 一次,而是一个参数指定,如下,意思是说回放 events 10000 次写一次盘。这个就是为什么从库 crash 了,出现 1062 错误。因为从库已经插入了数据,但是文件 relay-log.info 并没有记录文件,当重启后文件告诉数据库还要执行一次操作,就会出现这个主键重复插入的错误。所以这个参数设置为 table 的,就满足了一致性,避免了数据库和文件的不同步问题。
IO 线程:
和 relay_log_info_repository 不同的是,单单把 master_info_repository 设置成 table 是不能解决,备库 crash 了,从 IO 线程接收日志的一致性问题,因为 IO 线程接收日志写的文件是 relay log 文件,而数据库接收到主库的日志到哪里写的是 master-info.log 文件,(同步情况由 sync_master_info 决定) 这是两个不同的文件,比如当 relay 接收到了日志,为 event2,但是此时 master-info.log 记录的是 1,此时 crash 了,当重新启动从库时,master-info.log 告诉数据库我才接收到 1,又重新接收了一次 2,这样就重复了,即便是 master_info_repository 设置成 table 一样不解决问题。但是报错时,show slave status。最终作用到的都是 SQL 线程报错。所以还要设置另外一个参数 relay-log-recovery=1
最后一个非常重要的参数:
把当前接收到的 relay log 清理掉。然后从 SQL Thread 应用到的位置,重新拉取 relay log。
但是要保证主库 binlog 要保留,保留时间要够,因为我见过的有的公司主从延迟一个月之久。
还有 read-only 的设置,5.7 有个新的权限 super_read_only 参数,设置为 on,大家都没有权限,dba 也没有。
SQL 线程高可用
将 SQL 回放的位置写到 relay-info.log 中,没执行到一个 event,就写一次这个文件,那么性能会不会很差啊?因为没有 fsync 所以文件记录的会落后,将 relay_log_info_repository=TABLE(5.6 才有),将这次造作放在数据库,原子操作。(从库配置)
写 10000 个 event 才 fsync 一次写盘,那么就有一问题,如果设置为 1,有用吗?没用,有丢失一条记录的可能。
sync_relay_log_info:这个参数和 sync_relay_log 参数一样,当设置为 1 时,slave 的 I / O 线程每次接收到 master 发送过来的 binlog 日志都要写入系统缓冲区,然后刷入 relay-log.info 里,这样是最安全的,因为在崩溃的时候,你最多会丢失一个事务,但会造成磁盘的大量 I /O。当设置为 0 时,并不是马上就刷入 relay-log.info 里,而是由操作系统决定何时来写入,虽然安全性降低了,但减少了大量的磁盘 I / O 操作。
IO 线程的高可用
接收到一个 event,写 master.log 文件,表示接受到的位置,然后再去写 relay log file,这时候发送 crash,又会有问题,同样可以存表 master_info_repository。
master log 文件会落后,IO 线程会重新拉 master log 文件中后的 binlog,重复拉日志,SQL 线程就报错了,最终错误的显示都是 SQL 线程。
Relay-log-recovery=1,将当前接受到的所有 relay log
清除掉。然后以 SQL 线程运行到的位置重新拉取 thread。SQL 线程是可靠的,那么,还有什么问题呢?如果主库上的二进制日志没有了,那么也来不过来了,就有问题了,即便是基于 SQL 线程。但是线上有落后很久的情形。
master_info_repository=TABLE
从开启并行复制,也一定设置为 table,性能有一倍的差距。
Read_only 与 super_read_only 的区别,有 super_priv 权限的用户设置 read_only 还是可以写入的,
从库 super_read_only 也打
以上是“MySQL 保证复制高可用的重要参数有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!