MinIO 作为 ElasticSearch 冻结层

MinIO 作为 ElasticSearch 冻结层

为了平衡性能、容量和成本,ElasticSearch 历来支持几种类型的层:热层、温层和冷层。热层保存活跃使用的数据,并且是高速可用的最新和最大的数据,可能来自 NVMe。暖层用于对成本敏感的数据,其中会牺牲一点速度和性能,并将数据放在较慢的硬件上,可能是 HDD。冷存储通常是本地存储,用于存放不需要经常访问数据的单个副本,通过避免存储同一文件的多个副本来节省存储容量。

热层、温层和冷层之间的共同点是,在这些配置中的每一个上至少有一个数据的本地副本。除了以上层级,ElasticSearch 还支持冻结层级冻结层不同于其他三层,因为它不在本地存储任何数据。该层中的所有数据都完全存储在 MinIO 等对象存储中。一旦数据存储在 MinIO 对象存储中,您就可以使用 ElasticSearch Mount API部分挂载冻结层数据以使其可搜索。

为什么将 Elasticsearch 部署设计为围绕多个层很重要?为什么不采用单层并不断添加新数据和删除旧数据?

简短的回答是,我们部署 Elasticsearch 是为了帮助我们对系统进行故障排除,因此我们需要设计能够反映我们的工作流程并能够快速诊断和纠正的系统。作为一名 DevOps 工程师,您可以处理的最重要的事情之一是您手头上用于关联目的的日志和指标的数量。通过检查历史数据,您将能够看到趋势、找到模式并采取相应的行动。如果您有一项看似随机出现异常行为的服务,您可能希望尽可能地回溯以确定模式并找出原因。但是,将 2 年的可搜索数据存储在快速存储(例如 NVMe)上会占用大量昂贵的驱动器空间。一般来说,过去几周的数据可能是组织中人们搜索最多的,因此存储在最快的硬件上。

作为 DevOps 工程师,您可能会按如下方式对数据进行分层:

等级

年龄

预期用途

存储技术

热的

0-1个月

最新查询

NVMe 驱动器

温暖的

1-3个月

最少的查询

固态硬盘

寒冷的

3-6个月

不经常查询

主轴硬盘

冰冻的

> 6 个月

历史查询

对象存储

MinIO 经常用于存储Elasticsearch 快照,如果您使用 MinIO 来存储您的 Elasticsearch 冻结层,您可以使用您已经知道并喜欢的相同 MinIO API 来搜索这些快照。Elasticsearch 在与存储分层一起使用时效率更高,这降低了 Elasticsearch 的总拥有成本,此外,您还可以获得将数据写入 MinIO 的额外好处,这些数据是不可变的、版本化的和受保护此外,将 Elasticsearch 分层与 MinIO 对象存储结合使用可使数据文件可供其他云原生机器学习和分析应用程序使用。

MinIO 是 Elasticsearch 的完美搭档,因为它具有行业领先的性能和可扩展性,这使得每个数据密集型工作负载,而不仅仅是 Elasticsearch,都触手可及。MinIO 具有惊人的性能——最近的基准测试在 GET 上达到了 325 GiB/s (349 GB/s),在 PUT 上达到了 165 GiB/s (177 GB/s),只有 32 个现成的 NVMe SSD 节点。

除了速度和可扩展性之外,MinIO 还支持这些开箱即用的企业功能,这使得将 MinIO 作为冻结层后端运行变得更加容易。

  • 安全访问 ACL 和 PBAC:支持带有内置 IDP 的 IAM S3 样式策略,请参阅MinIO 最佳实践 - 安全和访问控制以获取更多信息。

  • 分层:对于不经常访问的数据,您可以将数据虹吸到另一个运行 MinIO 的冷存储中,这样您就可以在最好的硬件上优化最新数据,而无需使用的数据占用空间。

  • 对象锁定和保留:MinIO 支持对象锁定(保留),它强制执行一次写入并为基于持续时间和无限期合法持有的许多操作做好准备。这允许关键数据保留合规性并满足 SEC17a-4(f)、FINRA 4511(C) 和 CFTC 1.31(c)-(d) 要求。

  • MinIO 的密钥加密服务 (KES)将这一切结合在一起。SSE 使用KES 和 Vault来执行加密操作。KES 服务本身是无状态的,在将数据存储在 Vault 中时充当中间层。使用 MinIO,您可以设置各种级别的粒度和可自定义的加密。您始终可以选择基于每个对象进行加密,但是,我们强烈建议在存储桶上自动设置 SSE-KMS 加密,以便默认情况下对所有对象进行加密。加密是使用存储在 Vault 中的特定外部密钥 (EK) 完成的,可以使用唯一密钥在每个对象的基础上覆盖它。

