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

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

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

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

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

一、主从优势

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

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

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

二、复制过程

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

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

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

2821f2f183a846fb3d652e35a94a41cc.png

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

(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、异步复制原理

2a5040248536e1d9bd7ffdc148bbaa53.png

(图片来源于网络)

b、半同步复制原理

4b82a1dcec231adfc02793f163475e66.png

(图片来源于网络)

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

总 结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之——The slave I/O thread stops because master and slave have equal...

1)操作系统 cat /etc/issue CentOS release 6.6 (Final) Kernel \r on an \m cat /proc/version Linux version 2.6.32-504.el6.x86_64 (mockbuildc6b9.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) ) #1 SMP Wed Oct 15 04:27:16 UTC 2014 …

数学:乘法逆元-拓展GCD

乘法逆元应用在组合数学取模问题中,这里给出的实现不见得好用 给出拓展GCD算法: 扩展欧几里得算法是指对于两个数a,b 一定能找到x,y(均为整数,但不满足一定是正数) 满足x*ay*bgcd(a,b) gcd(x,y)是指x 与 y的…

java I O类大全_Java I/O最简单的几个类

今天把I/O中最简单的几个类整理了一下,之所以整理最简单的,是因为这样会让我更加快速方便的理顺这里面的东西,以前每一次用的时候都要先百度一下,觉得很烦。首先需要先看一下Read,Write和Stream,那么看下面的图就明确多…

rpm包安装mysql数据库

3.1上传以下两个rpm包到服务器上 MySQL-server-5.6.27-1.el6.x86_64.rpm MySQL-client-5.6.27-1.el6.x86_64.rpm 3.2卸载一个旧的mysql-libs包: rpm -e mysql-libs-5.1.73-3.el6_5.x86_64 --nodeps 3.3开始安装mysql-server服务器端 rpm -ivh MySQL-server-5.6.27…

micropython stm32f407 以太网_[MicroPython]STM32F407开发板DIY声光控开关

1.实验目的1. 学习在PC机系统中扩展简单I/O 接口的方法。2. 进一步学习编制数据输出程序的设计方法。3. 学习光敏模块的工作原理。4. 学习声音的工作原理。5. 学习F40 7Micropython开发板与声音传感器与光敏传感器的接线方法以及利用声音与光控制发光二极管亮灭。2.所需元器件F…

linux mysql数据库备份并删除前一分钟的数据

linux 中mysql数据库定时备份并删除前一分钟的所有数据 #!/bin/bash #mysqldump -uroot -ppassword01! imaginebase > /home/backup/imaginebase_KaTeX parse error: Expected EOF, got # at position 27: …%d_%H%M%S).sql #̲mysqldump -uroo…(date %Y%m%d_%H%M%S).sql.g…

打开 igv java_必备可视化Integrative Genomic Viewer(IGV)

你会用到的网站:写在前面:之前mac不小心升级了一下java,然后igv就不能用了,要写教程必须降级java首先,看官方说明,需要安装Java -8,9以上版本不支持。我的mac不知道什么时候更新到了java 10&…

机器学习项目笔记

项目清单: 1. 商业目标2. 划定问题               监督或非监督,还是强化学习。3. 选择什么算法             回归还是分类, 数据量小可使用单机内存的 批量计算, 数据量大使用分布式的MapReduce 线上计算。4. 评估模型…

sublime配置python环境变量_Sublime Python环境配置

文章主要说明了能让Python的编程者使用更方便的一些设置和调整。Sublime Text简介Sublime Text是一个很棒的编辑器,支持跨平台,有着强大的插件子系统。对于Python开发,有不少插件可以让你开发起来更流畅、更有乐趣。我现在仍然在不同的项目之…

linux mysql主从配置

1准备两台服务器 一台是192.168.118.128 一台是192.168.118.129 2主服务器配置 192.168.118.128 修改my.cnf文件 server-id1 log-binmysql-bin #启动MySQL二进制日志系统, binlog-do-dbourneeddb #需要同步的数据库 binlog-ignore-dbmysql #不同步mysql系统数据库&…

java web.xml 监听器_【JAVA 核心技术】java web 中的监听器

为什么要有监听器?监听器是用来处理一系列事件的java类,可被配置在java web项目中。既然如此,为什么不用代码直接调用监听器?这可能是因为J2EE规范规定的项目工程标准,用web.xml指定监听器,然后服务器中间件如weblogic可以以遵照标…

分布式和集群区别以及分布式事务

集群就是同一个代码部署了很多服务器是集群,分布式就是把项目拆成若干个工程,每个工程负责一部分内容,需要多个工程配合完成业务流程 使用的MQ数据一致性解决的分布式事务问题 转载于:https://www.cnblogs.com/fengnan/p/9482980.html

python变量生命周期_python 变量定义及变量生命周期

第一部分最近在写Python的时候发现一个好玩的现象,就是在if else重定义的变量,没有声明全局,在外部也可以使用,这里涉及到一个python变量生命周期的问题。python能够改变变量作用域的代码段是def、class、lamda.if/elif/else、try…

svn新建仓库

1昨天需要在服务器上新建一个仓库,解决方法是把已有的仓库拷贝出来,库删除在放进去 2然后今天想看看有没有命令的方法 find / -name project 首先查看一下项目的位置 3创建仓库 svnadmin create /mnt/raid1/huge/project/test 4cd test Ls 5vi authz…

java gb13000 ucs2_采用GB 13000的UCS-2进行存储的文件怎么转换

不是sql中的数据吧你那个是单个文件吗?假设文件头采用标准UCS2格式的两个字节,每个字段的数据是通过\t分隔的,每行文字是一条记录,如果有不同,需要对程序进行调整。FILE *f _wfopen(L"d:\\文件名.txt",L"rb"…

MySql数据库索引原理

写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录。如果没有索引,查询将对整个表进…

python3 unicode字符串_【已解决】Python3中如何声明字符串是unicode类型以避免log日志打印出错...

Python3中代码:CreateTableSqlTemplate """CREATE TABLE IF NOT EXISTS %s (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘自增,主键’,cityDealerPrice int(11) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘经销商参考价’,…

linux awstats搭建

1安装lnmp模式 2安装awstats 2# tar xf awstats-6.5.tar.gz 解压下载到/root下的压缩包 mkdir /var/lib/awstats chmod 755 /usr/local/awstats #cp -R awstats-6.5/ /usr/local/awstats cd /usr/local/awstats/ 进入到解压目录下 ls docs README.TXT tools wwwroot cd tool…

java实现坐标图进行拖拉拽放_js实现限定区域范围拖拉拽效果

本文实例为大家分享了js实现限定区域范围拖拉拽的具体代码,供大家参考,具体内容如下需要在范围内拖拉拽,之前看来许多资料觉得都不是特别满足要求,今天自己写了一个,通过监听鼠标按下、鼠标抬起、鼠标移动事件来控制代…

上拉加载更多后台数据_微信小程序端操作云数据库

一、分清几个概念1、云开发,简言之就是可以直接用微信小程序开发者工具完成一个从前台到后台的小程序项目。2、小程序端,使用云开发的时候,miniprogram中写的代码可以叫做小程序端(真实是我不知道可以不可以这么认为)。…