HOOOS

Elasticsearch 可搜索快照 (Searchable Snapshots) 详解 S3 存储与 Frozen 数据层实战

0 112 老码农 Elasticsearch可搜索快照S3存储Frozen数据层数据归档
Apple

Elasticsearch 可搜索快照 (Searchable Snapshots) 详解 S3 存储与 Frozen 数据层实战

嘿,老伙计!咱们今天来聊聊 Elasticsearch 里的一个超级好用的功能——可搜索快照 (Searchable Snapshots)。这玩意儿能帮你把历史数据“冻”起来,放到便宜的存储里,还能随时随地搜,简直不要太爽!特别是对于那些需要长期保存大量数据,又不想被高昂的存储费用压垮的哥们来说,可搜索快照绝对是救星。

谁是目标用户?

  • 运维工程师 & 架构师: 想着怎么优化存储成本,提升系统性能,同时还得保证数据的可访问性?可搜索快照就是为你量身定制的。
  • 数据分析师: 长期需要查询历史数据,但又不想等太久?用上可搜索快照,查询速度嗖嗖的,效率翻倍。
  • 有大量历史数据需要归档的同学: 比如日志、审计、监控数据,用这个,轻松搞定!

为什么要用可搜索快照?

传统的 Elasticsearch 数据存储,要么是把所有数据都放在热节点里,性能好,但贵;要么是把老数据删掉,省钱,但数据就没了。可搜索快照完美解决了这个问题:

  • 降低存储成本: 将数据存储在 S3 兼容的对象存储中,价格便宜,存储空间想怎么扩就怎么扩。
  • 保持数据可搜索性: 即使数据在 S3 里,也能像在热节点里一样搜索,体验无缝衔接。
  • 提升查询性能: 针对性优化,查询速度杠杠的,让你告别漫长的等待。
  • 简化运维: 备份、恢复、迁移,一切都变得 so easy!

可搜索快照的工作原理

简单来说,可搜索快照就是把 Elasticsearch 集群中的数据创建快照,然后存储到 S3 兼容的对象存储中。当需要搜索这些数据时,Elasticsearch 会从对象存储中读取数据,并在集群中创建一个临时的“虚拟”索引,然后就可以像搜索普通索引一样搜索这些数据了。

具体来说,它干了这些事:

  1. 快照创建: 创建快照时,Elasticsearch 会读取索引的元数据和数据文件,并将它们存储在对象存储中。
  2. 元数据管理: Elasticsearch 会在集群中维护一个快照索引,用于跟踪所有快照的元数据,包括快照的创建时间、索引列表、存储位置等。
  3. 查询处理: 当你查询可搜索快照时,Elasticsearch 会根据查询条件,从对象存储中读取相关的数据文件,并在集群中创建一个临时的“虚拟”索引,这个虚拟索引会指向对象存储中的数据文件。然后,Elasticsearch 会在虚拟索引上执行查询,并将结果返回给你。
  4. 数据缓存: 为了提高查询性能,Elasticsearch 会对经常访问的数据进行缓存,减少从对象存储中读取数据的次数。

准备工作:配置 S3 兼容的对象存储

首先,你需要一个 S3 兼容的对象存储,比如 AWS S3、阿里云 OSS、腾讯云 COS 等。这里以 AWS S3 为例,讲解配置过程:

  1. 创建 S3 存储桶: 在 AWS 控制台中,创建一个 S3 存储桶。记住存储桶的名称和所在区域。

  2. 创建 IAM 用户: 创建一个 IAM 用户,并为其分配访问 S3 存储桶的权限。你可以创建一个自定义策略,只允许用户访问你的 S3 存储桶,提高安全性。以下是一个示例策略:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket"
          ],
          "Resource": "arn:aws:s3:::your-bucket-name"
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:DeleteObject",
            "s3:ListMultipartUploadParts",
            "s3:AbortMultipartUpload"
          ],
          "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
      ]
    }
    
    • your-bucket-name 替换为你的 S3 存储桶名称。
  3. 获取访问密钥: 在 IAM 用户管理页面,创建访问密钥(Access Key ID 和 Secret Access Key),并将它们保存好。这是 Elasticsearch 访问 S3 存储桶的凭据。

配置 Elasticsearch

  1. 安装 repository-s3 插件: 在 Elasticsearch 集群的每个节点上安装 repository-s3 插件。这个插件提供了 Elasticsearch 与 S3 交互的功能:

    # 在每个节点上执行
    ./bin/elasticsearch-plugin install repository-s3
    
  2. 配置 S3 存储库: 在 Elasticsearch 集群中,创建一个 S3 存储库。这个存储库用于存储快照:

    PUT /_snapshot/my_s3_repository
    {
      "type": "s3",
      "settings": {
        "bucket": "your-bucket-name",
        "region": "your-aws-region",
        "access_key": "your-access-key-id",
        "secret_key": "your-secret-access-key",
        "endpoint": "https://s3.your-aws-region.amazonaws.com", # 如果你的S3是自定义endpoint,比如阿里云OSS
        "compress": true # 开启压缩,节省存储空间
      }
    }
    
    • your-bucket-name 替换为你的 S3 存储桶名称。
    • your-aws-region 替换为你的 AWS 区域,比如 us-east-1
    • your-access-key-idyour-secret-access-key 替换为你的 IAM 用户的访问密钥。
    • endpoint 如果你的S3是自定义endpoint,比如阿里云OSS,需要配置。
    • compress 建议开启,可以节省存储空间。

    注意: 为了安全起见,不要直接在配置文件中硬编码访问密钥。建议使用 Elasticsearch 的密钥库(keystore)来存储敏感信息。使用方法如下:

    # 在 Elasticsearch 集群的每个节点上执行
    ./bin/elasticsearch-keystore add s3.client.default.access_key
    # 输入你的 Access Key ID
    ./bin/elasticsearch-keystore add s3.client.default.secret_key
    # 输入你的 Secret Access Key
    

    然后在创建 S3 存储库时,使用以下配置:

    PUT /_snapshot/my_s3_repository
    {
      "type": "s3",
      "settings": {
        "bucket": "your-bucket-name",
        "region": "your-aws-region",
        "access_key": "{{s3.client.default.access_key}}",
        "secret_key": "{{s3.client.default.secret_key}}",
        "endpoint": "https://s3.your-aws-region.amazonaws.com", # 如果你的S3是自定义endpoint,比如阿里云OSS
        "compress": true # 开启压缩,节省存储空间
      }
    }
    
  3. 创建快照: 创建索引,并向索引中写入一些数据。然后,创建一个快照:

    # 创建索引
    PUT /my_index
    {
      "settings": {
        "index.number_of_shards": 1,
        "index.number_of_replicas": 1
      },
      "mappings": {
        "properties": {
          "timestamp": {
            "type": "date"
          },
          "message": {
            "type": "text"
          }
        }
      }
    }
    
    # 写入一些数据
    POST /my_index/_doc
    {
      "timestamp": "2024-01-01T00:00:00",
      "message": "This is a test message."
    }
    
    POST /my_index/_doc
    {
      "timestamp": "2024-01-02T00:00:00",
      "message": "Another test message."
    }
    
    # 创建快照
    PUT /_snapshot/my_s3_repository/my_snapshot
    {
      "indices": "my_index",
      "ignore_unavailable": true,
      "include_global_state": false
    }
    
    • indices: 指定要备份的索引。"_all" 表示备份所有索引。
    • ignore_unavailable: 如果索引不存在,是否忽略错误。true 表示忽略。
    • include_global_state: 是否备份集群状态,比如索引模板、别名等。false 表示不备份。
  4. 验证快照: 检查快照是否创建成功:

    GET /_snapshot/my_s3_repository/my_snapshot
    

