MinIO 作为 Elasticsearch 冻结层

MinIO as ElasticSearch Frozen Tier

为了平衡性能、容量和成本,ElasticSearch 历来支持几种类型的层级:热层、温层和冷层。热层保存正在积极使用的数据,是最新且最棒的数据,以高速提供,可能来自 NVMe。温层用于成本敏感的数据,其中速度和性能略有牺牲,数据被放在较慢的硬件上,例如 HDD。冷存储通常是用于存放单个副本的本地存储,这些数据不需要经常访问,通过避免存储同一文件的多个副本来节省存储容量。

热层、温层和冷层之间的一个共同点是,在每种配置中至少有一个数据的本地副本。除了上述层级之外,ElasticSearch 还支持冻结层。冻结层与其他三个层级不同,因为它不存储任何本地数据。此层级中的所有数据都完全存储在对象存储中,例如 MinIO。将数据存储在 MinIO 对象存储中后,可以使用 ElasticSearch 的挂载 API 部分挂载冻结层数据以使其可搜索。

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

简而言之,我们部署 Elasticsearch 来帮助我们排查系统问题,因此我们需要设计能够反映我们工作流程并支持快速诊断和纠正的系统。作为一名 DevOps 工程师,您可以使用的一个最重要的东西是您手头用于关联目的的日志和指标数量。通过检查历史数据,您将能够查看趋势、查找模式并相应地采取行动。如果您有一个服务看似随机地出现故障,您可能希望尽可能地回溯以识别模式并发现原因。但是,在快速存储(例如 NVMe)上存储 2 年的可搜索数据可能会占用大量昂贵的驱动器空间。通常,组织中的人员最常搜索过去几周的数据,因此这些数据存储在最快的硬件上。但随着数据变得越来越旧,它对于立即故障排除的用处越来越小,并且不需要像其他数据一样快速搜索。

作为一名 DevOps 工程师,您可以按如下方式分层您的数据

层级

年龄

预期用途

存储技术

热层

0-1 个月

最新的查询

NVMe 驱动器

温层

1-3 个月

最少的查询

SSD 驱动器

冷层

3-6 个月

不频繁的查询

传统 HDD

冻结层

> 6 个月

历史查询

对象存储

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

MinIO 是 Elasticsearch 的完美伴侣,因为它拥有业界领先的性能和可扩展性,这使得每个数据密集型工作负载(不仅仅是 Elasticsearch)都触手可及。MinIO 能够提供强大的性能 - 最近的一项基准测试 在仅使用 32 个现成的 NVMe SSD 节点的 GET 操作中实现了 325 GiB/s(349 GB/s),在 PUT 操作中实现了 165 GiB/s(177 GB/s)。

除了速度和可扩展性之外,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) 完成的,可以在每个对象的基础上使用唯一密钥覆盖它。

通过将 Elasticsearch 冻结层保存在 MinIO 中,我们可以洞察 Kibana 图形界面中显示的模式和警报,以便您可以运行进一步的分析,甚至可以根据某些阈值进行警报。例如,您可能希望检查性能趋势或瓶颈,并尝试识别工作负载类型或一天中的时间模式。您可以探索所需的所有历史数据,而无需手动从 ElasticSearch 集群中还原和删除数据。

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

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

设置 Elasticsearch 冻结层

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

MinIO

归档下载并安装最新版本的 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 0% 100%
mkfs.xfs -L minio-data /dev/xvdb1
mkdir -p /mnt/minio/data
echo "LABEL=minio-data /mnt/minio/data xfs 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

下载存储库以安装 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关于数据生命周期管理的博文

启动 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

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

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"
    }
  }
}

现在让我们配置一个名为minio_frozen的ILM策略,我们可以在特定参数上将数据从热层滚动到冻结层。为了简单起见,我们省略了温层。在这种情况下,如果数据已超过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。

通过不在ElasticSearch中存储所有数据,您可以减少所需的存储容量,从而节省大量数据存储成本,同时在商品硬件上运行MinIO以获得最佳的性能成本比。MinIO使您的冻结层“热”,并提供业界领先的性能,使查询Elasticsearch冻结层的速度比任何其他此成本的数据存储都要快。

如果您已设置了由MinIO支持的冻结层,或者对设置有任何疑问,请务必通过Slack与我们联系!