HighLoad ++,Mikhail Makurov,Maxim Chernetsov(Intersvyaz):Zabbix,一台服务器上的100kNVPS

接下来的高负荷++会议将在圣彼得堡详情和门票举行2020年4月6日和7日在这里。 HighLoad ++莫斯科2018。莫斯科大厅。 11月9日,下午3点摘要和介绍



*监控-在线和分析。
* ZABBIX平台的主要限制。
*用于扩展分析存储的解决方案。
* ZABBIX服务器优化。
* UI优化。
*具有超过40k NVPS负载的操作系统经验。
*简要结论。

Mikhail Makurov(以下简称MM): -大家好!

马克西姆·切尔涅佐夫(Maxim Chernetsov,以下简称MCH):下午好!

MM: -让我介绍一下Maxim。 Max是一位才华横溢的工程师,是我认识的最好的网络专家。 Maxim处理网络和服务及其开发和运营。



MCH: -我想谈谈Michael。迈克尔是一名C开发人员。他为我们公司写了一些高负载的流量处理解决方案。我们在车里雅宾斯克的重农城市乌拉尔(Urals)生活和工作,在Intersvyaz公司工作。我们公司为16个城市的100万人提供互联网和有线电视服务。

MM:-值得一提的是,Intersvyaz不仅仅是一家提供商,而是一家IT公司。我们的大多数决定都是由我们的IT部门做出的。

答:从处理流量的服务器到呼叫中心和移动应用程序。IT部门大约有80人,他们的能力非常不同。

关于Zabbix及其架构


MCH: -现在我将尝试建立个人记录并在一分钟内说出Zabbix是什么(以下简称为Zabbiks)。

Zabbix将自己定位为企业级别的“开箱即用”的监视系统。它具有许多简化生活的功能:高级升级规则,用于集成,对主机和指标进行分组和自动检测的API。在Zabbix中,有所谓的缩放工具-代理。Zabbix是一个开源系统。

简要介绍建筑。我们可以说它由三个部分组成:



  • 服务器。它是用C编写的。流之间的信息处理和传输相当复杂。所有处理都在其中进行:从接收到保存到数据库。
  • 所有数据都存储在数据库中。Zabbix支持MySQL,PostreSQL和Oracle。
  • Web界面是用PHP编写的。在大多数系统上,它带有Apache服务器,但是在nginx + php捆绑包中可以更有效地工作。

今天,我们想从公司的一生中讲述一个与Zabbix相关的故事...

Intersvyaz公司的生活故事。我们有什么,需要什么?



5或6个月前。下班后……

MCH: -Misha,您好!很高兴我设法抓住了您-进行了交谈。我们再次遇到监控问题。在重大事故中,一切都变慢了,并且没有有关网络状态的信息。不幸的是,这不是第一次重复。我需要你的帮助。让我们在任何情况下都能进行监控!

MM: -但让我们先进行同步。我好几年没去那里了。据我记得,我们在八年前拒绝了Nagios并改用Zabbix。现在,我们似乎拥有6台功能强大的服务器和大约十二个代理。我有什么困惑吗?

妇幼保健:-差不多了15台服务器,其中一些是虚拟机。最重要的是,这在我们最需要的时候并不能挽救我们。就像是意外-服务器正在减速,看不到任何东西。我们试图优化配置,但这不能获得最佳性能。

MM: -我明白了。你看了什么,从诊断中发现了什么吗?

妇幼保健:-您要做的第一件事就是数据库。MySQL一直处于不断加载状态,保留了新的指标,当Zabbix开始生成一堆事件时,数据库实际上会进入几个小时。我已经告诉过您有关优化配置的信息,但是从字面上看,今年我们更新了硬件:服务器和SSD RAID-ahs上的磁盘阵列上有超过100 GB的内存-线性增长是没有意义的。我们做什么?

MM: -我明白了。通常,MySQL是一个LTP数据库。显然,它不再适合于存储我们这样大小的指标的档案。让我们弄清楚。

MCH: -加油!

hackathon的结果使Zabbix和Clickhouse集成


一段时间后,我们收到了有趣的数据:



