es 过亿数据查询咨询

4 小时 27 分钟前
 seedhk

前提:

1 亿左右的数据,数据来源是设备的轨迹数据(gps ,速度,温度等信息),设备端按 5s 左右一次上报

查询需求:

  1. 能支持查询 3 400 台设备的最新轨迹数据
  2. 查询单个设备的轨迹信息(这个简单)

我自己尝试搭建了 3 个节点的 es ,每个节点 4g 左右内存,发现执行需求 1 时,大概需要 2-5s 左右,查询语句:

curl -X GET "http://192.168.1.210:9200/test_index/_search?pretty" \
-H 'Content-Type: application/json' \
-d '{
  "query": {
    "terms": {
      "serialNumber": [省略 sn]
    }
  },
  "collapse": {
    "field": "serialNumber"
  },
  "size": 300
}'

mapping 信息:

{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1,
    "index": {
      "sort.field": "createTime",
      "sort.order": "desc"
    }
  },
  "mappings": {
    "properties": {
      "serialNumber": {
        "type": "keyword"
      },
      "createTime": {
        "type": "date",
        "format": "strict_date_optional_time||epoch_millis||yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd HH:mm:ss"
      },
      "longitude": {
        "type": "double"
      },
      "latitude": {
        "type": "double"
      }
    }
  }
}

请问可以做到需求 1 查询 3-400 台设备,耗时到 1s 左右吗?

1312 次点击
所在节点    程序员
39 条回复
dode
4 小时 23 分钟前
都是时序数据,查的时候,限制数据在最新二十分钟内,应该就可以命中缓存了吧
tf2
4 小时 20 分钟前
无脑建议 "number_of_shards": 10 先试试。
ca2oh4
4 小时 20 分钟前
那应该用时序数据库可能更合适一下吧
ca2oh4
4 小时 19 分钟前
另外 4GB 内存对于 ES 来说有点少,建议一个节点至少 64GB
luciankaltz
4 小时 19 分钟前
都是时序数据,为什么不放时序数据库呢
还是你要对着某个文本字段做全文索引?
ca2oh4
4 小时 19 分钟前
如果内存紧张,多节点不如单节点
seedhk
4 小时 18 分钟前
@dode 因为可能会有部分设备很久没有上报,也需要展示这些数据,所以没法加时间范围限制
seedhk
4 小时 13 分钟前
@tf2 加到这么多分片会更快吗?
seedhk
4 小时 12 分钟前
@ca2oh4 #3
@luciankaltz 我去看看时序数据库,谢谢
AutumnVerse
4 小时 11 分钟前
lat lng 不要用 double 存,有专门的 location 类型。

不过单看你这个查询,索引和查询语句都没问题,不应该这么慢,应该是 es 哪里配置有问题。不过你这个内存确实太小了,线上 es 服务器,基本上 200g 内存起步
fjkfwz406
4 小时 7 分钟前
调大 shards ,按照 serialNumber router 到一个 shard 上,可以避免查多个 shard 然后 merge 的消耗
opengps
4 小时 5 分钟前
车辆定位,是个前同行
seedhk
4 小时 4 分钟前
@AutumnVerse lat 和 lng 因为不会涉及查询,还需要改成 location 吗?
您说的具体配置问题可能是哪里问题? 内存如果换成 3 个节点每个 8g ,是否会好一些?
seedhk
4 小时 3 分钟前
@fjkfwz406 shards 数据增加吗?
另外测试过 serialNumber route 到一个 shard 上的,速度也快不起来
seedhk
4 小时 3 分钟前
@opengps 请问下您之前涉及这块需求了吗? 是如何处理的
opengps
3 小时 59 分钟前
@seedhk #15 你只是要查询最新,那可以从源头上解决,直接内存里缓存所有设备的最后一条数据,而不是去数据库执行查询
shalou8023
3 小时 59 分钟前
可以考虑下时序数据库 Clickhouse 之类的
awesomePower
3 小时 56 分钟前
我试了下,用数据库也很快。随机生成一亿两千万数据,字段比你的例子还多两个。用随机 300 个 serialNumber 查一下,只要 0.3 秒
nc
3 小时 55 分钟前
每个节点内存太小了,ES 的数据要全部放到内存里最好。
1018ji
3 小时 54 分钟前
机器性能不行,白搭

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1217941

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX