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,一经查实,立即删除!

相关文章

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

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

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. 评估模型…

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系统数据库&…

svn新建仓库

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

MySql数据库索引原理

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

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

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

mysql + keepalived高可用

1上次说过了mysql的主从配置 tar zxf keepalived-1.2.7.tar.gz cd keepalived-1.2.7 yum install gcc gcc-c yum install kernel-devel -y 2报错 configure: error: Popt libraries is required yum install popt-devel 3继续执行 ./configure --with-kernel-dir/usr/src/kerne…

java+向前进一_Java 线程基础

前言线程并发系列文章:熟练掌握线程原理与使用是程序员进阶的必经之路,网上很多关于Java线程的知识,比如多线程之间变量的可见性、操作的原子性,进而扩展出的Volatile、锁(CAS/Synchronized/Lock)、信号量等知识。有些文章只说笼统…

电子报账系统源码_网上商城系统建设心得,轻松搞定选择困难

当前,我们正处于一个互联网飞速发展的时代,特别是互联网电商的出现,给我们的生活带来了翻天覆地的变化,不出家门便可购买各种商品,不用再到处奔走寻找,通过网络便可快速下单,然后坐等送货上门。…

源码安装httpd

1 tar -xvf apr-1.7.0.tar.gz tar -xvf apr-util-1.6.1.tar.gz tar -xvf httpd-2.2.6.tar.gz 2cd apr-1.7.0 ./configure Make Make install 3cd apr-util-1.6.1 ./configure --with-apr/usr/local/apr 解决rpm -ivh libexpat-devel-2.2.4-alt1.i586.rpm tar -xvf expat-2.2…

python如何运行py程序_如何用Python汇款:Web3.py教程

Python开发人员对于以太坊和区块链库的技术练习。警告:下面的教程包含这些元素:显式加密、点对点金融服务以及可能的违规行为。这些例子仅仅是为了说明Python区块链的强大功能和便捷性。嗨,Pythoners,你们好!我真的很喜…

基于域名的apache服务器

1承接上个博客说的&#xff0c;咱们继续扩展 Cd /usr/local/apache2/conf /usr/local/apache2/conf/extra扩展文件 Vi httpd-vhosts.conf <VirtualHost *:80> ServerAdmin 1327629137qq.com DocomentRoot “/data/webapps/www1” ServerName www.wugk1.com <Directory…

MySQL 数据库修改登录密码

MySQL 数据库修改登录密码、、 -------- mysql修改密码 默认的密码为空&#xff1a;mysql -u root -p第一次更改密码&#xff1a;mysqladmin -uroot -p password xhyEnter password: xhy 第二次更改密码&#xff1a; mysqladmin -uroot -pxhy password xhy1mysql -u root -p En…

python列表统计每个元素出现次数_python 统计list中各个元素出现的次数的几种方法...

利用字典dict来完成统计举例&#xff1a;a [1, 2, 3, 1, 1, 2]dict {}for key in a:dict[key] dict.get(key, 0) 1print dict输出结果&#xff1a;>>>{1: 3, 2: 2, 3: 1}利用Python的collection包下Counter的类举例&#xff1a;from collections import Countera …

raid5需要几块硬盘_Raid5磁盘阵列数据恢复思路分析--附真实案例

1.raid5磁盘阵列数据恢复思路分析Raid5磁盘阵列是一种相对安全的磁盘阵列形式&#xff0c;数据分布状态有点类似于raid0磁盘阵列。但是raid5阵列比raid0阵列更为安全的一点就是阵列的每一组平行数据块中都包含了一个校验块&#xff0c;校验块的作用主要表现在阵列有一块硬盘掉线…

Linux思维导图之sed、实战习题

命令解释&#xff1a; ◆sed 2p /etc/passwd第二行打印了两次其余一次 ◆sed-n 2p /etc/passwd 只打印出第二行 ◆sed-n 1,4p /etc/passwd 只打印出1到4行 ◆sed-n /root/p /etc/passwd只打印出root的行 ◆ sed-n 2./root/p /etc/passwd打印从2行开始往下到root行 ◆sed-n /^$/…

jenkins安装(1)

1先在互联网上输入jenkins.io 2下载jenkins.war 3上传到服务器上 安装jdk前面的博客已经说过了 4 Jenkins requires Java versions [8, 11] but you are running with Java 1.7 from /usr/java/jdk1.7.0_06/jre java.lang.UnsupportedClassVersionError: 51.0 at Main.verifyJa…

jenkins安装(用户配置)(2)

1安装rebulider&#xff08;再次构建可以少写很多参数&#xff09;插件 2安装safe restart安全重启 3系统管理—Configure Global Security—安全矩阵 添加admin用户给与全部权限 4系统管理—管理用户—添加用户 给与用户所有权限&#xff0c;取消第一个勾选&#xff0c;不给予…