数据库中的大部分空间都被度量标准档案所占用,不到1%的空间用于配置,模板和设置。到那时,一年多以前,我们一直在运行基于Clickhouse的大数据解决方案。运动的方向对我们来说很明显。在我们的春季Hackathon上,他为服务器和前端编写了Zabbix与Clickhouse的集成。当时,Zabbix已经支持ElasticSearch,因此我们决定进行比较。



比较Clickhouse和Elasticsearch


MM: -为了进行比较,我们生成了与Zabbix服务器相同的负载,并研究了系统的行为。我们使用CURL批量写入了1000行数据。之前我们曾建议Clickhouse可以像Zabbix一样有效地处理负载配置文件。结果甚至超出了我们的预期:



在相同的测试条件下,Clickhouse写入的数据量是原来的三倍。同时,两个系统在读取数据时都非常高效地消耗了资源(少量资源)。但是“ Elastix”在录制时需要大量处理器:



总体而言,Clickhouse在处理器消耗和速度上都大大超过了Elastix。同时,由于数据压缩,“ Clickhouse”在硬盘上的使用减少了11倍,磁盘操作减少了约30倍:



MCH: -是的,在“ Clickhouse”使用磁盘子系统非常有效。在此基础上,您可以使用巨大的SATA磁盘,并获得每秒数十万行的写入速度。该系统“开箱即用”支持分片,复制,它很容易配置。我们对其运作一年感到非常满意。

为了优化资源,您可以在现有主要基础旁边安装“ Clickhouse”,从而节省了大量的处理器时间和磁盘操作。我们将指标的存档取出到现有的“ Clickhouse”集群中:



我们卸载了主要的MySQL数据库,以至于我们可以将它与Zabbix服务器结合在同一台机器上,并放弃MySQL专用服务器。

Zabbix中的轮询工作如何?


4个月前

MM: -好吧,您可以忘记底座的问题吗?

MCH: -可以肯定!我们需要解决的另一个问题是数据收集速度慢。现在,我们所有的15个代理都被SNMP和轮询过程超载。而且没有什么比建立新的和新的服务器。

MM: -太好了。但首先请告诉我Zabbix中的轮询工作原理。

MCH: -简而言之,有20种类型的指标以及十二种获取方法。 Zabbix可以以“请求-响应”模式收集数据,也可以通过“陷阱器接口”获取新数据。



值得注意的是,在最初的Zabbix中,此方法(Trapper)是最快的。

有用于负载平衡的代理:



代理可以执行与Zabbix服务器相同的收集功能,从中接收任务并通过Trapper接口发送收集的指标。这是官方推荐的负载平衡方法。此外,代理对于监视通过NAT或慢速通道运行的远程基础结构很有用:



MM: -架构清晰明了。我们必须看一下源……

几天后

Nmap Fping如何获胜的故事


MM: -好像我挖了东西。

MCH: -告诉我!

MM: -我发现在可用性检查期间,Zabbix一次最多检查128台主机。我试图将此数字增加到500,并删除了ping之间的数据包间间隔(ping),这使性能提高了两倍。但是我想要大数目。

MCH: -在我的实践中,有时我需要检查成千上万台主机的可用性,而且没有比nmap更快的速度了。我相信这是最快的方法。试试吧!您需要在一次迭代中显着增加主机数量。

MM: -检查五百多张? 600?

妇幼保健中心: -至少几千。

MM:- 好的。我想说的最重要的事情是:我发现Zabbix中的大多数轮询都是同步进行的。我们必须异步重做它。然后,我们可以显着增加轮询者收集的度量标准数量,尤其是如果我们在一次迭代中增加度量标准数量时。

MCH: -太好了!什么时候?

MM: -和往常一样,昨天。

MCH: -我们比较了fping和nmap的两种版本:



在大量主机上,nmap的效率有望提高五倍。由于nmap仅检查可用性和响应时间的事实,因此我们将损失计算转移到触发器,并显着缩短了可用性检查间隔。我们发现,nmap的最佳主机数量为每次迭代约4000个。Nmap使我们可以将可用性检查的CPU成本减少三倍,并将间隔从120秒减少到10秒。

轮询优化


