【企业级分布式系统】ELK优化

扫测资讯 2024-11-20 12:07   6 0

Elasticsearch作为日志存储时的优化

linux内核优化、JVM优化、ES配置优化、架构优化(filebeat/fluentd代替logstash、加入kafka做消息队列)

优化ES索引设置

(1)优化fsync

  • 背景 :Elasticsearch为保证数据不丢失,会在每次写请求完成后触发fsync将translog中的segment刷到磁盘。这提高了数据安全性,但可能影响性能。
  • 优化建议 :如果允许部分数据丢失以提高效率,可以设置异步刷新translog,并调整相关参数。
    • "index.translog.durability": "async" :设置为异步刷新。
    • "index.translog.flush_threshold_size":"1024mb" :增大translog刷新阈值。
    • "index.translog.sync_interval": "120s" :延长translog同步间隔。

(2)优化refresh

  • 背景 :Elasticsearch通过refresh过程将内存中的数据转换成Lucene的完整segment,以便被搜索。默认1秒后数据可查询,但会产生大量segment,影响检索性能。
  • 优化建议 :对于日志搜索,可以适当增大refresh间隔。
    • "index.refresh_interval":"5s" 或更长,根据实际需求设置。

(3)优化merge

  • 背景 :merge操作会合并segment,优化索引结构。但并发merge可能占用过多资源,影响集群性能。
  • 优化建议 :控制并发的merge线程数,根据存储类型和CPU核数调整。
    • "index.merge.scheduler.max_thread_count":"1" :对于普通磁盘,设置为1以减少IO堵塞。

(4)实施优化

  • 需要先关闭索引,修改设置后再打开。
  • 使用curl命令进行索引的关闭、设置修改和打开操作。

优化线程池配置

  • 背景 :write线程池满负荷时可能导致数据写入拒绝。
  • 优化建议
    • 将线程数改为CPU总核数加1。
    • 增大队列容量以缓冲任务,但避免过大导致堆内存占用过多。
  • elasticsearch.yml 文件中修改write线程池配置。

锁定内存,不让JVM使用Swap

  • 背景 :Swap交换分区对性能和节点稳定性不利,会导致垃圾回收时间延长和节点响应缓慢。
  • 优化建议
    • 临时禁用Swap内存(重启后失效)。
    • 永久减少Swap的使用(通过修改 /etc/sysctl.conf 文件)。
    • elasticsearch.yml 文件中启用 bootstrap.memory_lock ,锁定内存不让JVM写入Swap。

减少分片数、副本数

  • 分片
    • 背景 :分片过小可能导致开销增加,分片过大可能导致频繁Merge和大量IO操作。
    • 优化建议 :根据索引大小调整分片数,如15G以下的索引调整为3个分片。
  • 副本数
    • 背景 :过多副本会导致ES内部写扩大,影响写入性能。
    • 优化建议 :对于日志数据,设置1个副本即可。对于大数据量的索引,可以设置副本数为0以减少对性能的影响。