通过在 MinIO 中保存 Elasticsearch 冻结层,我们可以看到 Kibana 图形界面中显示的模式和警报,因此您可以运行进一步的分析,甚至可以根据特定阈值发出警报。例如,您可能想要检查性能趋势或瓶颈,并尝试识别工作负载类型或一天中时间的模式。您可以探索所需的所有历史数据,而无需手动从 ElasticSearch 集群中恢复和删除数据。

在 Elasticsearch 中配置不同的层时,搜索冻结层时会牺牲一些性能,因为没有数据存储在本地。因此,管理您的数据文件并根据您的特定组织需求将它们放置在所需的层中非常重要。ElasticSearch 允许 Kibana 在后端查询冻结层并在可用时显示结果。它还在查询数据时提供精确度,它只会索引正在查询的数据并只拉取必要的数据。

接下来,我们将向您展示如何使用索引生命周期管理 (ILM) 策略配置 Elasticsearch 以将数据滚动到保存在 MinIO 中的冻结层。

设置 Elasticsearch 冻结层

为了设置冻结层,我们需要以分布式模式安装 MinIO,这样您的数据就有了另一层冗余,我们还将安装一个 ElasticSearch 节点。我们将以 root 用户身份执行以下所有命令。

最小IO

从存档中下载并安装最新版本的 MinIO 

wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20221212192727.0.0_amd64.deb -O minio.deb
dpkg -i minio.deb

为 MinIO 服务创建一个用户和组以运行

groupadd -r minio-user
useradd -M -r -g minio-user minio-user

附加驱动器然后格式化并安装卷

parted /dev/xvdb mklabel msdos
parted -a opt /dev/xvdb mkpart primary ext4 0% 100%
mkfs.ext4 -L minio-data /dev/xvdb1
mkdir -p /mnt/minio/data
echo "LABEL=minio-data /mnt/minio/data ext4 defaults 0 2" >> /etc/fstab
mount -a

确保挂载目录的权限与之前创建的用户组匹配

chown minio-user:minio-user /mnt/minio/data

将此节点配置复制到另外 3 个节点,总共 4 个节点。

配置完 4 个节点后,/etc/default/minio按如下方式配置它们

echo "MINIO_VOLUMES=\"http://server-{1...3}.minio.local:9000/mnt/minio/data\"" >> /etc/default/minio
echo "MINIO_ROOT_USER=\"minioadmin\"" >> /etc/default/minio
echo "MINIO_ROOT_PASSWORD=\"minioadmin\"" >> /etc/default/minio

使用类似 Ansible 的东西,在所有 4 个节点上启动 MinIO

systemctl start minio.service

在 MinIO 中为要存储的冻结层创建一个桶

mc alias set minio http://<minio_ip>:9000 minioadmin minioadmin
mc mb minio/esfrozentier

弹性搜索

下载存储库以安装 ElasticSearch

#  wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
#  sudo apt-get install apt-transport-https jq
#  echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list

安装 ElasticSearch 及其相关包。同时设置您的 PATH 以包含 ElasticSearch bin 目录

# sudo apt-get update
# sudo apt-get install elasticsearch
# export PATH=/usr/share/elasticsearch/bin:$PATH

打开 ElasticSearch 配置文件更新一些设置

vim /etc/elasticsearch/elasticsearch.yml

添加以下设置:

  • 禁用 xpack 安全性(确保在生产中启用它)

  • 将节点角色设置为冻结层

xpack.security.enabled: false
node.roles: ["data_frozen"]

保存配置文件。有关不同类型层的更多信息,请务必查看这篇关于数据生命周期管理的 ElasticSearch 博客文章

启动弹性搜索服务

#  sudo systemctl daemon-reload
#  systemctl start elasticsearch.service

ElasticSearch 服务启动需要两分钟。启动后,验证它是否按预期工作

