数据流(Data streams) #
如果你正在将连续生成的时间序列数据(如日志、事件和指标)摄入 Easysearch,那么你很可能处于这样一种场景:文档数量快速增长,且你无需更新旧文档。
管理时间序列数据的典型工作流程包含多个步骤,例如创建滚动索引别名、定义写入索引,以及为底层索引定义通用的映射和设置。
数据流简化了这一过程,并强制采用最适合时间序列数据的配置方式,例如主要为仅追加(append-only)数据设计,并确保每个文档都包含一个时间戳字段。
数据流在内部由多个底层索引组成。搜索请求会被路由到所有底层索引,而写入请求则被路由到最新的写入索引。通过 索引生命周期管理(ILM) 策略,你可以自动处理索引滚动(rollover)或删除操作。
数据流使用说明 #
步骤 1:创建索引模板 #
要创建数据流,首先需要创建一个索引模板,用于将一组索引配置为数据流。data_stream
对象表明这是一个数据流,而非普通索引模板。索引模式需与数据流的名称匹配:
PUT _index_template/logs-template-nginx
{
"index_patterns": "logs-nginx",
"data_stream": {
},
"priority": 200,
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}
}
在此情况下,每个摄入的文档都必须包含一个 @timestamp
字段。
你也可以在 data_stream
对象中自定义时间戳字段名称。此外,你还可以在此处定义索引映射和其他设置,就像为普通索引模板所做的那样。
PUT _index_template/logs-template-nginx
{
"index_patterns": "logs-nginx",
"data_stream": {
"timestamp_field": {
"name": "request_time"
}
},
"priority": 200,
"template": {
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}
}
在此示例中,logs-nginx
索引会匹配 logs-template-nginx
模板。当存在多个匹配时,Easysearch 会选择优先级更高的模板。
步骤 2:创建数据流 #
创建索引模板后,即可创建数据流。
你可以使用数据流 API 显式创建数据流。该 API 将初始化第一个底层索引:
PUT _data_stream/logs-nginx
你也可以直接开始摄入数据,而无需预先创建数据流。
由于我们已有包含 data_stream
对象的匹配索引模板,Easysearch 将自动创建数据流:
POST logs-nginx/_doc
{
"message": "login attempt failed",
"@timestamp": "2013-03-01T00:00:00"
}
要查看特定数据流的信息:
GET _data_stream/logs-nginx
示例响应 #
{
"data_streams": [
{
"name": "logs-nginx",
"timestamp_field": {
"name": "@timestamp"
},
"indices": [
{
"index_name": ".ds-logs-nginx-000001",
"index_uuid": "Z8RATqnzTbGxbm-khb5LKw"
},
{
"index_name": ".ds-logs-nginx-000002",
"index_uuid": "o8xka3CxSjqzNrw1BoRP6A"
}
],
"generation": 2,
"status": "GREEN",
"template": "logs-template-nginx"
}
]
}
你可以看到时间戳字段的名称、底层索引列表、用于创建数据流的模板,以及数据流的健康状态(反映其所有底层索引中最低的状态)。
要获取更多关于数据流的详细信息,请使用 _stats
端点:
GET _data_stream/logs-nginx/_stats
示例响应 #
{
"_shards": {
"total": 2,
"successful": 2,
"failed": 0
},
"data_stream_count": 1,
"backing_indices": 2,
"total_store_size_bytes": 18125,
"data_streams": [
{
"data_stream": "logs-nginx",
"backing_indices": 2,
"store_size_bytes": 18125,
"maximum_timestamp": 1362096000000
}
]
}
要查看所有数据流的信息,请使用以下请求:
GET _data_stream
步骤 3:向数据流中摄入数据 #
你可以使用常规的索引 API 将数据摄入数据流。请确保每个索引的文档都包含时间戳字段。如果尝试摄入没有时间戳字段的文档,将会报错。
POST logs-nginx/_doc
{
"message": "login attempt",
"@timestamp": "2013-03-01T00:00:00"
}
步骤 4:搜索数据流 #
你可以像搜索普通索引或索引别名一样搜索数据流。搜索操作将应用于所有底层索引(即数据流中的全部数据)。
GET logs-nginx/_search
{
"query": {
"match": {
"message": "login"
}
}
}
示例响应 #
{
"took" : 514,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 0.2876821,
"hits" : [
{
"_index" : ".ds-logs-redis-000001",
"_type" : "_doc",
"_id" : "-rhVmXoBL6BAVWH3mMpC",
"_score" : 0.2876821,
"_source" : {
"message" : "login attempt",
"@timestamp" : "2013-03-01T00:00:00"
}
}
]
}
}
步骤 5:滚动数据流 #
滚动操作会创建一个新的底层索引,并将其设置为数据流的新写入索引。
要对数据流执行手动滚动操作:
POST logs-nginx/_rollover
示例响应 #
{
"acknowledged": true,
"shards_acknowledged": true,
"old_index": ".ds-logs-nginx-000001",
"new_index": ".ds-logs-nginx-000002",
"rolled_over": true,
"dry_run": false,
"conditions": {}
}
现在,如果你对 logs-nginx
数据流执行 GET
操作,你会看到其生成(generation) ID 从 1 增加到了 2。
你还可以设置一个 索引生命周期管理(ILM)策略 来自动执行数据流的滚动操作。ILM 策略在底层索引创建时即被应用。当你将策略关联到数据流时,它仅影响该数据流未来的底层索引。
此外,你无需提供 rollover_alias
设置,因为 ILM 策略会从底层索引中自动推断此信息。
步骤 7:删除数据流 #
删除操作会自动删除数据流的所有底层索引,然后删除数据流本身。
要删除一个数据流及其所有隐藏的底层索引:
DELETE _data_stream/<data_stream_name>
你可以使用通配符来删除多个数据流。
我们建议使用 ILM 策略来删除数据流中的数据。