by2,波-周末最适合做的事儿,蹦迪

唯品会日志体系,接受了公司上千个运用的日志,供给了日志快速查询、核算、告警等根底服务,是确保公司技能体系正常运转必不可缺的重要体系之一。日均接入运用日志 600 亿条,紧缩后巨细约 40TB,大促时日志峰值流量到达每分钟 3 亿条。

唯品会日志体系,取名 Dragonfly,涵义像蜻蜓复眼相同,能够依据运用日志既精确又快速的观察到体系的运转细节、并发现体系的任何异动。开端,Dragonfly 是环绕开源的 ELK(Elasticsearch/Logstash/Kibana)技能栈打造的,后来架构不断演进,添加新的功用组件。现在的体系架构如下图所示。


但不管怎样演进,快速、安稳的日志查询始终是日志体系的中心服务地点,因而 Elastic琼州学院教务处search 可谓是 Dragonfly 体系中的中心组件。本文即将点介绍唯品会日志体系有用运用 Elasticsearch 的各种实践经验。

Elasticsearch 简介

朋友圈里这个月最为热议的技能新闻之一,便是 Elastic smutty公司 2018.10.6 在纳斯达克上市,当天开盘后股价就上涨了一倍。将一项技能经过开源不断做大做强,成为无可争议的笔直领域领导者,终究完结上市取得更大开展——Elastic 公司完结了许多软件创业公司的愿望,并供给了一个完美的创业成功模范。而 Elasticsearch 正是这家公司的招牌产品。

Elasticsearch(下面简称 ES)是依据 Apache Lucene 打造的散布式文档存储 + 文本查询引擎。它经过倒排索引 (inverted-index) 技能供给极快速的文本查询和聚合核算功用,经过合理的索引和分片规划,又能够支撑海量的文本信息。因而十分适宜用于建立日志渠道。

尽管如此,将这样一个开源软件,既要能贴合公司内部的实际运用场景,又要做到高吞吐、高容量、高牢靠,仍是需求做不少详尽的作业,下面会一一道来。

Dragonfly 体系从 2015 年开端建立,开端运用 Elasticsearch 1.x,后来升级到 5.6 版别。

硬件装备

Dragonfly 体系在不同机房建立了多个 ES 集群(装备了跨集群查询),共上百台机器,最大的 2 个集群均有挨近 50 台服务器。这些服务器包含了两种硬件装备类型:

  • 一种运用多个 SSD 磁盘,并具有功能微弱的 CPU。 SSD 服务器作为集群中的热数据服务器运用,担任新日志的写入,并供给运用频率最高的最近几天的日志查询温如丰服耶律雪儿务。
  • 另一种运用多个大容量的 HDD/SATA 磁盘,调配较弱的 CPU。 HDD 服务器作为集群中的冷数据服务器运用,担任保存较早前的日志。由于早前的日志拜访频率较低,因而不需求很好的功能,而垂青磁盘容量。

两种类型服务器的磁盘均运用 RAID0 阵列,内存巨细为 64GB 或 128GB。

经过冷热别离,能够确保 ES 集群的写入和实时查询功能,又能在本钱较低的状况下供给较长的日志保存时刻,下面还会详细介绍 ES 集群的冷热别离是怎样完结的。

日志索引办理

ES 中的文档数据是保存在索引 (index) 之中的。索引能够区别多个分片 (shard) 散布在不同的节点上,并经过装备必定的备份数完结高可用。

关于日志数据,一般把每个运用、每天的日志保存到不同的索引中(这是以下许多评论的条件)。要接受公司上千个运用的海量日志,又要应对每个运用每天不同的数据量,怎样有用办理这些日志索引,成为 Dragonfly 能否供给安稳和快速服务的要害。下面将分多个方面为你介绍。你不会在官方文档中直接找到这些常识,它们来源于咱们多年的实战经验。

1. 索引预创立

当有一个写入恳求,而恳求中指定的索引不存在时,ES 会主动创立一个 5 分片的新索引。由于要完结寻觅适宜的节点、创立主分片、创立备份分片、播送新的集群信息、更新字段 map桃乐猪ping 等一系列的操作,创立一个新索引是耗时的。依据集群规划、新索引的分片数量而不同,在咱们的集群中创立一个新索引需求几秒到几十秒的时刻。假如要在新的一天开端的时刻,许多新一天的日志一起到来时触发创立上千个索引,必然会形成集群的长期服务中止。因而,每天的索引有必要提早创立。

此外,还有一个有必要提早创立索引的要害原因,便是 ES 索引的分片数在创立时就有必要给定,不能再动态添加(前期版别还不能削减,ES 5.x 开端供给了 shrink 操作)。在两种状况下会形成问题:

  • 假如某个运用的日志量特别大,假如咱们运用过少的分片数(如默许的 5 个分片),就会形成严峻的热点问题,也便是分配到这个大索引分片的节点,即将处理更多的写入和查询数据量,成为集群的瓶颈。
  • 大部分的运用日志量十分小,假如分配了过多的分片数,就会形成集群需求保护的活泼分片数目很大,在节点间守时同步的集群信息数据也会很大,在集群繁忙北京增福康公司合法吗的时分更简单呈现恳求超时,在集群呈现毛病的时分恢复时刻也更长。

