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

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

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 图形界面中看到模式和警报,这将允许您运行进一步的分析甚至基于特定阈值的警报。例如,您可能想要检查趋势或瓶颈并尝试识别工作负载类型或一天中时间的模式。在这篇博文中,我们将向您展示如何以一种有助于洞察力的消费方式可视化这些模式。


MinIO-Elasticsearch--1-.jpeg


安装 ELK Stack

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

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

  • 添加 apt repo 密钥,在后面的步骤中不仅会下载 Elasticsearch,还会下载其他组件,例如 Logstash 和 Kibana。

  • 安装弹性搜索包。

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 是否正常工作。启动后,即使状态为running,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在这些示例中指出kibana.min.io以获得更好的可见性,但您可以使用.localhost/etc/hostslocalhost


Screen Shot 2022-08-25 at 10.30.35 AM.png


目前没有索引,但我们将在接下来的几步中添加它们。为了处理日志以加载我们的索引,我们需要安装 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服务。我们将在这里使用相同的原则,除了它将作为操作系统包安装而不是二进制文件。

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 admin 通过控制台验证 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 从各种来源收集数据,并且有不同类型的节拍。Journalbeat 就是这样一种 Beat;从名称可以看出它读取 journalctl 日志。我们将在这个例子中阅读 MinIO 的 journalctl 日志。

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   # Paths that should be crawled and fetched. Possible values files and directories.
17   # When setting a directory, all journals under it are merged.
18   # When empty starts to read from local journal.
19 - id: minio.service
20   paths: []
21   include_matches:
22     - _SYSTEMD_UNIT=minio.service

  • 在同一个journalbeat.yml文件中,修改输出以发送到我们5044之前在 01-example.conf 中配置的 Logstash Beats 端口。

  • 注释掉,output.elasticsearch因为我们希望通过 Logstash 解析日志。

1

122 # ----------------------- Elasticsearch Output ------------------------
123 #output.elasticsearch: ←—----- Comment these lines out
124   # Array of hosts to connect to.
125   #hosts: ["localhost:9200"] ←—----- Comment these lines out


[...TRUNCATED...]


135 # ------------------------- Logstash Output ---------------------------
136 output.logstash: ←—----- UNcomment these lines out
137   # The Logstash hosts
138   hosts: ["localhost:5044"] ←—----- UNcomment these lines out



  • 启用并启动 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-*


Screen Shot 2022-08-26 at 12.16.43 PM.png


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

使用 Filebeat 从 MinIO 读取 Apache 日志

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

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

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

root@aj-test-1:~# mc mb local/apachelogs
Bucket created successfully `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 filebeat.yml

  • 来自 S3 源的输入,在本例中为 MinIOapachelogs存储桶。

  • 输出到我们的 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 Output -----------------------
139 #output.elasticsearch: ← Comment these lines
140   # Array of hosts to connect to.
141   #hosts: ["localhost:9200"] ← Comment these lines

[...TRUNCATED...]

151 # -------------------------- Logstash Output --------------------------
152 output.logstash: ← UNcomment these lines
153   # The Logstash hosts
154   hosts: ["localhost:5044"] ← UNcomment these lines

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

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 日志。


Screen Shot 2022-08-29 at 4.05.24 PM.png


最后的想法

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

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

  • 将 MinIO Journalctl 日志发送到 Elasticsearch

  • 从 MinIO 存储桶发送 Apache 日志

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

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

有问题吗?想开始吗?在Slack上联系我们


上一篇 下一篇