索引是 Elasticsearch 的重要组成部分。 每个索引使你的数据集保持分离和有条理,从而使你可以灵活地以不同方式对待每个数据集,并使其在整个生命周期中都易于管理。 通过提供摄入方法和管理工具来简化流程,Elastic 可以轻松地充分利用索引。
在本文中,我们将使用 Filebeat 将来自多个源的数据摄入到多个索引中,然后将使用索引生命周期管理(ILM)和数据流来进一步控制该数据。
Filebeat 是什么?
Filebeat 是一种轻量级的日志传送器,带有许多内置模块,用于从多个数据源到 Elasticsearch 无缝收集,解析和管理数据。这些模块(与预建的 Kibana 仪表板一起提供)可用于各种系统,服务和应用程序。
单个 Filebeat 实例具有多种用途,可以从多个数据源收集数据。它可以帮助用户节省数小时(如果不是几天)的解析,索引模板配置和数据管理。默认情况下,来自所有不同来源的数据都将传送到相同的 Elasticsearch 索引,从而使用户可以使用 event.module 字段过滤数据源。尽管此行为使 Filebeat 的入门更加容易,但是有多个用例可通过将相似数据存储在多个索引中而受益,例如:
- 将不同的数据保留策略应用于不同的数据源。例如,VPC 和防火墙数据可能需要保存一年,而 IIS 数据仅需要在群集中保存一个月。
- 仅使数据子集可用于应用程序或仪表板。例如,安全分析人员可能会关心防火墙和网络数据,但可能不会关心 Redis 或 Kafka 数据。
- 轻松为需要访问数据子集的用户分配数据访问权限。例如,支持团队的成员可能仅需要访问 IIS,而无需访问 Tomcat 数据集。为了实现此目的,Elastic 管理员可以查看文档级的安全性,但是这种方法更复杂,并且更容易出现人为错误。
使用索引生命周期管理和数据流分离数据
上面所有用例都建议一种解决方案是根据数据源或 Filebeat 数据模块分离数据。分离很容易实现,但是避免分片问题要复杂一些。分片问题可能是分片过多(太多的小分片)或分片不足(你的分片太大)。每个分片都有其自身的问题,因为分片过多意味着每个操作都必须由更多的分片协同完成,分片不足会导致可用性问题。
本博客将帮助你将 Filebeat 中的数据分离为较小的索引,这些索引专用于每个模块,但通过设置数据流 / ILM策略来帮助你避免分片问题。我们还将利用新的 Elasticsearch 索引模板和 Elasticsearch 组件模板来帮助确保所有新索引都将从默认 Filebeat 映射继承正确的模板映射。我们还将使用数据流来确保我们的数据正确翻转。
这看起来很多,但是配置完成后,管理变得轻而易举。现在要做一些工作,以后再不用担心了。
实际示例:管理多个云数据源
在此示例中,我们将拥有三种类型的数据,包括 Google Cloud,Microsoft Azure 和 Amazon Web Services(AWS)。 数据集将属于两种不同的数据保留策略:
- Google Cloud 将保留 30 天
- Azure 和 AWS 将保留 365 天
如果没有集群,可以在开始下面的 步骤1 之前启动 Elastic Cloud 的免费试用版。
步骤1:创建索引生命周期策略
首先,我们将为每个数据子集创建索引生命周期策略。 这将创建不同的保留策略,因此每个索引可以具有自己的规则:
# create a policy that deletes data after days from rollover
PUT _ilm/policy/filebeat-30days
{
"policy" : {
"phases" : {
"hot" : {
"min_age" : "0ms",
"actions" : {
"rollover" : {
"max_size" : "50gb",
"max_age" : "1d"
},
"set_priority" : {
"priority" : 100
}
}
},
"delete" : {
"min_age" : "30d",
"actions" : {
"delete" : {
"delete_searchable_snapshot" : true
}
}
}
}
}
}
# create a policy that deletes data after days from rollover
PUT _ilm/policy/filebeat-365days
{
"policy" : {
"phases" : {
"hot" : {
"min_age" : "0ms",
"actions" : {
"rollover" : {
"max_size" : "50gb",
"max_age" : "1d"
},
"set_priority" : {
"priority" : 100
}
}
},
"delete" : {
"min_age" : "365d",
"actions" : {
"delete" : {
"delete_searchable_snapshot" : true
}
}
}
}
}
}
步骤2:创建组件模板
现在,我们需要创建一个组件模板,这是用于构建指定索引映射(index mapping),设置(settings)和别名(aliases)的索引模板的构建块。 我们将通过传统模板 filebeat-%{agent.version} 创建它来节省时间。
1)通过转到以下位置创建基于 filebeat-7.10.1 的组件模板:Kibana > 堆栈管理 > 索引管理 > 组件模板 > 创建组件模板。
2)从 filebeat-7.10.1(GET _template / filebeat-7.10.1)复制 settings。
# need to remove "rollover_alias": "filebeat-7.10.1" from the output
curl -XGET "https://<Elasticsearch>:<port>/_template/filebeat-7.10.1" -u elastic | 'jq .[].settings'
3)从 filebeat-7.10.1 旧版模板复制映射。
# need to remove "rollover_alias": "filebeat-7.10.1" from the output
curl -XGET "https://<Elasticsearch>:<port>/_template/filebeat-7.10.1" -u elastic | jq .[].mappings
步骤3:建立索引模板
现在,我们可以使用该组件模板为每个数据源创建一个新的索引模板。 让我们从 Google Cloud 模板开始。
1)转到 Kibana > 堆栈管理 > 索引管理 > 索引模板 > 创建模板
2)确保已启用数据流(Data stream)。
3)将你在 步骤2 中创建的组件模板添加到该新模板中
4)覆盖组件模板中的默认设置以使用自定义索引生命周期策略
{
"index": {
"lifecycle": {
"name": "filebeat-30days"
}
}
}
5)将映射保留为空白,因为映射是从组件模板继承的。
6)将别名留空。
7)保存模板。 对所有具有正确ILM策略的自定义数据集重复这些步骤,即 filebeat-30days 或 filebeat-365days。
步骤4:将输出配置为多个索引
Filebeat 允许你将基于 event.module 值的数据分解为较小的索引。 有两种典型的日志流设置,一种使用 Logstash,另一种不使用 Logstash:
Filebeat > Logstash > Elasticsearch
在将数据吸收到 Elasticsearch 之前,数据在 Logstash 处停止。 在此设置中,鉴于你已完成 filebeat setup 命令,我们将需要在 Logstash 中完成最少的数据解析。
input {
beats {
port => 5044
}
}
filter {
mutate {
add_tag => [ "coming_from_logstash"]
}
}
output {
elasticsearch {
index => "filebeat-%{[agent][version]}-%{[event][module]}"
user => "elastic"
password => "password"
pipeline => "filebeat-%{[agent][version]}-%{[event][module]}-%{[fileset][name]}-pipeline" ## leverage the built in ingest pipeline from filebeat
hosts => [ "https://<elasticsearch_URL>:<port>" ]
action => "create"
}
}
Filebeat > Elasticsearch
在此设置中,Filebeat 无需使用 Logstash 即可直接将数据发送到 Elasticsearch。
filebeat.inputs:
- type: log
enabled: false
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: true
setup.template.settings:
index.number_of_shards: 1
# Set up Kibana
setup.kibana.host: "https://Kibana_URL:443"
setup.kibana.protocol: https
# Set up Elasticsearch
output.elasticsearch:
hosts : ["https://Elasticsearch_URL:443"]
username: "elastic"
password: "${elastic_user_pd}"
indices:
- index: "filebeat-%{[agent.version]}-%{[event.module]}"
when.has_fields: ['event.module']
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
logging.level: debug
logging.to_files: true
logging.files:
path: /var/log/filebeat
name: filebeat
keepfiles: 7
permissions: 0644
步骤5:开始摄入
如果一切正常,你应该看到类似以下内容:
GET _cat/indices/filebeat*?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .ds-filebeat-7.10.1-azure-2020.12.26-000001 4xvOnCt2Sx6iVSy3WnUaKQ 3 1 24 0 1.7mb 876.1kb
green open .ds-filebeat-7.10.1-aws-2020.12.26-000001 4xvOnCt2Sx6iVSy3WnUaKQ 3 1 24 0 1.7mb 876.1kb
green open .ds-filebeat-7.10.1-googlecloud-2020.12.26-000001 PYxA7WHwQf6dVzEJ07X2yQ 3 1 443538 0 294.2mb 146.8mb
green open .ds-filebeat-7.10.1-system-2020.12.26-000001 sZdFR68wSWCr_XOQasEkWA 3 1 72 0 1.1mb 607.2kb
而且你的 ILM 策略应显示该策略已应用于 x 个索引:
立即开始流式传输
就这么简单,现在你无需担心的管理任务! 如果你一直在阅读并且还没有尝试过,我鼓励您自己尝试一下,并开始使用 Filebeat 来开始流式传输并分析来自多个数据源的日志。
是否想查看整个生态系统的健康状况,而不仅仅是日志文件? 查看 Elastic Observability,并将你的日志,指标和 APM 跟踪放到一个堆栈中。 在此网络研讨会上了解有关 ILM 的更多信息,如果有任何疑问,请访问 “讨论论坛”。