出于以上考虑,有必要提早创立索引,并为不同运用的索引指定适宜的分片数量。分片的数量能够由以下公式核算:

n_shards=avg_index_size/ size_per_shard * magnified_factor

其间:by2,波-周末最适宜做的事儿,蹦迪

  • avg_index_size 为前 N 天这个运用索引巨细的指数移动均匀值(日期越接近、权重越大)
  • size_per_shard 为希望每个分片的巨细。分片过大简单形成上述热点问题,一起 segment merge 操作的开支更大(下面详细介绍),在需求移动分片时耗时也会较久;而过小又会形成集群分片总数过多。因而要选取一个均衡的巨细,咱们运用的是 20GB。
  • magnified_factor 为扩展系数,是咱们依据公司特有的促还珠之推翻香妃销场景引进的。在促销日,事务恳求数会数倍乃至数十倍于平常,日志量也会相应添加,因而咱们需求在促销日为索引添加更多分片数。

索引预创立的操作咱们放在前一天的朝晨(后边会看到,开支很大的操作咱们都放在夜间和清晨)进行。即今日清晨会依据之前索引巨细的 EMA 及上述公式核算出分片数,创立明日的索引。

2. 候补索引

这是很有意思的一个概念,你不会在任何其他 ES 相关的文章找到它(假如有,请留意百分百是抄吉田宗洋袭:)

它处理的是这样的问题:即便咱们现已提早预算出一个运用的日志索引的分片数,可是依然会有反常状况。有时你会发现某个运用某一天的日志遽然添加了许多,或许是开发翻开了 DEBUG 等级开关查问题,也或许在做压测,或许或许是 bug 死循环的打印了许多 stacktrace。有时是一个新接入的运用,由于没有前史索引,所以并不能预算出需求的分片数。以上状况都有或许引起分片数缺乏的问题。

记住上面提到过索引在创立后就不能再动态调整分片数了,怎样破?

让咱们来新创立一个候补索引 (substitude index) 吧,这一天接下来的一切日志都会写到这儿。候补索引的命名,咱们会在原索引名的根底上加上 -subst 后缀,因而用户在查询今日的日志时,查询接口仍能够经过必定的规矩指定一起运用今日的“正选”索引和候补索引。

咱们守时扫描当天索引的均匀分片巨细,一旦发现某个索引的分片巨细过大,就及时创立候补索引。留意,创立候补索引时仍需指定分片数,这是依据当天已曩昔的小时数比上还剩余的小龙之色时数,以及其时火影之瞳术巅峰现已写入的数据量预算得出的。色漫画无翼鸟

候补索引还有一种运用场景。有时促销是在晚上进行的,一到促销开端,恳求量和日志量会呈现一个十分大的尖峰。而由于现已写入了大半天的日志,分片现已比较大,这时任何的写入都或许引起更大规划的 segment merge(了解 ES 的同学会知道,每次 refresh 会生成新的 segment,小的 segment 会不断 merge 变成更大的 segment,越大的 segment merge 时对磁盘 IO 和 CPU 的开支占用越大。这相当于 HBase 的 compaction 行为,也相同会有写扩大问题),会使写入速率受到限制。而假如这时切换到新的索引写入(场上球员请悉数给我下来~),就能够减轻 merge 的影响,对确保流量尖峰时 ES 集群的写入速率十分有协助。

这种促销日的候补索引是提早创立的。分片数的核算、以及还有或许运用到“候补的候补”,就不再赘述了。

3. Foby2,波-周末最适宜做的事儿,蹦迪rce Merge

当数据写入 ES 时先发作小的 segment。segment 会占用堆内存,数量过多对查询时刻也有影响。因而 ES 会按必定的战略进行主动兼并 segment 的动作,这前文现已提过。此外,ES 还供给 force merge 的办法(在前期版别称为 optimize),经过调用此办法能够进一步强化 merge 的作用。

详细的,咱们在清晨履行守时任张舂贤务,对前一天的索引,依照分片巨细以及每个 segment 500MB 的希望值,核算出需求兼并到的 segment 数量,然后履行 force merge。

经过这个操作,咱们能够节约许多堆内存。详细每个节点 segment 的内存占用,能够在 _nodes//stats api 中查看到。当 segment memory 一项占用 heap 巨细 2/3 以上,很简单形成各种 gc 问题。

别的由于 force merge 操作会许多读写磁盘,要确保只在 SSD 服务器上履行。

4. 冷热别离

开端建立 ES 集群时,为了确保读写速率,咱们运用的都是 SSD 类型的服务器。但由于 SSD 磁盘本钱高,容量小,跟着接入运用越来越多,不得不缩短日志保存天数,一度只能供给 7 天的日志,用户开端发作诉苦。

