MinIO 简介
MinIO 是一个高性能、开源的分布式对象存储服务,它兼容亚马逊 S3 云存储服务接口,适合存储大容量非结构化数据,如图片、视频、日志文件等。MinIO 以其轻量级、易部署和高性能而著称,支持多种开发语言并通过 SDK 快速集成使用。此外,MinIO 还提供了丰富的 API 和客户端工具,支持多种编程语言和应用场景,使得数据存储和访问更加灵活和便捷。
相对于其他开源组件而言,MinIO 官方和社区为它提供了良好的可观测性,在官网中提供了基于 Prometheus 或 InfluxDB 的 Metrics 采集与告警、将服务日志和审计日志发送给第三方、暴露出 MinIO 集群的 Healthchecks 接口,甚至提供了官方的 Grafana 看板。不过要实现 MinIO 全面的可观测性,免不了需要各种监控工具的“大杂烩”。为了进一步提升我们的工作效率,降低监控观测成本,我们迫切需要一站式可观测性解决方案来搞定 MinIO 的全面观测。
观测云
观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理等多项功能,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。
部署 DataKit
DataKit 是一个开源的、跨平台的数据收集和监控工具,由观测云开发并维护。它旨在帮助用户收集、处理和分析各种数据源,如日志、指标和事件,以便进行有效的监控和故障排查。DataKit 支持多种数据输入和输出格式,可以轻松集成到现有的监控系统中。
登录观测云控制台,在 集成 -> DataKit 选择对应安装方式,当前采用 Linux 主机部署 DataKit 。
将安装命令复制到服务器上执行,服务器会自动下载和安装 DataKit 服务,安装完成后使用 datakit monitor 命令,若有如下输出则说明 DataKit 安装成功。
[root@iv-ydkebfhreot56on9kubd ~]# datakit monitor
采集 MinIO 指标
MinIO 官方提供了基于 Prometheus 风格的指标,可供 Prometheus 等相关观测工具进行抓取,用于分析和告警。 MinIO 的指标 endpoint 有 API metrics、Audit metrics、Cluster metrics、Debug metrics 等多个分类,可以从各个 endpoint 分别获取,详见文档。MinIO 最新的 Metrics version 3 允许从一个 endpoint (/minio/metrics/v3)获取到所有指标,给指标采集带来了不小的便利性。
默认情况下,观测工具去抓取 MinIO metrics 时需要先用 mc 命令生成 bearer token ,参考文档。如果需要免密抓取,可以通过 MinIO 环境变量中的 MINIO_PROMETHEUS_AUTH_TYPE 将指标暴露方式设置为 Public ,具体方式为:修改 /etc/default/minio 文件,将 MINIO_PROMETHEUS_AUTH_TYPE="public" 添加到文件中。
# MINIO_ROOT_USER and MINIO_ROOT_PASSWORD sets the root account for the MinIO server.
# This user has unrestricted permissions to perform S3 and administrative API operations on any resource in the deployment.
# Omit to use the default values 'minioadmin:minioadmin'.
# MinIO recommends setting non-default values as a best practice, regardless of environment
MINIO_ROOT_USER=xxxxx
MINIO_ROOT_PASSWORD=xxxxx
# MINIO_VOLUMES sets the storage volume or path to use for the MinIO server.
MINIO_VOLUMES="/mnt/data"
# MINIO_OPTS sets any additional commandline options to pass to the MinIO server.
# For example, `--console-address :9001` sets the MinIO Console listen port
MINIO_OPTS="--console-address :9001"
MINIO_PROMETHEUS_AUTH_TYPE="public"
然后重启 MinIO 服务生效。
[root@iv-ydkebfhreot56on9kubd prom]# systemctl restart minio.service
进入 DataKit 并开启 prom 采集器,该采集器可以获取各种 Prometheus Exporters 暴露出来的指标数据,因此只要配置相应的 MinIO Exporter 地址,就可以将 MinIO 指标数据接入,开启方式如下:
[root@iv-ydkebfhreot56on9kubd prom]# cd /usr/local/datakit/conf.d/prom/
[root@iv-ydkebfhreot56on9kubd prom]# cp prom.conf.sample prom.conf
修改该采集器配置文件,把 MinIO 的 metrics endpoint 填写到 urls 字段中。本文使用的是 Metrics version 3 ,因此如下的 endpoint(/minio/metrics/v3) 可以采集到所有类型的 MinIO 指标。
保存配置文件后执行 datakit service -R 命令重启 DataKit。
[root@iv-ydkebfhreot56on9kubd prom]# datakit service -R
通过 datakit monitor 工具查看采集器是否正常开启,且是否实时采集、上报 MinIO 指标。
[root@iv-ydkebfhreot56on9kubd prom]# datakit monitor
下图中左下方的"prom"表示 prom 采集器已经成功开启,右下方的"prom/minio"表示该采集器正在采集并上报 MinIO 的指标。 LastFeed 字段显示了上一次采集上报的时间, AvgCost 字段显示了平均消耗时间。
稍等片刻后即可在观测云控制台上看到 MinIO 的指标,进入「指标」-「指标管理」即可看到 minio 指标集,点击后可看到该指标集下的指标和标签。本文的 MinIO 实验环境安装 DataKit 数分钟后,DataKit 采集到了80个 MinIO 指标,包括 cluster_health、cluster_erasure、scanner、system 等几个分类,在生产环境下指标将更加丰富。
采集 MinIO 日志
MinIO 官方提供了将服务端日志(Server logs)和审计日志(Audit logs)通过 HTTP webhook 推送到第三方日志分析平台的配置指引。
- 服务端日志(Server logs):包含记录在系统控制台中的 minio server 操作。 服务端日志支持对操作进行日常监控和故障排除。
- 审计日志(Audit logs):是关于 MinIO 部署中每个操作更细粒度的描述。 审计日志支持需要对操作进行详细跟踪的安全标准和规定。
在配置日志推送后, MinIO 会通过 PUT 请求,以 JSON 格式将日志输出到第三方日志平台。下面我们演示如何将 MinIO 的服务端日志(Server logs)推送到观测云进行分析。
首先,您需要在 DataKit 上打开 logstreaming 采集器,具体方法为进入 DataKit 的如下路径,将 logstreaming.conf.sample 复制一份成为 logstreaming.conf 。
[root@iv-ydkebfhreot56on9kubd datakit]# cd /usr/local/datakit/conf.d/log/
[root@iv-ydkebfhreot56on9kubd log]# cp logstreaming.conf.sample logstreaming.conf
配置文件保持默认即可,无需修改。
# {"version": "1.64.1", "desc": "do NOT edit this line"}
[inputs.logstreaming]
ignore_url_tags = false
## Threads config controls how many goroutines an agent cloud start to handle HTTP request.
## buffer is the size of jobs' buffering of worker channel.
## threads is the total number fo goroutines at running time.
# [inputs.logstreaming.threads]
# buffer = 100
# threads = 8
## Storage config a local storage space in hard dirver to cache trace data.
## path is the local file path used to cache data.
## capacity is total space size(MB) used to store data.
# [inputs.logstreaming.storage]
# path = "./log_storage"
# capacity = 5120
保存后重启 DataKit ,确保配置生效。
[root@iv-ydkebfhreot56on9kubd log]# datakit service -R
Restart DataKit OK
此时通过 datakit monitor 命令可以看到已经启用了 logstreaming 采集器。
[root@iv-ydkebfhreot56on9kubd log]# datakit monitor
如上图所示, DataKit 已经开启了 logstreaming 采集器。参考观测云集成文档的描述, logstreaming 采集器提供的 endpoint 为 http://127.0.0.1:9529/v1/write/logstreaming?type=firelens 。
注意:如果不是在 MinIO Server 上安装的 DataKit,需要将 127.0.0.1 替换为实际 IP 地址,同时需要在 datakit.conf(位于 /usr/local/datakit/conf.d/datakit.conf)中将 DataKit 的监听地址放开为 0.0.0.0:9529 。
[http_api]
rum_origin_ip_header = "X-Forwarded-For"
listen = "localhost:9529"
#修改为
# listen = "0.0.0.0:9529"
接下来我们可以在 MinIO 上配置服务端日志(Server logs)和审计日志(Audit logs)的 webhook 推送,将两类日志配置到上述 endpoint 中。
参考如下配置命令将 Server logs 推送到观测云。
#配置Server logs推送到观测云
mc admin config set local/ logger_webhook:guance endpoint="http://127.0.0.1:9529/v1/write/logstreaming?type=firelens"
#查看配置
[root@iv-ydkebfhreot56on9kubd conf.d]# mc admin config get local/ logger_webhook
logger_webhook enable=off endpoint= auth_token= client_cert= client_key= proxy= batch_size=1 queue_size=100000 queue_dir= max_retry=0 retry_interval=3s http_timeout=5s
logger_webhook:guance endpoint=http://127.0.0.1:9529/v1/write/logstreaming?type=firelens auth_token= client_cert= client_key= proxy= batch_size=1 queue_size=100000 queue_dir= max_retry=0 retry_interval=3s http_timeout=5s
参考如下配置命令将 Audit logs 推送到观测云。
#配置Audit logs推送到观测云
mc admin config set ALIAS/ audit_webhook:guance_audit \
endpoint="http://127.0.0.1:9529/v1/write/logstreaming?type=firelens"
#查看配置
[root@iv-ydkebfhreot56on9kubd conf.d]# mc admin config get local/ audit_webhook
audit_webhook enable=off endpoint= auth_token= client_cert= client_key= batch_size=1 queue_size=100000 queue_dir= max_retry=0 retry_interval=3s http_timeout=5s
audit_webhook:guance_audit endpoint=http://127.0.0.1:9529/v1/write/logstreaming?type=firelens auth_token= client_cert= client_key= batch_size=1 queue_size=100000 queue_dir= max_retry=0 retry_interval=3s http_timeout=5s
重启 MinIO 服务。
[root@iv-ydkebfhreot56on9kubd conf.d]# systemctl restart minio.service
此时可以查看 datakit monitor 命令,观察 logstreaming 采集器的实时上报情况,如果出现下图所示的情况,即 logstreaming/default 采集器出现在 datakit monitor 中,则表明刚才的配置生效, MinIO 的服务端日志(Server logs)或审计日志(Audit logs)已经开始上报到观测云。
在观测云界面的「日志」查看器中查找 MinIO 日志,下图为成功上报至观测云的审计日志(Audit logs)。
下图为成功上报至观测云的服务端日志(Server logs)。
读者可以基于官方集成文档中的 source 参数、service 参数或者自定义 tags 来区分两种不同类型的 MinIO 日志,如果有进一步的分析、看板需求,则需要用到 pipeline 功能对日志进行切割处理。 MinIO 官方已经提供了日志结构,读者可根据观测云的 pipeline 功能对日志进行切割,以实现精细化分析需求。
对 MinIO 健康检查 API 进行拨测
MinIO 官网提供了 4 个健康检查的 API ,分别是节点在线情况、集群写仲裁、集群读仲裁、集群维护检查,具体情况如下:
API | API名称 | 监控意义 | API地址 | 正常响应代码 | 异常响应代码 |
---|---|---|---|---|---|
节点在线情况 | Node liveness | 拨测 MinIO 服务器是否在线 | https://minio.example.net:9000/minio/health/live | 200 OK | 其他任何状态码 |
集群写仲裁 | Cluster Write Quorum | 拨测 MinIO 集群是否具备 写入仲裁 | https://minio.example.net:9000/minio/health/cluster | 200 OK | 503 Service Unavailable |
集群读仲裁 | Cluster Read Quorum | 拨测 MinIO 集群是否具备 读取仲裁 | https://minio.example.net:9000/minio/health/cluster/read | 200 OK | 503 Service Unavailable |
集群维护检查 | Cluster Maintenance Check | 拨测 MinIO 集群是否可以在指定 的 MinIO 服务器因维护而关闭时维持读写 | https://minio.example.net:9000/minio/health/cluster?maintenan... | 200 OK | 412 Precondition Failed |
备注:写仲裁和读仲裁是确保 MinIO 在分布式存储环境中能够可靠地进行数据读写操作的最小在线驱动器数量要求。
下面以配置“节点在线情况”健康检查 API 为例,向各位读者展示观测云的「可用性监测」配置。在进入到「可用性监测」后,点击「新建」并选择「HTTP拨测」,首选输入拨测的 UR L地址,例如 https://minio.example.net:9000/minio/health/live ,然后配置「可用判断」,配置为「状态码」是 200 方可判定拨测结果为成功。
然后选择拨测节点,观测云 SaaS 平台上提供了国内外的十余个公网拨测站点,一定程度上满足了客户多点拨测的需要。当然用户也可以使用 DataKit 来轻松自建节点,详见 https://docs.guance.com/usability-monitoring/self-node/ 。
依次配置完成后几个健康检查 API 后,可以在「任务」中看到这几个拨测任务。
稍等片刻后即可在「概览」「查看器」中看到拨测的数据,从而了解 MinIO 集群的实际运行情况。
关键指标
官方推荐的监控指标和大模型提供的知识,我们选择了以下 MinIO 的关键指标来进行仪表板绘制,更多监控指标可参考 MinIO 官网文档。
Metrics | Description | Lables |
---|---|---|
cluster_health_drives_count | Count of all drives in the cluster. | |
cluster_health_drives_online_count | Count of online drives in the cluster. | |
cluster_health_capacity_raw_total_bytes | Total cluster raw storage capacity in bytes. | |
cluster_health_capacity_raw_free_bytes | Total cluster raw storage free in bytes | |
api_requests_total | Total number of requests. | name , type , pool_index , server |
api_requests_errors_total | Total number of requests with 4xx or 5xx errors. | name , type , pool_index , server |
api_requests_incoming_total | Total number of incoming requests. | type , pool_index , server |
cluster_usage_buckets_total_bytes | Total bucket size in bytes. | bucket |
cluster_usage_buckets_objects_count | Total object count in bucket. | bucket |
cluster_usage_objects_size_distribution | Cluster object size distribution. | range |
system_drive_used_bytes | Total storage used on a drive in bytes. | drive , set_index , drive_index , pool_index , server |
system_drive_free_bytes | Total storage free on a drive in bytes. | drive , set_index , drive_index , pool_index , server |
system_drive_online_count | Count of online drives. | pool_index , server |
system_drive_writes_kb_per_sec | Kilobytes written per second on a drive. | drive , set_index , drive_index , pool_index , server |
system_drive_api_latency_micros | Average last minute latency in µs for drive API storage operations. | drive , api , set_index , drive_index , pool_index , server |
system_drive_writes_await | Average time for write requests served on a drive. | drive , set_index , drive_index , pool_index , server |
场景视图
MinIO 官方文档中提供了多个基于 v2 版本 metrics 的仪表板,参考官方文档,如果我们使用 v3 版本 metrics 则需要自行绘制仪表板。本文提供了一个基于 MinIO SNSD(Single Node,Single Drive)架构部署,如果是 MinIO 生产环境 MNMD(Multi Node,Multi Drive)部署,可以在此基础上根据官方推荐指标补充图表,这在观测云上将是非常轻松的操作。
注意:本仪表板使用的是 MinIO v3 版 Metrics 来制作,如果使用 v2 版 Metrics 则无法获得相同效果,敬请留意。
仪表板效果如下所示:
监控器(告警)
在观测云上可以针对指标、日志、可用性监测结果等多种数据配置监控器,因此刚才我们介绍的关于 MinIO 的所有观测数据,都可以在观测云的监控告警功能中配置告警规则,下面以三个典型的故障为示例,向各位读者展示如何使用观测云进行 MinIO 监控告警。
监控器1:在线节点数量小于x告警
对应指标:cluster_health_nodes_online_count
简要描述:当 MinIO 集群中有节点离线(offline数量大于0)时进行告警
- 告警通知
- 告警详情
监控器2:驱动器剩余空间不足
对应指标:system_drive_free_bytes
简要描述:当集群中有驱动器的剩余空间低于阈值时进行告警
- 告警邮件通知
- 告警详情
监控器3:api 操作延时过高
简要描述:当某个驱动器的 API 操作延时过高,超过指定阈值时,观测云可发出告警进行提醒
- 告警通知
- 告警详情
总结
本文从指标、日志、可用性监测、可视化仪表板、监控告警这五个角度展示了如何使用观测云这个一体化观测平台对 MinIO 进行全面观测,大大减少了管理多个运维工具的负担,让 DevOps 团队将更多精力投放到更高价值的工作中。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。