使用 Elasticsearch 和 Beats 可视化 MinIO 中的使用模式

Visualize usage patterns in MinIO using Elasticsearch and Beats

MinIO 经常用于存储 Elasticsearch 快照,为 Elasticsearch 备份提供了一个安全的家园。与存储分层一起使用时,它效率更高,这降低了 Elasticsearch 的总拥有成本,此外,您还可以获得将数据写入 MinIO 的额外好处,这些数据是不可变的版本化的,并受擦除编码保护。此外,将 Elasticsearch 快照保存到 MinIO 对象存储使它们可供其他云原生机器学习和分析应用程序使用。在我们之前的一篇博文中,我们详细介绍了如何从 Elasticsearch创建快照和恢复

从那时起,MinIO 和 Elasticsearch 的功能都得到了增强,现在我们可以做更多的事情。

  • 我们将 MinIO journalctl 日志发送到 Elasticsearch。
  • 将 MinIO 存储桶中的日志发送到 Elasticsearch。

MinIO 是 Elasticsearch 的完美伴侣,因为它具有业界领先的性能和可扩展性。MinIO 的可扩展性和高性能的结合使每个数据密集型工作负载(不仅仅是 Elasticsearch)触手可及。MinIO 能够提供惊人的性能 - 最近的基准测试 在仅使用 32 个现成的 NVMe SSD 节点的 GET 操作中实现了 325 GiB/s(349 GB/s),在 PUT 操作中实现了 165 GiB/s(177 GB/s)。通过将 MinIO 服务日志发送到 Elasticsearch,我们将能够洞察 MinIO 的操作,您可以在 Kibana 图形界面中查看模式和警报,这将使您能够根据某些阈值运行进一步的分析甚至警报。例如,您可能希望检查趋势或瓶颈,并尝试识别工作负载类型或一天中的时间模式。在这篇博文中,我们将向您展示如何以一种促进洞察力的易于理解的方式可视化这些模式。

安装 ELK 栈

我们将介绍安装 Elasticsearch-Logstash-Kibana 的最基本方法。为了简单起见,我们将在同一个节点上安装它,以确保我们不必担心在节点之间打开端口。

在生产环境中,您应该将这些组件架构在单独的节点上,以便您可以扩展各个组件。

  • 添加 apt 仓库密钥,不仅可以下载 Elasticsearch,还可以下载后续步骤中使用的其他组件,例如 Logstash 和 Kibana。
  • 安装 Elasticsearch 软件包。

root@aj-test-1:~# curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

root@aj-test-1:~# echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list

root@aj-test-1:~# apt-get update

root@aj-test-1:~# apt-get -y install elasticsearch

  • 启动并验证 Elasticsearch 是否正常工作。启动后,即使状态为运行,Elasticsearch 的 API 也可能需要一两分钟才能响应,因此,如果服务启动后立即超时,请在几分钟后重试。

root@aj-test-1:~# systemctl enable elasticsearch

root@aj-test-1:~# systemctl start elasticsearch

