首页 常见问题 集群的最主要瓶颈是什么?

集群的最主要瓶颈是什么?

Aug 20, 2020 pm 04:01 PM
集群

集群的最主要瓶颈是:磁盘。当我们面临集群作战的时候,我们所希望的是即读即得。可是面对大数据,读取数据需要经过磁盘IO,这里可以把IO理解为水的管道。管道越大越强,我们对于T级的数据读取就越快。所以IO的好坏,直接影响了集群对于数据的处理。

集群的最主要瓶颈是什么?

集群的瓶颈提出多种看法,其中网络和磁盘io的争议比较大。这里需要说明的是网络是一种稀缺资源,而不是瓶颈

对于磁盘IO:(磁盘IO:磁盘输出输出)

当我们面临集群作战的时候,我们所希望的是即读即得。可是面对大数据,读取数据需要经过IO,这里可以把IO理解为水的管道。管道越大越强,我们对于T级的数据读取就越快。所以IO的好坏,直接影响了集群对于数据的处理。

这里举几个例子,让大家来参考一下。

案例一

自从使用阿里云以来,我们遇到了三次故障(一、二、三),这三次故障都与磁盘IO高有关。

第一次故障发生在跑zzk.cnblogs.com索引服务的云 服务器上,当时的Avg.Disk Read Queue Length高达200多;

第二次故障发生在跑images.cnblogs.com静态文件的云服务器上,当时的Avg.Disk Read Queue Length在2左右(后来分析,对于图片站点这样的直接读文件进行响应的应用,Disk Read Queue Length达到这个值会明显影响响应速度);

第三次故障发生在跑数据库服务的云服务器上,当时的Avg. Disk Write Queue Length达到4~5,造成很多的数据库写入操作超时。

(这里既提到“硬盘”,又提到“磁盘”,我们这样界定的:在云服务器中看到的硬盘叫磁盘[虚拟出来的硬盘],在集群中的物理硬盘叫硬盘)

这三次的磁盘IO高都不是我们云服务器内的应用引起的,最直接的证据就是将云服务迁移至另一个集群之后,问题立即解决。也就是说云服务器的磁盘IO高是因 为它所在的集群的硬盘IO高。

集群的硬盘IO是集群内所有云服务器的磁盘IO的累加,集群的硬盘IO高是因为集群中某些云服务器的磁盘IO过高。而我们自 己的云服务器内的应用产生的磁盘IO在正常范围,问题出在其他用户的云服务器产生过多的磁盘IO,造成整个集群硬盘IO高,从而影响了我们。

为什么其他云服务器引起的硬盘IO问题会影响到我们?问题的根源就在于集群的硬盘IO被集群中的所有云服务器所共享,而且这种共享没有被有效的限制、没有 被有效的隔离,大家都在争抢这个资源,同时争抢的人太多,就会排长多。

而且对于每个云服务器来说,也不知道有多少台云服务器在争抢,从云服务器使用者的角 度根本无法躲开这个争抢;就像在世博会期间,你起再早去排队,也得排超长的队。

如果每个云服务器使用的硬盘IO资源是被限制或隔离的,其他云服务器产生再 多的磁盘IO也不会影响到我们的云服务器;就像在一个小区,你一个人租了一套房子,其他的一套房子即使住了100人,也不会影响到你。

你可以买到CPU、内存、带宽、硬盘空间,你却买不到一心一意为你服务的硬盘IO,这就是当前阿里云虚拟化平台设计时未考虑到的一个重要问题。

经过与阿里云技术人员的沟通,得知他们已经意识到这个问题,希望这个问题能早日得到解决。
---------------------------------------------------------------------------------------------------------------------------------------
案例2

云计算之路-迁入阿里云后:20130314云服务器故障经过 

首先向大家致歉,这次云服务器故障发现于17:30左右,18:30左右恢复正常,给大家带来了麻烦,请大家谅解!

故障的原因是云服务器所在的集群负载过高,磁盘写入性能急剧下降,造成很多数据库写入操作超时。后来恢复正常的解决方法是将云服务器迁移至另一个集群。

下面是故障发生的主要经过:

今天上午9:15左右一位园友通过邮件反馈在访问园子时遇到502 Bad Gateway错误.

这是由阿里云负载均衡器返回的错误,Tegine是由阿里巴巴开发的开源Web服务器。我们猜测阿里云提供的负载均衡服务可能是通过Tegine反向代理实现的。

这个错误页面表示负载均衡器检测到负载均衡中的云服务器返回了无效的响应,比如500系列错误。

我们将这个情况通过工单反馈给了阿里云,得到的处理反馈是继续观察,可能是这位用户的网络线路的临时问题导致。 

由于我们在这个时间段没遇到这个问题,也没有其他用户反馈这个问题,我们也认可了继续观察的处理方式。

(根据我们后来的分析,出现502 Bad Gateway错误可能是集群出现了瞬时负载高的情况)

下午17:20左右,我们自己也遇到了502 Bad Gateway错误,持续了大约1-2分钟。见下图:

出问题期间,我们赶紧登录到两台云服务器查看情况,发现IIS并发连接数增长至原来的30多倍,而Bytes Send/sec为0,而且两台云服务器都是同样的情况。我们当时推断,这两台云服务器本身应该没有问题,问题可能出在它们与数据库服务器之间的网络通 信。我们继续将这个情况通过工单反馈给阿里云。

刚把工单填好,我们就接到园友的电话反馈说博客后台不能发布文章,我们一测试,果然不能发布,报数据库超时错误,见下图:

打开现有的文章速度很快,也就是说读正常,写有问题。赶紧登录数据库服务器通过性能监视器查看磁盘IO情况,果然磁盘写入性能有问题,见下图:

Avg. Disk Write Queue Length超过1就说明有问题了,现在平均已经到了4~5。进入阿里云网站上的管理控制台一看,磁盘IO问题就更明显了,见下图:

继续向阿里云反馈情况,得到的反馈是这台云服务器IOPS太高了,见下图:

于是,阿里云工作人员将这台云服务器迁移至另一个集群,问题立刻解决。
----------------------------------------------------------------------------------------------------------------------------------------
案例三

14:17左右,我们看到了这条闪存。立即进入博客后台测试,发现提交时会出现如下的错误:

"Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."
这是数据库写入超时的错误,对这个错误信息我们记忆犹新。之前遇到过两次(3月14日、4月2日),都是数据库服务器所在的云服务器磁盘IO问题引起的。

登上云服务器,查看Windows性能监视器,发现日志文件所在的磁盘的IO监测数据Avg.Disk Write Queue Length平均值在5以上。性能监视器中这个值的纵坐标最高值是1,可想而知5是多么高的一个值。性能监视器中的走势图几乎是一条直线。见下图(最高值 竟然达到了20,真恐怖):

(为什么数据库写入超时会表现于日志文件所在的磁盘IO高?因为数据库恢复模式用的是Full,对数据库的数据写入,会先在日志中进行写入操作。)

这次问题与3月14日磁盘IO问题的表现是一样的,所以我们断定这次也是同样的原因,是云服务器所在集群的磁盘IO负载高引起的。
14:19,我们向阿里云提交了工单,特地在标题中加了“紧急”;

14:23,阿里云客服回复说正在核实我们提交的问题;

14:31,阿里云客服回复说已反馈给相关部门检查;

14:42,没有阿里云客服的进一步消息,我们就回复说“如果短时间内解决不了,希望尽快进行集群迁移”(3月14日就是通过集群迁移解决这个问题的,阿里云的技术人员也说过对于集群负载高引起的磁盘IO问题,目前唯一的解决办法就是集群迁移);

14:47,阿里云客服只回复说正在处理;

14:59,还是没消息,我们心急如焚(40分钟过去了,连个说法都没有),在工单中说:“能不能先做集群迁移?”;

然后,接到阿里云客服的电话,说集群中其他云服务器占用的磁盘IO高影响了我们,他们正在处理。。。

过了会,阿里云客服又打电话过来说可能是我们云服务器中的系统或应用导致服务器磁盘写入卡死,让我们重启一下云服务器。(这样的考虑可能是因为这时集群的负载已经降下来,但我们的云服务器磁盘IO还是高。)

15:23左右,我们重启了数据库服务器,但问题依旧。

15:30,阿里云客服终于决定进行集群迁移(从提交工单到决定集群迁移耗时1小10分钟)

15:45,完成集群迁移(上次迁移5分钟不到,这次用了15分钟,这也是阿里云客服所说的进行集群迁移所需的最长时间)

迁移之后,傻眼了,磁盘IO(Avg.Disk Write Queue Length)还是那么高!

为什么这次集群迁移不能像上次那样立即解决问题?我们猜测有两个可能的原因:

1、迁移后所在的集群磁盘IO负载依然高;

2、 云服务器上出现磁盘IO很高的这个分区放的都是数据库日志文件,可能这个时间段日志写入操作比平时频繁(但暴增几乎没有可能)而且所有日志文件在同一个分 区,超过了云服务器磁盘IO的某个极限,造成磁盘IO性能骤降(可能性比较大,依据是云计算之路-入阿里云后:解决images.cnblogs.com 响应速度慢的诡异问题)。虽然之前使用物理服务器时,日志文件也是放在同一个分区,从未出现过这个问题,但现在云服务器的磁盘IO能力无法与物理服务器相 比,而且磁盘IO会被集群上其他云服务器争抢(详见云计算之路-迁入阿里云后:问题的根源——买到她的“人”,却买不到她的“心”)。

不管是哪一个原因,要解决问题只有一招也是最后一招——减轻日志文件所在的磁盘分区的IO压力。

怎么减压呢?根据“迁入阿里云后的一些心得”一文中的“提高整体磁盘IO性能的小偏方”,另外购买一块磁盘空间,然后将存放博文内容的数据库CNBlogsText(大文本数据写入,对磁盘IO产生的压力很大)的日志文件移至独立的磁盘分区。

在SQL Server中,无法在线完成将数据库日志文件从一个磁盘分区移至另一个磁盘分区。需要先detach数据库,然后将日志文件复制至目标分区,然后再attach这个数据库;在attach时,将日志文件的位置修改为新的路径。

于是,在别无选择的情况下,我们CNBlogsText数据库进行detach操作,并且选择了drop connections,哪知在detach的过程中悲剧发生了,detach失败了,错误是:

Transaction (Process ID 124) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

在 detach的过程中竟然发生了死锁,然后“被牺牲”了。让人困惑的是,不是drop connections吗,怎么还会发生死锁?可能drop connections是在detach操作正式开始前,在detach的过程中,还会发生数据库写入操作,这时的写入操作引发了deadlock。为什 么偏偏要让detach牺牲?不合情理。

detach失败后,CNBlogsText数据库就处于Single User状态。继续detach,同样的错误,同样的“被牺牲”。

于是,重启了一下SQL Server服务。重启之后,CNBlogsText数据库的状态变为了In Recovery。

这时时间已经到了16:45。

这样的In Recovery状态以前没遇到过,不知如何处理,也不敢轻举妄动。

过了一段时间,刷新了一下SQL Server的Databases列表,CNBlogsText数据库又显示为之前的Single User状态。(原来重启SQL Server之后,会自动先进入In Recovery状态,再进入到Single User状态)

针对Single User状态问题,在工单中咨询了阿里云客服,阿里云客服联系了数据库工程师,得到的建议是进行这样的操作:alter database $db_name SET multi_user

于是,执行了这样的SQL:

exec sp_dboption 'CNBlogsText', N'single', N'false'
登录后复制
登录后复制

出现错误提示:

Database 'CNBlogsText' is already open and can only have one user at a time.
登录后复制

Single User状态依旧,出现这个错误可能是因为这个数据库不断地有写入操作,抢占着Single User状态下只允许唯一的数据库连接。

