上一节我们成功搭建了主从复制、读写分离,实际上并发量和数据量不大的情况下,使用起来也是非常的流畅,无任何问题,可以正常运行了。

但是,要保证高可用,高并发的情况,可以写数据库master就有累了,从服务器slave读取数据也很累,在复制的过程中就产生了数据同步延迟问题,导致主服务器上有数据,从服务器没有数据情况,最终导致读写分离失效,访问数据失败。

有的网友就说我们可以升级主服务器的配置来解决,我说可以解决暂时的,一台服务器再怎么升级也有极限,如果使用多台服务器并且可以扩容的话,我们不是很好处理这个问题吗?

好了,我们这一节正要讲解同步延迟问题,解决掉数据同步延迟问题。

一、主从优势

其中Master主服务器负责写操作的负载,也就是说一切写的操作都在Master上,而读的操作则分摊到Slave从服务器上,这样一来的可以大大提高读取的效率。

为什么要分离读和写呢?写操作涉及到锁的问题,不管是行锁还是表锁还是块锁,都是比较降低系统执行效率的事情。

我们这样的分离是把写操作集中在一个节点上,而读操作其他的N个节点上进行,有效的提高了读的效率,保证了系统的高可用性。

二、复制过程

1)、Mysql的主从同步就是当master(主库)发生数据变化的时候,会实时同步到slave(从库)。

2)、主从复制可以水平扩展数据库的负载能力,容错,高可用,数据备份。

3)、不管是delete、update、insert都是在master上,当master有操作的时候,slave会快速的接受到这些操作,从而做同步。

三、主从同步的延迟的原因:

(1)、主库延迟问题

当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了,当然还有就是可能与slave的大型query语句产生了锁等待。

首要原因:数据库在业务上读写压力太大,CPU计算负荷大,网卡负荷大,硬盘随机IO太高。

次要原因:读写binlog带来的性能影响,网络传输延迟。

(2)、从库同步延迟问题

1)、相关同步参数:

首先在服务器上执行show slave satus; 

Master_Log_File:SLAVE中的I/O线程当前正在读取的主服务器二进制日志文件的名称Read_Master_Log_Pos:在当前的主服务器二进制日志中,SLAVE中的I/O线程已经读取的位置

Relay_Log_File:SQL线程当前正在读取和执行的中继日志文件的名称

Relay_Log_Pos:在当前的中继日志中,SQL线程已读取和执行的位置

Relay_Master_Log_File:由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称Slave_IO_Running:I/O线程是否被启动并成功地连接到主服务器上

Slave_SQL_Running:SQL线程是否被启动

Seconds_Behind_Master:从属服务器SQL线程和从属服务器I/O线程之间的时间差距,单位以秒计。

● show slave status显示参数Seconds_Behind_Master不为0,这个数值可能会很大

● show slave status显示参数Relay_Master_Log_File和Master_Log_File显示bin-log的编号相差很大,说明bin-log在从库上没有及时同步,所以近期执行的bin-log和当前IO线程所读的bin-log相差很大

● mysql从库数据目录下存在大量mysql-relay-log日志,该日志同步完成之后就会被系统自动删除,存在大量日志,说明主从同步延迟很厉害。

2)、DDL的IO问题

DML和DDL的IO操作是随机的,不是顺序的,成本高很多,还可能slave上的其他查询产生lock争用,由于Slave_SQL_Running也是单线程的,所以一个DDL卡主了,需要执行10分钟,那么所有之后的DDL会等待这个DDL执行完才会继续执行,这就导致了延迟,比如:"主库上那个相同的DDL也需要执行5分钟,为什么slave会延时?",答案是master可以并发,Slave_SQL_Running线程却不可以。

四、主从同步的延迟的解决方案(重点):

1)、架构方面

  • 业务的持久化层的实现采用分库架构,mysql服务可平行扩展,分散压力。
  • 单个库读写分离,一主多从,主写从读,分散压力。这样从库压力比主库高,保护主库。
  • 服务的基础架构在业务和mysql之间加入memcache或者redis的cache层。降低mysql的读压力。
  • 不同业务的mysql物理上放在不同机器,分散压力。

2)、硬件方面

  • 采用好服务器,比如4u比2u性能明显好,2u比1u性能明显好。
  • 存储用ssd或者盘阵或者san,提升随机写的性能。
  • 主从间保证处在同一个交换机下面,并且是万兆环境。

总结,硬件强劲,延迟自然会变小。一句话,缩小延迟的解决方案就是花钱和花时间。

3)、mysql主从同步加速

  • sync_binlog在slave端设置为0
  • logs-slave-updates 从服务器从主服务器接收到的更新不记入它的二进制日志。
  • 直接禁用slave端的binlog
  • slave端,如果使用的存储引擎是innodb,设置innodb_flush_log_at_trx_commit =2

4)、磁盘IO上操作

从文件系统本身属性角度优化master端修改linux、Unix文件系统中文件的etime属性, 由于每当读文件时OS都会将读取操作发生的时间回写到磁盘上,对于读操作频繁的数据库文件来说这是没必要的,只会增加磁盘系统的负担影响I/O性能。

五、主从同步的延迟的解决数据一致性方案

1)、主从复制存在的问题:

●主库宕机后,数据可能丢失

●从库只有一个sql Thread,主库写压力大,复制很可能延时

2)、解决方法:

● 半同步复制---解决数据丢失的问题

● 并行复制----解决从库复制延迟的问题