# curl -s http://localhost:9200/_cluster/health | jq .{
    "cluster_name": "elasticsearch",
    "status": "green",
    "timed_out": false,
    "number_of_nodes": 1,
    "number_of_data_nodes": 1,
    "active_primary_shards": 4,
    "active_shards": 4,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 0,
    "delayed_unassigned_shards": 0,
    "number_of_pending_tasks": 0,
    "number_of_in_flight_fetch": 0,
    "task_max_waiting_in_queue_millis": 0,
    "active_shards_percent_as_number": 100}

为了在 ElasticSearch 中配置 S3,我们需要安装插件并重启 ElasticSearch

# elasticsearch-plugin install --batch repository-s3
# systemctl restart elasticsearch

使用 MinIO 集群管理员凭据配置 ElasticSearch 密钥库

#  echo "minioadmin" |  elasticsearch-keystore add --stdin --force s3.client.default.access_key
#  echo "minioadmin" |  elasticsearch-keystore add --stdin --force s3.client.default.secret_key

_snapshot使用我们的 MinIO 冻结层存储桶进行配置

curl -k -X PUT http://localhost:9200/_snapshot/frozentier_minio_repository?pretty -H 'Content-Type: application/json' -d '{
>   "type": "s3",
>   "settings": {
>     "bucket": "esfrozentier",
>     "endpoint": "http://<minio_ip>:9000",
>     "protocol": "http",
>     "path_style_access": "true",
>     "max_restore_bytes_per_sec": "5gb",
>     "max_snapshot_bytes_per_sec": "300mb"
>   }
> }'
{
"acknowledged" : true
}

验证快照存储库是否已正确配置

# curl -k -X POST http://localhost:9200/_snapshot/frozentier_minio_repository/_verify?pretty
{
  "nodes" : {
    "G_XlUdlKQr-sP_4QQ6hPtA" : {
      "name" : "ip-10-0-25-41"
    }
  }
}

现在让我们配置一个 ILM 策略,minio_frozen我们可以在其中根据特定参数将数据从热层滚动到冻结层。为简单起见,我们省略了暖层。在这种情况下,如果数据已存在 30 天或超过 1 TB,以先发生者为准,我们会将这些数据滚动到冻结层。

# curl -k -X PUT http://localhost:9200/_ilm/policy/minio_frozen?pretty -H 'Content-Type: application/json' -d '{
  "policy": {
    "phases" : {
      "hot" : {
        "actions" : {
          "rollover" : {
            "max_age" : "30d",
            "max_primary_shard_size" : "1tb"
          },
          "forcemerge" : {
            "max_num_segments" : 1
          }
        }
      },
      "frozen" : {
        "min_age" : "24h",
        "actions" : {
          "searchable_snapshot": {
            "snapshot_repository" : "frozentier_minio_repository"
          }
        }
      },
      "delete" : {
        "min_age" : "60d",
        "actions" : {
          "delete" : { }
        }
      }
    }
  }}'

一旦数据位于冻结层中,您可以将其恢复到另一个或同一集群中的热层。但是,推荐的方法是挂载它,这样您就不必制作多个数据副本,并且可以将相同的数据暴露给多个 Elasticsearch 集群

curl -k -X POST http://localhost:9200/_snapshot/frozentier_minio_repository/partial-<snapshot>/_mount?wait_for_completion=true -H 'Content-Type: application/json' -d '{
    "index": "my_docs",
    "renamed_index": "docs",
    "index_settings": {
    	"index.number_of_replicas": 0
    },
    "ignore_index_settings": [ "index.refresh_interval" ]
}'

好了,如您所见,通过 MinIO 配置和使用 Elasticsearch 冻结层非常简单,因此您可以以可预测和可持续的方式管理数据。

最后的想法

结合 MinIO 和 Elasticsearch 可以更快、更轻松地进行故障排除和日志分析。通过利用 MinIO 作为冻结层后端,您可以在部署中与云无关。无论是本地、云端还是混合模型,您都可以放心,您的团队可以根据您的分层需求在任何需要的地方使用 MinIO。完善分层图片,MinIO 本身支持进一步分层,您可以使用对象生命周期管理将旧数据虹吸到类似 Amazon Glacier 的东西

通过不在 ElasticSearch 中拥有所有数据,您可以减少所需的存储容量,从而实现可观的数据存储成本节省,同时在商品硬件上运行 MinIO 以获得最佳的性能成本比。MinIO 以行业领先的性能使您的冻结层变得“热”,这使得以这种成本查询 Elasticsearch 冻结层比任何其他数据存储都快得多。


上一篇 下一篇