elasticsearch使用之datastream

2023-11-22 14:25:58 浏览数 (2)

一.什么是data stream

datastream是elasticsearch提供的一种用于存储流式数据的功能。按照时间对数据进行切分,每个datastream索引都包含一个时间段内的数据。一般我们使用datastream来记录"日志数据","监控数据","指标数据"这类连续不断生成,且时序性较强的数据。

data stream的写入

通常我们在使用datastream时,都会结合ILM对datastream索引进行管理。会自动根据datastream中写入的数据进行索引的滚动,以及全生命周期的管理。在我们写入每一条数据都必须要包含@timestamp字段,因为我们的数据流是基于时间进行管理与切分的。我们可以通过索引模板对字段进行指定,如果在模板中没有指定,elasticsearch也会指定一个默认日期为@timestamp

对于datastream的写入 如下图所示,伴随着我们数据的写入,ILM会根据我们策略中配置的条件对datastream的索引进行切分,以保证datastream中的数据写入都是在最新的索引中,同时每个索引都是恒定大小。让datastream拥有最好的写入性能。

data stream的查询

在对datastream进行查询时我们在操作上与查询索引没有太大的区别,也是通过search请求进行查询,datastream会根据我们的查询逻辑,将请求路由至符合条件的索引中。

例如在下面的样例中我们,我们使用通配符的形式对索引进行匹配,然后进行查询。由于datastream滚动出的索引都为基于时间进行生成,所以我们在查询时,也建议合理控制通配符的时间粒度,避免时间跨度过大,适配的索引过多,扫描的分片过多,而导致出现慢查询,或查询超时的情况。

代码语言:javascript复制
GET .ds-logs-2099*/_search

二.如何使用data stream

在之前的文章"https://cloud.tencent.com/developer/article/2356835"我们已经讲过如何创建并使用ILM。所以我们这里直接开始讲data stream模板的创建与data stream的创建。

创建data stream模板

我们这里使用_template API进行模板的创建,根据我们的写入需求,合理的设置每个索引的主分片数与副本数,绑定我们之前已经创建完成的ILM策略。在模版中约束了@timestamp字段。同时设置模板的优先级为200,这样做的目的是为了避免与集群中其他的模板冲突,影响data stream索引的生成与适配。

代码语言:javascript复制
PUT _template/my_data_stream_template
   {
     "order":200
     "index_patterns": ["my_data_stream-*"],
     "data_stream": {},
     "template": {
       "settings": {
         "number_of_shards": 1,
         "number_of_replicas": 1,
         "index.lifecycle.name": "my-lifecycle-policy"
       },
       "mappings": {
         "properties": {
           "@timestamp": {
           "type": "date",
           "format": "date_optional_time||epoch_millis"
        }
         }
       }
     }
   }

创建data stream

我们这是使用数据自动创建数据流,我们这里指定的数据流名称需要与模板中的"index-patterns"中的值保持一致,以便能够准确的匹配到我们的数据流索引。同时我们的数据中还需要包含@timestamp字段。

代码语言:javascript复制
PUT my-data-stream/_bulk
{ "create":{ } }
{ "@timestamp": "2099-05-06T16:21:15.000Z", "message": "192.0.2.42 - - [06/May/2099:16:21:15  0000] "GET /images/bg.jpg HTTP/1.0" 200 24736" }
{ "create":{ } }
{ "@timestamp": "2099-05-06T16:25:42.000Z", "message": "192.0.2.255 - - [06/May/2099:16:25:42  0000] "GET /favicon.ico HTTP/1.0" 200 3638" }

也可以使用_data_stream API直接进行进行数据流的创建。

代码语言:javascript复制
PUT _data_stream/my_data_stream

对data stream进行数据写入

在数据流创建完成后,我们就可以直接基于数据流的名称,例如通过别名对数据流进行写入。

代码语言:javascript复制
POST my_data_stream/_doc
{
   "field1": "value1",
   "field2": "value2"
}

POST my-data-stream/_doc
{
  "@timestamp": "2099-05-06T16:21:15.000Z",
  "message": "192.0.2.42 - - [06/May/2099:16:21:15  0000] "GET /images/bg.jpg HTTP/1.0" 200 24736"
}

查看data stream

我们可以直接通过GET的方式查看data stream的详情

代码语言:javascript复制
GET /_data_stream/<data-stream>

删除data stream

我们直接使用DELETE进行删除即可。

代码语言:javascript复制
DELETE _data_stream/my-data-stream

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