MM: -然后我们参加了投票站。我们主要对SNMP删除和代理感兴趣。在Zabbix,同步进行轮询并采取了特殊措施以提高系统效率。在同步模式下,主机不可用会导致严重的轮询性能下降。有一个完整的状态系统,有特殊的过程-只能与无法访问的主机一起工作的所谓的unreachable-pollers:



这是一个注释,它说明了状态矩阵,过渡系统的复杂性,该系统必须保持有效。另外,同步轮询本身相当慢:



这就是为什么十几个代理上的数千个轮询器线程无法为我们收集必要数量的数据的原因。异步实现不仅解决了线程数量的问题,而且还大大简化了无法访问的主机的状态系统,因为对于一次轮询的一次迭代检查的任何数量,最大等待时间为1个超时:



此外,我们修改并改进了SNMP-的轮询系统查询。事实是,大多数不能同时响应多个SNMP请求。因此,当同一主机的SNMP轮询异步执行时,我们采用了混合模式:



这是对整个主机捆绑包完成的。最终,此模式不会比完全异步慢,因为轮询一百个SNMP值仍然比1次超时快得多。

我们的实验表明,使用SNMP轮询,一次迭代中的最佳请求数约为8 000。总体而言,向异步模式的转换使轮询性能提高了200倍,几百倍。

MCH: -获得的轮询优化表明,我们不仅可以摆脱所有代理,而且可以减少许多检查的间隔,并且不需要代理作为分担负载的一种方式。

大约三个月前

更改架构-增加负载!


MM: -好吧,马克斯,是时候提高工作效率了吗?我需要功能强大的服务器和优秀的工程师。

MCH: -好,我们计划。现在该以每秒5,000个指标起步了。MCH

升级后的早晨

-Misha,我们进行了更新,但在早晨回滚了……您猜您达到了什么速度?

MM: -上限为20。

MCH: -是的,25岁!不幸的是,我们是从这里开始的。

MM: -那么呢?您有诊断信息吗?

MCH: -是的,当然!例如,在这里,一个有趣的顶部:



MM: -让我们看看。我看到我们尝试了大量的轮询线程:



但是,与此同时,我们甚至无法中途使用该系统:



而且总体性能很小,大约每秒4000个指标:



还有其他东西吗?

MCH: -是的,其中一个投票者的痕迹:



MM: -在这里可以清楚地看到,投票过程正在等待“信号量”。这些是锁:



MCH: -尚不清楚。

MM: -看,这就像是一堆线程试图使用一次只能使用一个资源的资源的情况。然后,他们所能做的就是按时间共享该资源:使用这种资源



的总生产率受到一个核心速度的限制:有



两种方法可以解决此问题。

升级机器熨斗,切换到更快的内核:



或更改架构,并同时更改负载:



MCH: -顺便说一句,我们在测试机上使用的内核要比战斗机少,但每个内核的频率要快1.5倍!

MM: -清楚吗?有必要查看服务器代码。

Zabbix服务器中的数据路径


MCH: -要了解,我们开始分析Zabbix服务器内部数据的传输方式:



很酷的图片,对吧?让我们逐步地逐步进行澄清。有负责数据收集的流和服务:



它们通过套接字将收集的度量传递到预处理器管理器,并在队列中排队:



预处理器管理器”将数据传递给执行预处理指令的工作人员,并通过同一套接字将其返回:



之后,预处理器-manager将它们保存在历史记录缓存中:



从那里开始,它们由历史同步器执行,这些历史同步器执行许多功能:例如,计算触发器,填充值缓存以及最重要的是将指标保存在历史存储中。通常,该过程很复杂并且非常混乱。



MM: -我们看到的第一件事是,大多数线程都在争夺所谓的“配置缓存”(存储所有服务器配置的内存区域)。特别是由负责数据收集的流进行了很多锁定:



...由于配置不仅存储度量及其参数,还存储队列,轮询器从队列中获取有关下一步操作的信息。当轮询器很多,并且其中一个阻止配置时,其余轮询器正在等待请求:



轮询者不得冲突




因此,我们要做的第一件事是将队列分为4个部分,并允许轮询者安全地同时阻塞这些队列,这些部分:



这消除了对配置缓存的竞争,并且轮询者的速度大大提高了。但是随后我们面临着这样的事实,即预处理器管理器开始积累作业队列:



预处理程序管理器应该能够确定优先级


当他缺乏生产力时,发生了这种情况。然后,所有他能做的就是从数据收集过程累积的请求,直到他吃了所有的内存和崩溃添加其缓冲:



为了解决这个问题,我们增加了第二个插座,这是工人专门分配:



因此,预处理程序经理有机会确定工作的优先级,如果缓冲区增加,任务就是减慢进餐速度,使工人有机会拾起这个缓冲区:



然后,我们发现减缓的原因之一是因为工人自己在竞争 是他们工作的重要资源。我们使用错误修复注册了此问题,并且在新版本的Zabbix中已解决了该问题:



我们增加了套接字数量-得到了结果


而且,预处理器管理器本身是一个狭窄的链接,因为它是一个单线程。它依赖于内核的速度,最大速度为每秒约7万个指标:



因此,我们用四组套接字(工人)制作了四个:



并允许我们将速度提高到约13万个指标:



增长非线性是由于存在对缓存的竞争而造成的故事。对他来说,有4位预处理器经理和历史悠久的合成器竞争。至此,我们在一台测试机上每秒收到约13万个指标,在处理器上的利用率约为95%:



大约2.5个月前

拒绝使用snmp-community使NVP增加了一半半


MM: -Max,我需要一台新的测试机!我们不再适合当前的。

MCH: -现在是什么?

MM: -现在-13万个NVP和一个“机架”处理器。

MCH: -哇!凉!等等,我有两个问题。根据我的计算,我们的需求约为每秒15至2万个指标。为什么我们需要更多?

MM: -我想完成这项工作。我想看看我们可以从这个系统中挤出多少。

MCH: -但是...

MM: -但这对企业毫无用处。

MCH: -我知道了。第二个问题:我们现在拥有什么,在没有开发人员帮助的情况下,我们能否自立?

MM:- 我不这样认为。更改配置缓存是个问题。它处理大多数线程中的更改,并且难以维护。最有可能的是,支持她将非常困难。

MCH: -那么您需要某种替代方法。

MM: -有这样的选择。在放弃新的锁定系统的同时,我们可以切换到快速核心。我们仍然可以获得60-80000个指标的性能。在这种情况下,我们可以保留其余代码。 Clickhouse,异步轮询将起作用。而且它很容易维护。

MCH: -太好了!我建议对此进行详细说明。

在优化服务器端之后,我们终于能够将新代码运行到生产中。我们放弃了部分更改,而是转而使用具有快速内核的计算机并最大程度地减少了代码更改的次数。我们还简化了配置,并在可能的情况下放弃了数据元素中的宏,因为它们是附加锁的来源。



例如,在文档和示例中经常发现对snmp-community宏的拒绝,在我们的情况下,这使我们能够将NVP的速度提高大约1.5倍。

生产两天后

删除事件历史记录弹出窗口


MCH: -Misha,我们使用系统两天了,一切正常。但是只有当一切正常时!我们已经计划了转移足够大的网络部分的工作,然后我们再次动手检查了它是否已经崛起了。

MM: -不可能!我们检查了十次。服务器甚至可以立即处理完全的网络不可访问性。

MCH: -是的,我了解所有内容:服务器,数据库,顶部,austat,日志-一切都很快速...但是我们看一下Web界面,然后在服务器上有处理器“在架子上”,这是



MM: -我知道了。让我们看一下网络。我们发现,在存在大量活动事件的情况下,大多数可操作的小部件开始非常缓慢地工作:



这样做的原因是,弹出列表的生成具有针对列表中每个项目生成的事件的历史记录。因此,我们拒绝生成这些窗口(在代码中注释了5行),这解决了我们的问题。

小部件的加载时间,即使完全无法访问,也从几分钟减少到我们可以接受的10-15秒,并且仍然可以通过单击时间查看历史记录:



下班后。2个月前

MCH: -Misha,你要走吗?我们得谈谈。

MM: -不愿意。Zabbix又有什么用?

