欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记一次ES日志系统的接入

程序员文章站 2022-05-28 11:02:40
...

记一次ES日志系统的接入

0 - 前言
近期接了一个新项目,某部门的日志要从HDFS迁移到ES中,每天15T,保留15天,每天有150亿条数据写入,这对于我们现有集群吞吐量是一个很大的挑战。

1 - 现状
目前默认ES集群采用3 master、3 data的结构。数据节点服务器:

CPU: 24 核、Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz
MEM:128G
Disk: Intel 4510 * 4 单盘挂载

默认集群可承载25w/s的请求,index速度可以达到120w/s,吞吐量最大可到25MB/s。如果每天有150亿的写入,QPS在20w左右,默认的集群配置可以接受,但是,问题出在了Logstash上。

我们的离线日志接入流程是:

Log file -> Flume -> Kafka -> Logstash -> ES

我们使用40 Cores Intel® Xeon® CPU E5-2650 v3 @ 2.30GHz的机器来做Logstash节点(内存> 64G),发现消费速度仅为1w/s,仅是实际值的5%。

于是,我们调整Logstash配置,加大pipeline参数:

pipeline.workers: 40
pipeline.batch.size: 500
pipeline.batch.delay: 10

此时,写入量达到了2w/s,但还是不够。接下来,我们只好通过水平扩展Logstash节点来增加吞吐量,结果还是比较喜人的,机器数量和吞吐量呈线性增长。但是耗费的机器数量也是巨大的,常态需要10台左右,为防止业务激增,需要准备至少20台服务器。用这么多机器来做一个离线日志系统,显然不太合理。

于是,机器不够,人工来凑,我们开始对ES集群进行针对性优化。

日志数据允许丢失,我们关掉了副本,只保留主分片;
为了增加吞吐量,刷新间隔增加到了100s;
为了降低translog占用的资源,增大了缓存的日志大小、调整了刷新间隔和方法;
具体索引配置如下:

"index.refresh_interval":"100s",
"number_of_replicas": 0,
"translog.flush_threshold_size": "1024mb",
"translog.sync_interval": "100s",
"translog.durability": "async",
"merge.scheduler.max_thread_count": "1",
"merge.policy.max_merged_segment": "2gb"

经过一番折腾,耗费的服务器减少了一半,吞吐量增加了30%。

记一次ES日志系统的接入

相关标签: 最新技术分享