一.什么是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索引的生成与适配。
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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!