ELK根据开发目标进行索引设计
ELK indexes design according to development goal
我以前用过elastic来分析日志,但我对elastic“架构”没有任何经验。我有一个部署到多台机器(200 多台)的应用程序。我想连接到每台机器并收集元数据,如日志、指标、数据库统计信息等。
有了这些数据,我希望能够:
- 发现每台机器的问题并通知他们(发现问题需要不同来源之间的数据连接,例如在log1中发现异常需要我去检查db)
- 分析所有机器的常见问题并实施能够预测问题的 ML 模型。
我需要创建索引,我考虑了 2 个选项:
- 为每台机器创建一个索引,然后与每台机器相关的所有数据都将在其索引中可用。
- 为每个数据源创建索引。例如,来自所有机器的所有数据库日志都将在一个专用索引中可用。另一个索引将只包含与机器指标相关的数据(cpu/ram usage..)
创建这些索引的最佳方法是什么?
好的,现在我对您的需求有了更好的了解,这是我的建议:
我强烈建议不要为每台机器创建索引。我不太了解您的用例,但我假设您想在 kibana 中或通过在您的应用程序中实施搜索请求来搜索数据。
假设您对每台机器的内存使用情况感兴趣。您需要针对 elasticsearch 执行 200 个搜索请求,因为数据(ram 使用)分布在 200 个索引上(当然可以创建别名,但必须为每台新机器更新这些别名)。此外,您将无法以方便的方式 进行基本聚合,例如哪台机器的内存使用率最高?。在我看来,还有很多缺点,例如索引管理、分片分配等。
那么什么是更好的解决方案?
正如您已经建议的那样,您应该为每个数据源创建一个索引。这样,您的索引就有了专用的 "purpose",例如一个存储数据库数据的索引,另一个存储系统指标等。参考我上面的例子,你只需要执行一个搜索请求来确定 a) 每台机器的 ram 使用率和 b) 哪台机器的 ram 使用率最高。但是,这需要每个文档都包含一个引用特定主机的字段,如下所示:
PUT metrics/_doc/1
{
"system":{
"ram": {
"usage": "45%",
"free": "55%"
}
},
"host":{
"name": "YOUR HOSTNAME",
"ip": "192.168.17.100"
}
}
除此之外 我建议使用每日指数。因此,与其为系统指标创建一个巨大的索引,不如为每一天创建一个索引,例如 metrics-2020.01.01
、metrics-2020.01.02
等等。这种方法有以下优点:
- 您的索引的大小会小得多,使它们更易于管理和(重新)分配。
- 经过一段时间后,您可以粗略估计数据大小并能够更好地定义分片数量。只有一个巨大的索引,您将需要不断更新分片的数量,以便快速处理您的请求。
- 此外,您可以方便地按天搜索数据。
- 您可以设置 ilm-policies 来自动维护您的索引,例如删除早于 X 天的指标-索引。
- ...
希望能帮到你!
我以前用过elastic来分析日志,但我对elastic“架构”没有任何经验。我有一个部署到多台机器(200 多台)的应用程序。我想连接到每台机器并收集元数据,如日志、指标、数据库统计信息等。
有了这些数据,我希望能够:
- 发现每台机器的问题并通知他们(发现问题需要不同来源之间的数据连接,例如在log1中发现异常需要我去检查db)
- 分析所有机器的常见问题并实施能够预测问题的 ML 模型。
我需要创建索引,我考虑了 2 个选项:
- 为每台机器创建一个索引,然后与每台机器相关的所有数据都将在其索引中可用。
- 为每个数据源创建索引。例如,来自所有机器的所有数据库日志都将在一个专用索引中可用。另一个索引将只包含与机器指标相关的数据(cpu/ram usage..)
创建这些索引的最佳方法是什么?
好的,现在我对您的需求有了更好的了解,这是我的建议:
我强烈建议不要为每台机器创建索引。我不太了解您的用例,但我假设您想在 kibana 中或通过在您的应用程序中实施搜索请求来搜索数据。
假设您对每台机器的内存使用情况感兴趣。您需要针对 elasticsearch 执行 200 个搜索请求,因为数据(ram 使用)分布在 200 个索引上(当然可以创建别名,但必须为每台新机器更新这些别名)。此外,您将无法以方便的方式 进行基本聚合,例如哪台机器的内存使用率最高?。在我看来,还有很多缺点,例如索引管理、分片分配等。
那么什么是更好的解决方案?
正如您已经建议的那样,您应该为每个数据源创建一个索引。这样,您的索引就有了专用的 "purpose",例如一个存储数据库数据的索引,另一个存储系统指标等。参考我上面的例子,你只需要执行一个搜索请求来确定 a) 每台机器的 ram 使用率和 b) 哪台机器的 ram 使用率最高。但是,这需要每个文档都包含一个引用特定主机的字段,如下所示:
PUT metrics/_doc/1
{
"system":{
"ram": {
"usage": "45%",
"free": "55%"
}
},
"host":{
"name": "YOUR HOSTNAME",
"ip": "192.168.17.100"
}
}
除此之外 我建议使用每日指数。因此,与其为系统指标创建一个巨大的索引,不如为每一天创建一个索引,例如 metrics-2020.01.01
、metrics-2020.01.02
等等。这种方法有以下优点:
- 您的索引的大小会小得多,使它们更易于管理和(重新)分配。
- 经过一段时间后,您可以粗略估计数据大小并能够更好地定义分片数量。只有一个巨大的索引,您将需要不断更新分片的数量,以便快速处理您的请求。
- 此外,您可以方便地按天搜索数据。
- 您可以设置 ilm-policies 来自动维护您的索引,例如删除早于 X 天的指标-索引。
- ...
希望能帮到你!