前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何减少主从复制延迟

如何减少主从复制延迟

作者头像
summerking
发布于 2022-10-31 02:51:40
发布于 2022-10-31 02:51:40
51900
代码可运行
举报
文章被收录于专栏:summerking的专栏summerking的专栏
运行总次数:0
代码可运行

主从复制延迟的几个因素

  1. 从库硬件比主库差,导致复制延迟
  2. 主从复制单线程,主库写并发太大,来不及传送到从库导致延迟(更高版本的mysql可以支持多线程复制)
  3. 慢SQL语句过多,网络延迟,master负载主库读写压力大,导致复制延迟(架构的前端要加buffer及缓存层slave负载)

#解决办法

  1. 使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器只作为备份用,不进行其他任何操作,或者使用比主库更好的硬件设备作为slave
  2. 可以减少延迟的参数:
    • –slave-net-timeout=seconds 单位为秒 默认设置为 3600秒 #参数含义:当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据
    • –master-connect-retry=seconds 单位为秒 默认设置为 60秒 #参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试 通常配置以上2个参数可以减少网络问题导致的主从数据同步延迟
  3. 最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行
  4. 还有就是主库是写,对数据安全性较高,而slave则不需要这么高的数据安全,完全可以将sync_binlog设置为0或者关闭binlog 比如sync_binlog=1,
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
write和fsync的时机就是由参数sync_binlog来进行控制的

1、当sync_binlog=0的时候,表示每次提交事务都只write,不fsync

2、当sync_binlog=1的时候,表示每次提交事务都执行fsync

3、当sync_binlog=N的时候,表示每次提交事务都write,但积累N个事务后才fsync

比如innodb_flush_log_at_trx_commit= 1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
表示每一次的事务提交是否需要把日志都写入磁盘,这是很浪费时间的,一共有三个属性值:
0(每次写到服务缓存,一秒钟刷写一次)
1(每次事务提交都刷写一次磁盘)
2(每次写到os缓存,一秒钟刷写一次)
一般情况下我们推荐设置成2,这样就算mysql的服务宕机了,卸载os缓存中的数据也会进行持久化。

  1. innodb_flushlog也可以设置为0来提高sql的执行效率
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验