Published on

使用 AWS OpenSearch Service(托管版的 Elasticsearch)

Authors
  • avatar
    Name
    Shelton Ma
    Twitter

1. 部署方案

1. 版本选择

  1. 单节点(开发/测试):t3.small.search(低成本)
  2. 多 AZ 集群(生产):3+ 节点,分布在多个可用区(AZ)
  3. UltraWarm(历史数据归档):低成本存储(仅适用于 7.x 及以上)

2. 配置高可用

  1. 实例类型:r6g.large.search(高性能) 或 m6g.large.search(性价比)

  2. 跨 AZ 部署:最低 3 个 AZ,防止单点故障

  3. 分片策略:

    • index.number_of_shards: 3(与数据节点数相等)
    • index.number_of_replicas: 1(1 份副本)
    {
      "settings": {
        "index": {
          "number_of_shards": 3,
          "number_of_replicas": 1
        }
      }
    }
    

3.访问控制(权限管理)

AWS 提供两种 访问方式

  1. IAM 角色(推荐):适用于 AWS 内部服务访问

    • 在 AWS OpenSearch 控制台,选择 Fine-grained access control

    • 创建 Master 用户

    • 配置 IAM 角色 允许 EC2 / Lambda 访问:

      {
        "Effect": "Allow",
        "Action": "es:ESHttp*",
        "Resource": "arn:aws:es:us-west-2:123456789012:domain/my-es-cluster/*"
      }
      
  2. 用户名密码(Basic Auth):适用于外部访问 启用 Basic Auth,Kibana 登录:

    curl -X GET "<https://your-es-domain.amazonaws.com>" -u "admin:yourpassword"
    

4. Kibana & OpenSearch Dashboards

  1. AWS 提供 Kibana / OpenSearch Dashboards 访问:
  2. 访问:https://your-es-domain.amazonaws.com/_dashboards/

5. 数据归档(UltraWarm & S3)

  1. UltraWarm(低成本存储)适用于 历史数据查询

    // 将 7 天前的数据移动到 UltraWarm
    {
      "lifecycle": {
        "hot": { "min_age": "0d", "actions": {} },
        "warm": { "min_age": "7d", "actions": { "allocate": { "require": { "data": "warm" } } } }
      }
    }
    
  2. S3 归档, 适用于 长期存储日志aws s3 cp s3://your-s3-bucket/es-backup .

2. 索引生命周期管理(ILM)

根据数据量级及成本控制, 确定生命周期管理

1. 方案确定

使用Index State Management(ISM),用于自动执行数据生命周期管理.

  • Hot(热存储):0 - 7 天 → 高性能 SSD
  • Warm(温存储):7 - 30 天 → UltraWarm(低成本)
  • Cold(归档):30+ 天 → S3(长存储)

2. 应用ILM策略

  1. 添加策略

    PUT _plugins/_ism/policies/my-index-policy
    {
      "policy": {
        "description": "自动管理索引生命周期",
        "default_state": "hot",
        "states": [
          {
            "name": "hot",
            "actions": [],
            "transitions": [
              {
                "state_name": "warm",
                "conditions": { "min_index_age": "7d" }
              }
            ]
          },
          {
            "name": "warm",
            "actions": [
              {
                "replica_count": { "number_of_replicas": 1 }
              },
              {
                "allocate": { "require": { "data": "warm" } }
              }
            ],
            "transitions": [
              {
                "state_name": "cold",
                "conditions": { "min_index_age": "30d" }
              }
            ]
          },
          {
            "name": "cold",
            "actions": [
              {
                "snapshot": { "repository": "s3-repository", "snapshot": "archive-{{index}}" }
              },
              {
                "delete": {}
              }
            ],
            "transitions": []
          }
        ]
      }
    }
    
  2. 绑定 ISM 策略到索引

    PUT my-index-0001/_settings
    {
      "index": {
        "plugins": {
          "index_state_management": {
            "policy_id": "my-index-policy"
          }
        }
      }
    }
    
  3. 配置 S3 存储库

    PUT _snapshot/s3-repository
    {
      "type": "s3",
      "settings": {
        "bucket": "my-opensearch-archive",
        "region": "us-west-2"
      }
    }
    

3. 性能优化注意事项

即使有 Auto Scaling,你仍然需要监控 Opensearch 关键性能指标

1. 集群负载

  • CPU 使用率 (_nodes/stats), 按需增加节点
  • JVM 内存占用(如果 > 75%,GC 可能会影响查询), 减少 shards 数量
  • 磁盘使用率(超过 80%,可能导致写入慢), 提高 refresh_interval(降低磁盘 IO)

2. Bulk 写入性能

  1. Bulk 队列 (_cat/thread_pool/bulk), 调整 bulk 大小(1000 -> 500)
  2. Rejected bulk 请求(如果 > 0,写入速度跟不上)
    • 使用 Kafka 进行缓冲
    • 增加 number_of_replicas=0(提升写入速度)

3. 查询性能

  1. 查询耗时 (query_latency), 增加缓存(query_cache)
  2. 慢查询 (_slowlog)
    • 减少 size 参数(避免 size=10000 查询过大)
    • 使用 aggregations 代替 terms 查询

4. 数据冷热分层

如果你存储大量数据,需要用 冷热存储:

  • Hot(7 天内的活跃数据,SSD)
  • Warm(30 天内的历史数据,EBS)
  • Cold(S3 归档)