查询可搜索快照数据

  1. 创建 Frozen 数据层: 使用 Frozen 数据层,可以将快照数据加载到内存中,从而实现快速查询。首先,创建一个数据层策略,并将该策略应用到索引上。

    # 创建数据层策略,策略名为 frozen_policy
    PUT /_template/frozen_template
    {
      "index_patterns": ["frozen-*"],
      "settings": {
        "index.lifecycle.name": "frozen_policy",
        "index.routing.allocation.include._tier_preference": "data_frozen"
      }
    }
    
    # 创建 Lifecycle 策略,策略名为 frozen_policy
    PUT /_ilm/policy/frozen_policy
    {
      "policy": {
        "phases": {
          "frozen": {
            "actions": {
              "searchable_snapshot": {
                "repository": "my_s3_repository",
                "snapshot": "my_snapshot",
                "storage": "frozen"
              }
            }
          }
        }
      }
    }
    
    # 将索引设置为 Frozen 数据层
    PUT /frozen-index-000001
    {
      "settings": {
        "index.lifecycle.name": "frozen_policy",
        "index.number_of_shards": 1,
        "index.number_of_replicas": 0
      },
      "mappings": {
        "properties": {
          "timestamp": {
            "type": "date"
          },
          "message": {
            "type": "text"
          }
        }
      }
    }
    
    # 写入一些数据到Frozen索引
    POST /frozen-index-000001/_doc
    {
      "timestamp": "2024-01-03T00:00:00",
      "message": "Frozen index test message."
    }
    
    • index.lifecycle.name: 指定索引生命周期策略,将索引关联到生命周期策略。
    • index.routing.allocation.include._tier_preference: 指定数据层的偏好,将索引分配到指定的存储层。
    • searchable_snapshot: 在 ILM 策略的 frozen 阶段,创建可搜索快照。
    • repository: 指定快照存储库。
    • snapshot: 指定要使用的快照。
    • storage: 指定快照数据的存储层,frozen 表示 Frozen 数据层。
  2. 查询数据: 现在,你可以像查询普通索引一样查询 Frozen 数据层中的数据:

    GET /frozen-index-000001/_search
    {
      "query": {
        "match_all": {}
      }
    }
    

性能考量与最佳实践

  1. 查询性能: 可搜索快照的查询性能取决于多个因素,包括:

    • 网络带宽: 从 S3 读取数据需要网络带宽。网络带宽越高,查询速度越快。
    • 存储性能: S3 的存储性能也会影响查询速度。选择性能更好的 S3 存储类型,可以提升查询性能。
    • 数据量: 查询的数据量越大,查询时间越长。
    • 查询复杂度: 复杂的查询需要更多的时间。
    • 节点资源: Elasticsearch 节点的 CPU、内存等资源也会影响查询性能。如果节点资源不足,查询速度会变慢。
  2. Frozen 数据层优化: Frozen 数据层可以有效提升查询性能,但也有一些需要注意的地方:

    • 预热缓存: 首次查询 Frozen 数据层时,可能需要较长时间,因为需要从 S3 读取数据。可以通过预热缓存的方式,提前将数据加载到内存中,提升查询速度。例如,可以定期执行一些查询,或者使用 force_merge API 来预热缓存。
    • 调整节点资源: Frozen 数据层需要占用一定的内存资源。根据数据量和查询频率,调整 Elasticsearch 节点的内存配置,可以提升查询性能。
    • 使用索引生命周期管理 (ILM): 结合 ILM,可以自动化管理数据的生命周期,例如,将热数据移动到 Hot 数据层,将冷数据移动到 Warm 数据层,将历史数据移动到 Frozen 数据层。ILM 可以帮助你更好地管理数据的存储成本和查询性能。
  3. 最佳实践:

    • 选择合适的 S3 存储类型: 根据你的需求,选择合适的 S3 存储类型。例如,对于经常访问的数据,可以选择 S3 标准存储;对于不经常访问的数据,可以选择 S3 智能分层存储或 S3 冰冻存储,降低存储成本。
    • 定期创建快照: 定期创建快照,确保数据安全。可以根据数据的更新频率,设置不同的快照频率。
    • 监控查询性能: 监控可搜索快照的查询性能,及时发现问题并进行优化。可以使用 Elasticsearch 的监控工具,例如,Elasticsearch 的内置监控功能,或者第三方监控工具。
    • 优化查询语句: 优化查询语句,减少查询时间。例如,使用更精确的查询条件,避免使用通配符查询,使用缓存等。
    • 测试: 在生产环境中使用可搜索快照之前,先在测试环境中进行测试,验证其性能和稳定性。