MCH: -哦,不,放松!我只想说:一切正常,谢谢!和我一起喝啤酒。

Zabbix有效


Zabbix是一个相当通用且丰富的系统和功能。它可以直接用于小型安装,但是随着需求的增长,必须对其进行优化。要存储大量指标,请使用适当的存储:

  • 您可以以与Elastixerch集成的形式使用内置工具,也可以将历史记录上传到文本文件(可从第四版获得)。
  • 您可以利用我们的经验以及与Clickhouse的集成。

要大大提高收集指标的速度,请异步收集它们,然后通过陷阱接口将其传输到Zabbix服务器。或者您可以将该补丁用于Zabbix本身的异步轮询器。

Zabbix用C编写并且非常有效。几个狭窄的体系结构位置的解决方案可以进一步提高其生产率,并且根据我们的经验,在一台单处理器计算机上可以接收10万多个指标。



相同的Zabbix补丁


MM: -我想补充几点。给出了当前的整个报告,所有测试和编号,用于与我们一起使用的配置。现在,我们每秒从中获取约2万个指标。如果您想了解这是否适合您-您可以进行比较。他们今天谈论的内容作为补丁发布在GitHub上:github.com/miklert/zabbix



该补丁包括:

  • 与Clickhouse完全集成(Zabbix服务器和前端);
  • 与预处理器管理器解决问题;
  • 异步轮询。

该补丁与所有版本4(包括lts)兼容。最有可能的是,只需进行最小的更改,它将在3.4版上运行。

谢谢您的关注。

问题


观众提问(以下简称-A):-下午好!请告诉我,您是否有与Zabbix团队进行深入交流的计划,或者他们与您有紧密的计划,以确保这不是补丁,而是Zabbix的正常行为?

MM: -是的,我们一定会提交部分更改。某些东西将会保留,某些东西将保留在补丁中。

答: -非常感谢您的出色报告!请告诉我,在应用补丁后,Zabbix方面的支持将保留,如何继续升级到更高版本?在将补丁更新至4.2、5.0之后,是否可以更新Zabbix?

MM:-我不能说支持。如果我是Zabbix的技术支持人员,我可能会拒绝,因为这是其他人的代码。对于代码库4.2,我们的立场是:“我们会随着时间的流逝,我们将在下一个版本中进行更新。”因此,一段时间后,我们会将补丁上传到更新版本。我已经在报告中说过:版本的更改数量仍然很少。我认为从3.4到4的过渡大约花了15分钟,那里有些变化,但不是很重要。

答: -因此您计划维护补丁程序,并且可以安全地将其投入生产,以将来以某种方式获取更新?

MM: -我们强烈推荐。这为我们解决了很多问题。

妇幼保健:-再一次,我想强调一点,与架构无关,与锁,队列无关的更改-它们是模块化的,它们在单独的模块中。即使对其进行很小的更改,也可以轻松维护它们。

MM: -如果细节有趣,那么“ Clickhouse”将使用所谓的历史库。它不受限制-这是Elastic支持的副本,即它是可配置的。轮询仅更改轮询器。我们认为这将长期有效。

答: -非常感谢。但请告诉我,是否有所做更改的文档?



MM:-文档是一个补丁。显然,随着“ Clickhouse”的推出以及新型轮询器的出现,新的配置选项出现了。上一张幻灯片中的链接简要说明了如何使用它。

关于使用nmap替换fping


答: -您最终是如何实现的?您能否举一些具体的例子:是您的打包程序和外部脚本吗?最终,如何这么快地签出这么多主机?您如何获得这些主机?MMap是否需要以某种方式喂食它们,从某个地方获取它们,将它们放进去并开始做某事?..

MM:太好了非常正确的问题!关键是这个。我们修改了用于ICMP检查的库(ICMP ping,Zabbix的一部分),该库指示数据包的数量-单位(1),并且代码尝试使用nmap。也就是说,这是Zabbix的内部工作,它已经成为pinger的内部工作。因此,不需要同步器或不使用捕集器。这样做是故意的,以使系统保持一致,而不参与两个基本系统的同步:要检查的内容,通过轮询器填写的内容,以及是否在我们里面填充了内容?..这要容易得多。