root@aj-test-1:~# curl -X GET "localhost:9200"
{
  "name" : "aj-test-1",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "b-ivUmYnRWyXBiwMuljO9w",
  "version" : {
    "number" : "7.17.6",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "f65e9d338dc1d07b642e14a27f338990148ee5b6",
    "build_date" : "2022-08-23T11:08:48.893373482Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

我们将使用 Kibana 可视化日志。我们也可以使用 ElasticSearch API 读取索引,但图形界面将使理解更加用户友好。

  • 安装并启动 Kibana。

root@aj-test-1:~# apt-get -y install kibana

root@aj-test-1:~# systemctl enable kibana

root@aj-test-1:~# systemctl start kibana

  • 访问 http://localhost:5601 在这些示例中,我已在 /etc/hosts 中将 kibana.min.io 指向 localhost 以获得更好的可见性,但您可以使用 localhost

目前还没有索引,但我们将在接下来的几个步骤中添加它们。为了处理日志以加载我们的索引,我们需要安装 Logstash。

可以将 Logstash 视为日志解析器。它不存储任何内容,它有输入和输出,以及介于两者之间的一系列不同类型的过滤器。它解析输入数据,对其进行过滤/转换,然后以各种方式输出它。

  • 安装 Logstash

root@aj-test-1:~# apt-get -y install logstash

  • 在以下文件中配置 Logstash 以输出到 Elasticsearch

root@aj-test-1:~# vi /etc/logstash/conf.d/01-example.conf

使用以下内容发送到默认索引。

output {

 elasticsearch {

   hosts => ["localhost:9200"]

   index => "default-%{+YYYY.MM.dd}"

 }

}

  • 注意:在启动 Logstash 之前,请在调试模式下运行它以确保一切正常。在我的情况下,它无法找到 pipelines.yml,因此我不得不通过将其符号链接到原始位置来手动修复它。所以在继续之前请先验证。

root@aj-test-1:~# /usr/share/logstash/bin/logstash --debug

  • 如果一切看起来都很好,请启用并启动 Logstash 服务。

root@aj-test-1:~# systemctl enable logstash

root@aj-test-1:~# systemctl start logstash

此时 Logstash 已经在技术上运行,但我们尚未配置任何输入来消费数据,仅配置了输出,所以现在让我们通过安装 MinIO 并收集服务日志来完成此操作。

安装 MinIO

在之前的博文中,我们讨论了如何配置MinIO 作为 SystemD 服务。我们将在这里使用相同的原则,只是它将作为操作系统包安装,而不是二进制文件。

  • 安装 MinIO .deb 包。如果您使用的是其他操作系统系列,则可以在此处找到其他软件包

root@aj-test-1:~# wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20220825071705.0.0_amd64.deb -O minio.deb

root@aj-test-1:~# dpkg -i minio.deb

  • 分别创建用户和组 minio-userminio-user

root@aj-test-1:~# groupadd -r minio-user
root@aj-test-1:~# useradd -M -r -g minio-user minio-user

  • 为 MinIO 创建数据目录,并使用上一步创建的用户和组设置权限。

root@aj-test-1:~# mkdir /opt/minio

root@aj-test-1:~# chown minio-user:minio-user /opt/minio

  • 启用并启动 MinIO 服务

root@aj-test-1:~# systemctl enable minio

root@aj-test-1:~# systemctl start minio

  • 您可以通过控制台访问 http://localhost:9001 或通过 mc 管理员验证 MinIO 是否正在运行。

root@aj-test-1:~# wget https://dl.min.io/client/mc/release/linux-amd64/mc

root@aj-test-1:~# chmod +x mc

root@aj-test-1:~# mv mc /usr/local/bin/mc

root@aj-test-1:~# mc alias set local http://127.0.0.1:9000 minioadmin minioadmin

root@aj-test-1:~# mc admin info local
●  127.0.0.1:9000
  Uptime: 5 minutes
  Version: 2022-08-25T07:17:05Z
  Network: 1/1 OK
  Drives: 1/1 OK
  Pool: 1

Pools:
  1st, Erasure sets: 1, Disks per erasure set: 1

1 drive online, 0 drives offline

如果您看到类似这样的消息,则可以确定 MinIO 已经启动。稍后,我们将创建一个桶并添加一些对象以进一步测试 MinIO。

使用 Journalbeat 发送 Journalctl 日志

Elasticsearch 使用 Beats 从各种来源收集数据,并且有不同类型的 Beats。Journalbeat 就是其中一个 Beat;从名称可以看出它读取 journalctl 日志。在本例中,我们将读取 MinIO 的 journalctl 日志。

  • 安装 Journalbeat 软件包。大多数常见操作系统都有不同的软件包,但这里我们将在这台基于 Ubuntu 的机器上安装 .DEB 软件包。

root@aj-test-1:~# curl -L -O https://artifacts.elastic.co/downloads/beats/journalbeat/journalbeat-7.15.2-amd64.deb

root@aj-test-1:~# dpkg -i journalbeat-7.15.2-amd64.deb

  • 更新 01-example.conf 文件,使用以下配置。这允许 Logstash 在端口 5044 上监听各种Beats,在本例中为 Journalbeat。

root@aj-test-1:~# vi /etc/logstash/conf.d/01-example.conf

input {
  beats {
    port => 5044
  }
}

output {
elasticsearch {
  hosts => ["localhost:9200"]
  index => "minio-journalctl-logs-%{+YYYY.MM.dd}"
}
}

  • 重新启动 Logstash 使设置生效。

root@aj-test-1:~# systemctl restart logstash

  • 修改journalbeat.yml以显式添加minio.service。您可以配置各种输入使其更广泛,并收集所有服务的全部journalctl日志。

root@aj-test-1:~# vi /etc/journalbeat/journalbeat.yml

15 journalbeat.inputs:
16   # 应爬取和获取的路径。可能的值为文件和目录。
17   # 设置目录时,其下的所有日志都会合并。
18   # 为空时开始读取本地日志。
19 - id: minio.service
20   paths: []
21   include_matches:
22     - _SYSTEMD_UNIT=minio.service

  • 在同一个journalbeat.yml文件中,修改输出以发送到我们之前在01-example.conf中配置的Logstash Beats端口5044
  • 注释掉output.elasticsearch,因为我们希望日志通过Logstash进行解析。

122 # ----------------------- Elasticsearch 输出 ------------------------
123 #output.elasticsearch: ←—----- 注释掉这些行
124   # 要连接的主机数组。
125   #hosts: ["localhost:9200"] ←—----- 注释掉这些行


[...截断...]


135 # ------------------------- Logstash 输出 ---------------------------
136 output.logstash: ←—----- 取消注释掉这些行
137   # Logstash 主机
138   hosts: ["localhost:5044"] ←—----- 取消注释掉这些行

  • 启用并启动journalbeat

root@aj-test-1:~# systemctl enable journalbeat

root@aj-test-1:~# systemctl start journalbeat

  • 使用/_cat/端点查看新的索引。您应该看到如下内容

root@aj-test-1:~# curl -s localhost:9200/_cat/indices | grep -i minio

yellow open minio-journalctl-logs-2022.08.26 J72DiduZQqWZfzt_Ml7Rvw 1 1 24      0 314.8kb 314.8kb

  • 应该已经有一些日志了。如果您没有看到日志,您可以执行以下两种操作之一
  • 修改Kibana仪表板中的日期以扩大日志范围。这可能是因为在我们启动MinIO和安装Journalbeat之间,日志可能比Kibana中的默认范围(通常为15分钟)更旧。因此,如果扩大范围,您应该可以看到旧的日志。
  • 如果您需要立即获取一些新的journalctl日志,只需如下重新启动MinIO

root@aj-test-1:~# systemctl restart minio

  • 如果您转到Kibana仪表板,您应该几乎立即在索引minio-journalctl-logs-*中看到新的日志。

如果您看到类似上述内容,则MinIO journalctl日志现在位于Elasticsearch中。

使用Filebeat读取MinIO中的Apache日志

假设您已经在MinIO存储桶中有一些日志,并且想要将它们加载到Elasticsearch中。此操作的一个可能的用例是存档日志。有时您只想恢复特定范围的日志进行分析,并且在完成分析后,您将从集群中删除这些索引。这通过避免存储每天不使用的旧日志来节省成本。

我们将使用Filebeat的S3输入从MinIO存储桶中读取。

  • 在MinIO中创建一个存储桶来存储Apache服务器日志。

root@aj-test-1:~# mc mb local/apachelogs
存储桶已成功创建 `local/apachelogs`。

  • 将Apache日志复制到存储桶

root@aj-test-1:~# mc cp /var/log/apache2/access.log local/apachelogs
/var/log/apache2/access.log:     1.55 KiB / 1.55 KiB ┃▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓┃ 117.96 KiB/s 0s

root@aj-test-1:~# mc ls local/apachelogs
[2022-08-29 18:37:31 UTC] 1.5KiB STANDARD access.log

  • 下载并安装 Filebeat

root@aj-test-1:~# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-8.4.0-amd64.deb

root@aj-test-1:~# dpkg -i filebeat-8.4.0-amd64.deb

  • 使用以下配置在 filebeat.yml 中配置 Filebeat
  • 从 S3 源输入,在本例中为 MinIO 的 apachelogs 桶。
  • 输出到我们的 Logstash 处理器

root@aj-test-1:~# vi /etc/filebeat/filebeat.yml

15 filebeat.inputs:
16 - type: aws-s3
17   non_aws_bucket_name: apachelogs
18   number_of_workers: 5
19   bucket_list_interval: 60s
20   access_key_id: minioadmin
21   secret_access_key: minioadmin
22   endpoint: http://localhost:9000
23   expand_event_list_from_field: Records

[...TRUNCATED...]

138 # ------------------------ Elasticsearch 输出 -----------------------
139 #output.elasticsearch: ← 注释掉这些行
140   # 要连接的主机数组。
141   #hosts: ["localhost:9200"] ← 注释掉这些行

[...TRUNCATED...]

151 # -------------------------- Logstash 输出 --------------------------
152 output.logstash: ← 取消注释掉这些行
153   # Logstash 主机
154   hosts: ["localhost:5044"] ← 取消注释掉这些行

  • 在我们启动 Filebeat 并通过 Logstash 将日志发送到 Elasticsearch 之前,让我们更新我们可靠的 01-example.conf Logstash 配置,以便将这些日志发送到新的索引。

root@aj-test-1:~# vi /etc/logstash/conf.d/01-example.conf

10    index => "apache-%{+YYYY.MM.dd}"

  • 重新启动 Logstash 以使更改生效。

root@aj-test-1:~# systemctl restart logstash

  • 如果您现在在 Kibana 中检查 apache-*,您应该会看到一些 Apache 日志。

最终想法

之前,我们向您展示了如何使用 MinIO 将 Elasticsearch 索引进行快照、备份和恢复。

在本期中,我们向您展示了如何

  • 将 MinIO Journalctl 日志发送到 Elasticsearch
  • 将 Apache 日志从 MinIO 桶发送

您可以更进一步,将 Filebeat 与 Kafka 通知集成。这允许您利用MinIO 的存储桶通知功能,在添加新对象时启动 Filebeat 读取存储桶,而不是每隔几秒轮询一次。

现在,您对 MinIO 在漂亮的 Kibana 仪表盘中执行的操作有了更好的了解。不仅如此,我们还向您展示了如何将日志从 MinIO 存储桶按需加载到您选择的索引中,而不是将大量数据存储在 Elasticsearch 集群中,这可能会变得非常昂贵。这样,一旦您完成分析,就可以丢弃该索引。MinIO 可以无缝地融入现有的 DevOps 实践和工具链,从而可以与各种 Elasticsearch 工作流集成。

有问题?想开始使用?在Slack上联系我们。