案例分析

场景一:日志分析

一家公司每天产生大量的日志数据。为了满足合规性要求,需要长期保存这些日志数据,并能够进行查询。使用可搜索快照,可以将历史日志数据存储到 S3 存储桶中,并使用 Frozen 数据层进行查询。这样,既可以降低存储成本,又可以满足查询需求。

  1. 创建索引: 创建一个索引,用于存储日志数据。
  2. 配置 ILM: 配置 ILM,将数据分为 Hot、Warm 和 Frozen 三个阶段。
    • Hot:存储最近一段时间的日志数据,用于快速查询。
    • Warm:存储较早的日志数据,查询频率较低。
    • Frozen:存储历史日志数据,使用可搜索快照存储在 S3 中。
  3. 配置 S3 存储库: 配置 S3 存储库,用于存储快照。
  4. 创建快照: 定期创建快照,备份 Frozen 数据层的日志数据。
  5. 查询数据: 使用 Frozen 数据层进行查询,可以查询历史日志数据。

场景二:审计数据

一家金融公司需要长期保存审计数据,并能够进行查询。审计数据通常包含大量的交易记录和操作日志。使用可搜索快照,可以将审计数据存储到 S3 存储桶中,并使用 Frozen 数据层进行查询。

  1. 创建索引: 创建一个索引,用于存储审计数据。
  2. 配置 ILM: 配置 ILM,将数据分为 Hot 和 Frozen 两个阶段。
    • Hot:存储最近一段时间的审计数据,用于快速查询。
    • Frozen:存储历史审计数据,使用可搜索快照存储在 S3 中。
  3. 配置 S3 存储库: 配置 S3 存储库,用于存储快照。
  4. 创建快照: 定期创建快照,备份 Frozen 数据层的审计数据。
  5. 查询数据: 使用 Frozen 数据层进行查询,可以查询历史审计数据。

常见问题及解决方案

  1. 快照创建失败:

    • 问题原因: S3 存储桶访问权限问题、网络问题、Elasticsearch 集群资源不足等。
    • 解决方案: 检查 S3 存储桶的访问权限是否正确、检查网络是否畅通、检查 Elasticsearch 集群的资源是否充足,例如 CPU、内存、磁盘空间等。
  2. 查询速度慢:

    • 问题原因: 查询语句复杂、网络带宽不足、S3 存储性能不足、Elasticsearch 节点资源不足等。
    • 解决方案: 优化查询语句,减少查询的数据量、增加网络带宽、选择性能更好的 S3 存储类型、增加 Elasticsearch 节点的资源,例如 CPU、内存等。
  3. 存储空间不足:

    • 问题原因: 快照创建失败、快照数据量过大等。
    • 解决方案: 检查快照创建是否成功、优化数据存储策略,例如,使用压缩、调整快照的频率等。

总结

可搜索快照是 Elasticsearch 中一个非常强大的功能,可以帮助你降低存储成本,保持数据可搜索性,提升查询性能。通过配置 S3 兼容的对象存储和 Frozen 数据层,你可以轻松地将历史数据存储到便宜的存储中,并随时随地进行搜索。记住,在实际应用中,要根据自己的需求,选择合适的 S3 存储类型、优化查询语句、监控查询性能,才能充分发挥可搜索快照的优势。希望这篇文章对你有所帮助,祝你玩转 Elasticsearch,数据分析更轻松!

好啦,今天的分享就到这里。希望你已经掌握了可搜索快照的精髓,并且能够灵活运用到实际工作中。如果你有任何问题,随时都可以来问我!咱们下次再见!

点评评价

captcha
健康