背景:ES 集群已经是百台高配节点。
1.单条数据平均大小占用 15K 左右。
2.每次请求要返回 1 万条的数据量。
3.会有大量的并发会去这样请求。
目前导致是带宽资源占用比较高,另一个返回的效率比较慢,大家都是怎么优化的,包括数据压缩或者负载均衡策略。
有之前负责 ES 大数据运维的工作,有打算想换环境的想法,可以聊聊。
1
mengzhuo 2022-04-15 22:37:59 +08:00 1
最简单是逻辑层加 cache ,查询一致的时候直接回之前缓存的数据,特别是用户会查询的东西可以自己先预热 cache 。
而且看你的需求,应该是某种 tsdb 的应用范围。预先计算,预先聚集到特定表,减少 aggregate 压力,或者干脆直接换 tsdb 。 不是 tsdb 的话,每条数据 15K ,也需要尽快垂直拆字段,特别是没啥用的数据,就不要跟着查询压力大的接口放在一起。 ES 的 shard 机制决定了你的数据肯定会跨节点查询,http gzip 都只是治标不治本的。 |
2
noparking188 2022-04-16 02:24:51 +08:00
好问题,关注
|
3
aaa5838769 OP @mengzhuo 感谢你的回复,我们库里大概有几十亿条数据,这几十亿条数据,根据用户的需求进行请求查询然后返回数据,未必有耦合的数据。
|
4
mengzhuo 2022-04-16 21:49:02 +08:00
@aaa5838769 类似搜索引擎么?那 ES 可不是好选择,可能需要直接建立单独的分词索引服务来完成任务,不过具体我没实施过,你搜搜看搜索引擎实现吧。
|
5
viggoc 2022-04-16 23:25:23 +08:00 via Android
查询条件是什么样的,有排序吗。拉数据一定要获取所以字段吗?不需要的话就只返回部分字段吧
|
6
aaa5838769 OP @viggoc 可以根据时间范围或者关键词查询,无排序,返回的字段是根据请求参数来决定的,可以全部字段或者部分字段的。
|
7
viggoc 2022-04-17 11:07:46 +08:00
时间范围查询可以考虑数据根据时间字段 index sorting 。返回的字段是从 source 取的话可以考虑用 docvalue_fields 取,从 source 取是要解析 json 的。
|