咱们自然而然发作了冷热别离的主意。其时在网上并不能找到 ES 冷热别离布置的事例,但出于从前翻阅过官方文档多遍后对 ES 各种 api 的了解,咱们认为是可行的。

  • 首要,在节点的装备文件中经过 node.tag 特点运用不同的标签能够区别不同类型的服务器(如硬件类型,机柜等);
  • 经过 index.routing.allocation.include/exclude 的索引设置能够指定索引分片只能分配在某种 tag 的服务器上;
  • 运用以上办法,咱们在创立的新的索引时,指定只分配在热数据服务器(SSD 服务器)上。使具有微弱磁盘 IO 和 CPU 功能的热数据服务器接受了新日志的写入和查询;
  • 设置夜间守时使命,将 by2,波-周末最适宜做的事儿,蹦迪N 天前的索引修改为只能分配在冷数据服务器(HDD 服务器)上。使拜访频率下降的索引 relocate 到大磁盘容量的服务器中保存。



经过以上冷热别离的布置办法,咱们只添加了少量大磁盘容量的服务器(本钱比 SSD 类型的服务器还低许多),就将日志保存时长添加到了 30 天,部分运用能够按需保存更长期。

5. 日志归档

从上面能够看出,经过冷热别离,热数据服务器只寄存最近 3 天的日志索引,其他 27 天的索引都寄存在冷数据服务器上。这样的话,冷数据服务器的 segment memory 将十分大,远超越官方文档主张的不超越 32GB 的 heap 装备。假如要添加 heap 到 32GB 以上,会对功能有必定影响。

考虑到越长远的日志,查询的或许性越低,咱们将 7 天曾经的日志进行了归档——也便是 close 索引的操作。close张东健老婆 的索引是不占用内存的,也就处理了冷数据服务器的 heap 运用问题。

Dragonfly 前端铺开放了归档日志办理的页面,用户如需查询 7 天前的日志,能够自助翻开现已归档的日志——也便是从头 open 现已 close 掉的索引。

日志写入降级战略

前面现已提到过,咱们公司促销顶峰时的日志量会到达素日的数十倍。咱们不或许装备满足支撑促销顶峰期日志量的服务器规划,由于那样的话在全年大部分时刻内许多服务器资源是糟蹋的。而在服务器规划有限的状况下,ES 集群的写入才能是有限的,假如不采纳任何办法,在促销顶峰期by2,波-周末最适宜做的事儿,蹦迪、以及如果集群有毛病发作时,接入的日志将发作堆积,然后形成大面积的写入推迟,用户将彻底无法查询最新的日志。此刻假如有事务毛病发作但无法经过日志来剖析的话,问题会十分丧命。

因而就需求有合理的降级办法和预by2,波-周末最适宜做的事儿,蹦迪案,以确保当日志流入速率大于日志写入 ES 集群的速率时,Dragonfly 仍能供给最大极限的服务下一个路口还为你守候。咱们首要需求做出取舍,制定降级服务的方针,终究咱们选用的是:确保各个运用都有部分服务器的日志能够实时查询。

唯品会的日志,是从运用服务器先收集到 Kafka 做缓存的,因而能够在读取 Kafka 数据写入 ES 的过程中做一些处理。严格来说怎样完结这一方针并不归于 Elasticsearch 的领域。

要到达降级服务方针,咱们需求规划一套组合拳:

  • 日志上传到 Kafka 时,运用主机潜泳教育视频名作为 partitioning hash key,即同一台运用服务器的日志会收集到同一个 Kafka topic 的 partition 中;
  • 在消穿越yin线费 Kafka topic 时,运用同一个 consumer group 的多个实例,每个 consumer 实例设置不同上石下水是什么字的处理优先级;
  • 对 Kafka consumer 依照优先级不同,装备不同的写 ES 的线程数。优先级越高,写入线程数越多,写入速率越快;优先级越低,写入线程数越少,乃至暂停写入;
  • 这样就能确保高优先姜小淘级的 consumer 能够实时消费某些 partition 并写入到 ES 中,经过 hashing 收集到那鼠尾蛆些被实时消费的 by2,波-周末最适宜做的事儿,蹦迪partition 的主机日志,也将在 ES 中能够被实时查询;
  • 跟着度过日志流量顶峰,当 ES 集群支撑高优先级 consumer 的日志写入没有压力时,能够逐渐添加次高优先级 consumer 的写入线程数。直到对应 partition 的堆积日志被消费完,又能够对更低优先级的 consumer 进行相同的调整;
  • 终究一切堆积的日志都被消费完,降级完毕。



结语

除了中心组件 Elasticsearch,Dragonfly 日志体系还在日志格局标准、日志收集客户端、查询前端、规矩告警、过错日志反常检测等方面做了许多的作业,有时机再跟我们持续共享。

本文由唯技能大众号(VIP-Tech)授权 InfoQ 中文站转载by2,波-周末最适宜做的事儿,蹦迪。

点击展开全文

上一篇:

下一篇:

相关推荐