记一次ES日志系统的接入
程序员文章站
2022-05-28 11:02:40
...
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%。
上一篇: 深入理解position: fixed