答: - 也适用于代理吗?

MM: -是的,但我们没有检查。 Zabbix和服务器中的轮询代码相同。应该管用。我再次强调:系统性能如此,我们不需要代理。

MCH: -这个问题的正确答案是:“为什么您需要使用这种系统的代理?” 仅由于NAT'a或通过慢速通道进行监视...

答: -如果我理解正确,则您将Zabbix用作过敏原。还是您留给另一个系统(例如Grafana)的图形(存档层在哪里)?还是不使用此功能?

MM: -我再次强调:我们已经完全整合。我们将历史记录添加到“ Clickhouse”中,但同时更改了PHP前端。Php-frontend转到“ Clickhouse”,然后从那里进行所有图形处理。老实说,同时,我们有一个部分是根据相同的“ Clickhouse”,相同的Zabbix数据以及其他图形显示系统中的数据构建的。

MCH: -在“ Grafan”中也是如此。

如何做出分配资源的决定?


答: -共享一个内部小厨房。如何做出决定将资源分配给严肃的产品加工的决定?通常,这些是某些风险。并且,请您告诉我,您将要支持新版本:从管理角度来看,该决定如何合理?

MM: -显然,我们没有很好地讲述这个故事的戏剧性。我们发现自己处在必须要做的事情的情况下,基本上执行了两个并行命令:

  • 一个人从事使用新方法启动监视系统的工作:监视即服务,这是我们结合的一组标准开源解决方案,然后尝试更改业务流程以与新监视系统一起工作。
  • 同时,我们有一个热心的程序员(关于他自己)正在这样做。碰巧他赢了。

答: -团队人数是多少?

MCH: -她在你面前。

答: -一如既往,需要激情吗?

MM: -我不知道什么是热情主义者。

答: -在这种情况下,显然是您。非常感谢你,你很酷。

MM: -谢谢。

关于Zabbix的补丁


答: -对于使用代理的系统(例如,在某些分布式系统中),您的决定是否可以改编和打补丁,例如轮询器,代理以及Zabbix本身的预处理器;和他们的互动?是否可以优化具有多个代理的系统的现有开发?

MM: -我知道Zabbix服务器是使用代理组装的(它可以编译并获得代码)。我们没有在产品中对此进行测试。我对此不确定,但是我认为代理中未使用预处理器管理器。代理的任务是从Zabbix获取一组指标,将其填写(还写入配置,本地数据库),然后将其返回给Zabbix服务器。然后,服务器本身将在收到消息时进行预处理。

对代理的兴趣是可以理解的。我们将对此进行验证。这是一个有趣的话题。

答: -想法是这样的:如果可以修补轮询程序,则可以将其修补到代理服务器并修补与服务器的交互,并且预处理器只能在服务器上用于这些目的。

MM: -我认为一切都更加简单。您获取代码,应用补丁,然后根据需要对其进行配置-收集代理服务器(例如,使用ODBC),然后将补丁后的代码分发给系统。必要时-收集代理,必要时-服务器。

答: -另外,您很有可能不必将代理传输修补到服务器。

MCH: -不,这是标准的。

MM:-实际上,其中一个想法没有听起来。我们始终在思想激增,变更数量和支持的便利性之间保持平衡。


一点广告:)


感谢您与我们在一起。你喜欢我们的文章吗?想看更多有趣的资料吗?通过下订单或向您的朋友推荐以支持我们,4.99美元起的面向开发人员的云VPS,这是我们为您发明的入门级服务器 独特模拟产品:关于VPS(KVM)E5-2697 v3(6核)的全部真相10GB DDR4 480GB SSD 1Gbps从$ 19还是如何划分服务器?(RAID1和RAID10提供选件,最多24个内核和最大40GB DDR4)。

阿姆斯特丹的Equinix Tier IV数据中心的戴尔R730xd便宜2倍吗?在荷兰2台Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100电视戴尔R420-2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB-$ 99起!阅读有关如何构建基础设施大厦的信息。使用Dell R730xd E5-2650 v4服务器花费一欧元9000欧元的c类?

Source: https://habr.com/ru/post/undefined/


All Articles