3)、半同步复制mysql semi-sync(半同步复制)半同步复制

● 确保事务提交后binlog至少传输到一个从库

● 不保证从库应用完这个事务的binlog

● 性能有一定的降低,响应时间会更长

● 网络异常或从库宕机,卡主主库,直到超时或从库恢复

4)、主从复制--异步复制原理、半同步复制和并行复制原理比较

a、异步复制原理

(图片来源于网络)

b、半同步复制原理

(图片来源于网络)

事务在主库写完binlog后需要从库返回一个已接受,才放回给客户端;确保事务提交后binlog至少传输到一个从库不保证从库应用完成这个事务的binlog性能有一定的降低网络异常或从库宕机,卡主库,直到超时或从库恢复、mysql并行复制 。

总 结

以上写了那么多内容,主要查找主服务器和从服务器之间的问题,因为数据同步的过程就是服务器之间的数据传输,所以,我们需要把观察问题所在,才好更好的解决问题,把数据延迟问题解决掉。

更多内容请关注公众号(Laravel技术社区)

mysql集群和主从区别_搭建MySQL主从集群,主从复制过程中同步延迟问题相关推荐

  1. mysql的集群和分布式区别_集群和分布式,你知道其中的区别吗?

    经常听到MySql集群.Redis集群.分布式系统等概念,但是,很少有机会深究,到底什么集群,什么是分布式?在概念上这俩个词很接近,难道不需要区分?其实,非常有必要区分这两个概念,帮助我们对计算机的理 ...

  2. mysql galera集群搭建_搭建mysql_galera数据库集群

    1,Mariadb Galera Cluster 集群介绍 Mariadb Galera Cluster 是MySQL高可用性和可扩展的解决方案 Mariadb Galera Cluster 是一套在 ...

  3. k8s高可用集群_搭建高可用集群(初始化和部署keepalived)---K8S_Google工作笔记0055

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们来部署keepalived,搭建高可用集群. 然后我们这里需要master,155, ma ...

  4. k8s高可用集群_搭建高可用集群(实现方式介绍)---K8S_Google工作笔记0054

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们来说搭建高可用集群,为什么要搭建高可用集群. 因为,首先我们说master节点是用来管理其 ...

  5. mysql集群软件有哪些_浅谈数据库集群软件优缺点有哪些

    满心狼藉 回答时间:2019-12-05 向TA提问 集群(Cluster)是由两台或多台节点机(服务器)构成的一种松散耦合的计算节点集合,为用户提 供网络服务或应用程序(包括数据库.Web服务和文件 ...

  6. mysql 主从_搭建mysql主从并编写监控主从状态脚本

    要求:两台centos7虚拟机分为主和从 安装mysql yum -y install mysql mysql-server 关闭防火墙 service iptables stopsetenforce ...

  7. java集群和分布式 区别_集群与分布式的联系以及区别

    集群(Cluster)是一组独立的计算机系统构成一个松耦合的多处理器系统,它们之间通过网络实现进程间的通信.应用程序可以通过网络共享内存进行消息传送,实现分布式计算机. 在客户端看来,一个集群就象是一 ...

  8. liunx下搭建mysql主从_linux下搭建mysql主从

    在master上创建repl账户,用于复制. grant replication slave on *.* to [email protected]%' identified by 'P@$$W0rd ...

  9. mysql 开发模式_搭建mysql主從模式

    第一步:先安裝兩個mysql,我分別裝在了 192.168.45.128 192.168.45.131 第二步:修改 Master 配置文件 命令:vim /etc/my.cnf 分別修改其中的ser ...

最新文章

  1. java jtabbedpane 关闭_JTabbedPane实现关闭按钮 | 学步园
  2. win10远程计算机管理,Win10系统下实现批量远程桌面管理的具体方法
  3. java使用jdbc调用hive出现The query did not generate a result set!
  4. DEEPIN 20.2.2社区版设置双屏显示(y7000p)
  5. 数据库系统实训——实验十——事务
  6. 目前我们再用的即时通讯软件
  7. reportviewer动态数据源
  8. 资深程序员:Python中你不知道的那些小工具
  9. 21天Jmeter打卡Day11配置元件之CSV数据文件配置
  10. android Camera相关问题及NV12剪裁旋转
  11. android run缓存报错,AndroidStudio常见错误收集(windows版)
  12. Enterprise Solution(2.2.20130525) 解决方案配置与源代码下载
  13. Unity 内置渲染管线、SRP、URP、HDRP区别
  14. python实现组合优化
  15. mysql常见练习题45题
  16. VisualStudio更改项目名字
  17. 产品概念之3/4:五层次理论 —— 消费者体验视角的产品概念
  18. truncate的用法
  19. MySQL中获取当前时间与时间戳
  20. VUE3.0——组件传值

热门文章

  1. nHibernate Mapping By Code - Introduction
  2. springboot 多数据源 读写分离 AOP方式
  3. Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
  4. 开发服务器 VSS开发库 自动备份方案
  5. SharpZipLib压缩解压
  6. python寻找字符串中的英文字符,python如何解析字符串中出现的英文人名?
  7. win8.1 linux系统,电脑显示win8.1linux系统失效的原因及解决办法!
  8. ie 调用java的时候报错,调用javabean的非常郁闷的异常。
  9. MySQL实现当前数据表的所有时间都增加或减少指定的时间间隔
  10. ld-linux.so.2 重定向,2-Linux重定向和管道、Shell编程.doc