(更新:后来从阿里云DBA那学习到解决这个问题的方法:

select spid  from sys.sysprocesses where dbid=DB_ID('dbname');
--得到当前占用数据库的进程id
kill [spid]
go
alter login [username] disable --禁用新的访问
go
use cnblogstext
go
alter database cnblogstext set multi_user with rollback immediate
go
登录后复制


当时的情形下,我们不够冷静,急着想完成detach操作。觉得屏蔽CNBlogsText数据库的所有写入操作可能需要禁止这台服务器的所有数据库连接,这样会影响整站的正常访问,所以没从这个角度下手。
这时时间已经到了17:08。
我们也准备了最最后一招,假如实在detach不了,假如日志文件也出了问题,我们可以通过数据文件恢复这个数据库。这个场景我们遇到过,也实际成功操作过,详见:SQL Server 2005数据库日志文件损坏的情况下如何恢复数据库。所需的SQL语句如下:

use master 
alter database dbname set emergency 
declare @databasename varchar(255) 
set @databasename='dbname' 
exec sp_dboption @databasename, N'single', N'true' --将目标数据库置为单用户状态 
dbcc checkdb(@databasename,REPAIR_ALLOW_DATA_LOSS) 
dbcc checkdb(@databasename,REPAIR_REBUILD) 
exec sp_dboption @databasename, N'single', N'false'--将目标数据库置为多用户状态
登录后复制

即使最最后一招也失败了,我们在另外一台云服务器上有备份,在异地也有备份,都有办法恢复,只不过需要的恢复时间更长一些。

想到这些,内心平静了一些,认识到当前最重要的是抛开内疚、紧张、着急,冷静面对。

我们在工单中继续咨询阿里云客服,阿里云客服联系了数据库工程师,让我们加一下这位工程师的阿里旺旺。

我们的电脑上没装阿里旺旺,于是打算自己再试试,如果还是解决不了,再求助阿里云的数据库工程师。

在网上找了一个方法:SET DEADLOCK_PRIORITY NORMAL(来源),没有效果。

时间已经到了17:38。

这时,我们冷静地分析一下:detach时,因为死锁“被牺牲”;从单用户改为多用户时,提示“Database 'CNBlogsText' is already open and can only have one user at a time.”。可能都是因为程序中不断地对这个数据库有写入操作。试试修改一下程序,看看能不能屏蔽所有对这个数据库的写入操作,然后再将数据库恢复为多 用户状态。

修改好程序,18:00之后进行了更新。没想到更新之后,将单用户改为多用户的SQL就能执行了:

exec sp_dboption 'CNBlogsText', N'single', N'false'
登录后复制
登录后复制

于是,Single User状态消失,CNBlogsText数据库恢复了正常状态,然后尝试detach,一次成功。

接着将日志文件复制到新购的磁盘分区中,以新的日志路径attach数据库。attach成功之后,CNBlogsText数据库恢复正常,博客后台可以正常发布博文,CNBlogsText数据库日志文件所在分区的磁盘IO(单独的磁盘分区)也正常。问题就这么解决了。

当全部恢复正常,如释重负的时候,时间已经到了18:35。

原以为可以用更多的内存弥补云服务器磁盘IO性能低的不足。但万万没想到,云服务器的硬伤不是在磁盘IO性能低,而是在磁盘IO不稳定。

更多相关知识,请访问:PHP中文网

以上是集群的最主要瓶颈是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

节点从Proxmox VE彻底撤离及再次加入集群 节点从Proxmox VE彻底撤离及再次加入集群 Feb 21, 2024 pm 12:40 PM

节点从ProxmoxVE彻底撤离及再次加入集群场景描述当ProxmoxVE集群中有节点损坏无法快速修复时,需要将故障节点干净的从集群踢出,并把残留信息清理干净。否则,新的节点用故障节点曾使用用的IP的地址将不能正常加入集群;同样,从集群中脱离出来的故障节点修复后,虽然与集群已经毫无关系,但访问此单节点的Web管理后台,将出现原ProxmoxVE集群其它节点的信息,非常恼火。从集群中驱逐节点如果ProxmoxVE是Ceph超融合集群,需要登录集群任意节点(欲删除节点除外)宿主系统Debian,命令

如何使用Docker进行多节点集群的管理和扩容 如何使用Docker进行多节点集群的管理和扩容 Nov 07, 2023 am 10:06 AM

在当今云计算时代,容器化技术已经成为开源界最受欢迎的技术之一。Docker的出现使得云计算变得更加便捷、高效,成为了开发人员、运维人员不可或缺的工具。而多节点集群技术的应用更是在Docker的基础上被广泛使用。通过多节点集群部署,我们可以更加有效地利用资源,提高可靠性和可扩展性,同时也能更加灵活地进行部署和管理。接下来,我们将为大家介绍如何使用Docker进

PHP高并发环境下数据库的优化方法 PHP高并发环境下数据库的优化方法 Aug 11, 2023 pm 03:55 PM

PHP高并发环境下数据库的优化方法随着互联网的快速发展,越来越多的网站和应用程序需要面对高并发的挑战。在这种情况下,数据库的性能优化变得尤为重要,尤其是对于使用PHP作为后端开发语言的系统来说。本文将介绍一些在PHP高并发环境下数据库的优化方法,并给出相应的代码示例。使用连接池在高并发环境下,频繁地创建和销毁数据库连接可能会导致性能瓶颈。因此,使用连接池可以

php常见的集群有哪些 php常见的集群有哪些 Aug 31, 2023 pm 05:45 PM

php常见的集群有LAMP集群、Nginx集群、Memcached集群、Redis集群和Hadoop集群。详细介绍:1、LAMP集群,LAMP是指Linux、Apache、MySQL和PHP的组合,是一种常见的PHP开发环境,在LAMP集群中,多个服务器运行相同的应用程序,并通过负载均衡器将请求分发到不同的服务器上;2、Nginx集群,Nginx是一种高性能的Web服务器等等。

如何使用MongoDB实现数据的集群和负载均衡功能 如何使用MongoDB实现数据的集群和负载均衡功能 Sep 19, 2023 pm 01:22 PM

如何使用MongoDB实现数据的集群和负载均衡功能引言:在当今大数据时代,数据量的快速增长对数据库的性能提出了更高的要求。为了满足这些要求,数据的集群化和负载均衡成为了不可或缺的技术手段。MongoDB作为一种成熟的NoSQL数据库,提供了丰富的功能和工具来支持数据的集群和负载均衡。本文将介绍如何使用MongoDB实现数据的集群和负载均衡功能,并提供具体的代

Workerman文档中的服务器集群实现方法 Workerman文档中的服务器集群实现方法 Nov 08, 2023 pm 08:09 PM

Workerman是一个高性能的PHPSocket框架,可以使PHP更加高效地处理异步网络通信。在Workerman的文档中,有关于服务器集群实现方法的详细说明和代码示例。为了实现服务器集群,首先需要明确服务器集群的概念。服务器集群是将多台服务器连接到一个网络中,通过共享负载和资源,提高系统的性能、可靠性和可扩展性。在Workerman中,可以通过以下两种

什么Linux服务器集群系统?包括哪些组件? 什么Linux服务器集群系统?包括哪些组件? Feb 22, 2024 pm 07:55 PM

  Linux,全称GNU/Linux,是一种类似Unix的操作系统,可以免费使用,自由传播。它是一个基于POSIX的多用户、多任务、多线程、多CPU的操作系统。那么Linux服务器集群系统是什么?其主要包括哪些组件?以下是具体内容介绍。Linux服务器集群系统是建立在Linux操作系统基础上的分布式计算环境,由多个独立的服务器节点构成,这些节点通过高速网络相互连接,协同完成各种计算任务。集群系统具有高可靠性、高性能和可扩展性,能够为用户提供稳定而强大的服务支持。通过集群系统,服务器可以有效地分

如何配置MySQL数据库的集群环境? 如何配置MySQL数据库的集群环境? Jul 12, 2023 pm 02:52 PM

如何配置MySQL数据库的集群环境?引言:随着互联网的发展和数据量的不断增长,数据库成了每个企业都必备的核心系统之一。同时,为了保证数据的高可用性和读写性能的需求,数据库集群环境逐渐成为企业的选择。本文将介绍如何配置MySQL数据库的集群环境,并提供相应的代码示例。一、环境准备在配置MySQL数据库的集群环境之前,我们需要确保以下环境准备工作已经完成:安装M