Elasticsearch应用过程中的问题?

ES使用场景:
主要用来进行明细模糊搜索,用户通过关键字进行明细搜索,现在默认搜索区间是2年,ES中要存储10年数据。按照现在数据量,一年越400亿条数据。
集群部署方案:
物理机的配置为36core + 384GB + ssd磁盘,一共19台物理机,每台物理机只部署一个es节点。
3个master节点+16个data节点,堆内存配置为31GB。
建索引的方案:
索引文档定义情况:strict严格模式共定义了35个字段,9个中文字段采用standard分词且字符串长度在30以内,其余字段基本是keyword类型。400个主分片,复制分片个数为2,一个索引共400个主分片,800个复制分片,refresh_interval为2秒。
索引的id生成方式为5业务主键拼接。
终态为保存最近十年数据,按年建索引,比如2013到2022共十个年的数据,每年的数据放一个索引,共3000亿条数据,单条数据0.3k。

数据现状:
目前集群有三个索引2020,2021、2022,2023数据量分别为几百万条、400亿条,400亿条、30亿条。
无数据倾斜,通过es的监控api确认了16个data节点上每个data节点的数据量均匀,每一个索引在每个data节点上的分片数均匀,每个分片的的数据量均匀。
单个分片大小约为20GB

ES访问情况
实时写:两个机房增量数据7*24小时不停的写,因为不停有交易数据产生,每日写入2.2亿条,最高TPS为4k左右
批量写:夜间对于存量的数据做批量bluk导入,一个bulk条数为5000条。
现在写入都是指定id方式,没有使用ES自己生成ID的方式。因双机房双写的场景,实时写入场景无法使用自动生成id的方式。

五个现象:
1批量写数的时候有一两台es节点的物理机cpu特别高,90以上,其他很低,10%左右,重启该es节点之后,会变成其它节点的cpu特别高,问题没有解决,只是发生了转移。
2批量写较慢,当索引数据量小的时候TPS能到10万,目前索引数据量300亿条时,批量写的TPS只能到4万
3日间实时写的时候采用的是es的sdk中的Hi Level Rest 批量写入,bulk策略为(3秒、5M、1000条),超时时间2秒,会偶然出现超时问题,持续时间较短1-2分钟,此时es的监控并没有什么异常。
4夜间离线导数的时候,由于导入的数据量较大,实时写入的的超时报错比日间更严重。
5目前为内测查询阶段,只有几十个账户可用查询,根据es返回json中的took值发现,查询时间不稳定,具体分布还在统计,会有一定机率出现耗时较长的查询(超过1s),对用户体验影响较大。 查询指定了routing,采用了filter过滤,只查询当前用户的数据,对9个中文字段做multi query,只查询第一页数据。

参与8

1同行回答

搁浅沉默搁浅沉默研发工程师某股份银行
根据本人的实践情况,针对其中的几个现象,提出如下建议:现象一的情况:考虑使用  GET / _nodes/hot_threads 查看当前集群的热点线程,确认当前是写占用了大量CPU资源。其余几个现象与现象一存在共同点,读写性能问题,建议增加协调节点角色,帮助集群提前进行数据流量处理,单凭数据节...显示全部

根据本人的实践情况,针对其中的几个现象,提出如下建议:
现象一的情况:
考虑使用  GET / _nodes/hot_threads 查看当前集群的热点线程,确认当前是写占用了大量CPU资源。
其余几个现象与现象一存在共同点,读写性能问题,建议增加协调节点角色,帮助集群提前进行数据流量处理,单凭数据节点承载大数据流量,批量写入时,可能压力过大。
另外,由于不是很了解楼主的实际场景跟情况,所以下面这个建议可能不是很合适:
1.针对索引设置生命周期策略,滚动更新,保证索引每条的数据量在一定范围内,目前情况计算,每条索引约为24T大小,因为集群规模相对来说较大,故而,是否可以适当地滚动索引,减少每个索引的分片数据量,加快数据查询的效率。
2.基于第一条的基础上,由于滚动更新,故而索引名称不固定,设置别名,根据别名进行数据查询,这样,不用考虑索引的实际名称,对于客户端侧代码影响较少。

一家之言,仅供参考,如有帮助,不胜荣幸

收起
软件开发 · 2023-02-09
浏览828

ChatGPT 回答

根据您提供的信息,我们可以针对以下几个方面进行优化:

  1. 索引设计优化

由于您的数据量非常大,建议将每年的数据放在一个索引中,这样可以方便地管理和维护数据。同时,建议将索引的主分片数量增加到更多,以便更好地分散数据负载。此外,您可以考虑使用更高效的分词器,如ik_smart分词器,以提高搜索效率。

  1. 节点配置优化

您的节点配置看起来已经很不错了,但是由于您的数据量非常大,建议将堆内存配置适当增加,以便更好地处理大量数据。此外,您可以考虑使用更快的SSD磁盘,以提高读写性能。

  1. 写入性能优化

在批量写入时,建议将bulk策略中的条数增加到更多,以便更好地利用网络带宽。此外,您可以考虑使用异步写入模式,以便更好地处理高并发写入请求。

  1. 查询性能优化

在查询时,建议使用更高效的查询方式,如使用bool查询代替multiquery查询。同时,您可以考虑使用缓存机制,以便更快地响应查询请求。此外,您可以考虑使用更快的网络连接,以提高查询响应速度。

  1. 监控与调优

最后,建议您定期监控集群的性能指标,如CPU、内存、磁盘和网络使用率等,以便及时发现和解决性能问题。同时,您可以使用Elasticsearch提供的调优工具,如hot_threads API和slowlog API,以便更好地诊断和解决性能问题。

提问者

jillme
CIO某大型银行

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2023-02-06
  • 关注会员:2 人
  • 问题浏览:1764
  • 最近回答:2023-02-09
  • X社区推广