Elasticsearch 集群搭建

一、集群规划

1.1 节点角色规划
节点类型 配置要求 推荐数量
Master节点 低磁盘、中等CPU/内存 3(奇数防止脑裂)
Data节点 高磁盘、高内存、多核CPU 根据数据量扩展
Coordinating节点 高CPU/内存、低磁盘 2+(可选)
1.2 硬件建议
  1. 内存:Data节点建议50%内存分配给ES堆(不超过31GB),剩余留给文件缓存。
  2. 磁盘:SSD优先,RAID 0或JBOD模式,避免NAS/SAN。
  3. CPU:16核以上,Data节点需更多核心。
1.3 网络要求
  1. 节点间带宽≥1Gbps,延迟<10ms。
  2. 禁用Swap,优化TCP参数(如增大net.core.somaxconn)。

二、搭建步骤

2.1 准备工作
  1. 系统资源充足服务器(Linux)。
  2. 服务器上确保已安装 Docker 和 Docker Compose(推荐)。
2.2 拉取 Elasticsearch 镜像
bash 复制代码
# 拉取最新版
docker pull docker.elastic.co/elasticsearch/elasticsearch:latest

# 拉取指定版本(例如 8.13.4)
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.0
2.3 创建 Docker 网络

为集群创建一个专用网络,确保节点间通信:

bash 复制代码
docker network create es-net
2.4 集群模式配置

可以使用docker 依次启动多个节点,也可以使用Docker Compose一次启动全部节点。以下以 3 节点集群为例:

  1. docker 依次启动

    • 节点 1 (es01 - 主节点)

      bash 复制代码
      docker run -d \
        --name es01 \
        --net es-net \
        -p 9200:9200 \
        -e "node.name=es01" \
        -e "cluster.name=es-docker-cluster" \
        -e "cluster.initial_master_nodes=es01,es02,es03" \
        -e "discovery.seed_hosts=es02,es03" \
        -e "bootstrap.memory_lock=true" \
        -e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \
        -v es-data01:/usr/share/elasticsearch/data \
        elasticsearch:8.12.0
    • 节点 2 (es02 - 数据节点)

      bash 复制代码
      docker run -d \
        --name es02 \
        --net es-net \
        -e "node.name=es02" \
        -e "cluster.name=es-docker-cluster" \
        -e "discovery.seed_hosts=es01,es03" \
        -e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \
        -v es-data02:/usr/share/elasticsearch/data \
        elasticsearch:8.12.0
    • 节点 3 (es03 - 协调节点)

      bash 复制代码
      docker run -d \
        --name es03 \
        --net es-net \
        -e "node.name=es03" \
        -e "cluster.name=es-docker-cluster" \
        -e "discovery.seed_hosts=es01,es02" \
        -e "ES_JAVA_OPTS=-Xms2g -Xmx2g" \
        -v es-data03:/usr/share/elasticsearch/data \
        elasticsearch:8.12.0
    • 关键参数说明

      • cluster.name: 集群名称,所有节点必须一致。
      • node.name: 节点唯一名称。
      • discovery.seed_hosts: 集群节点列表(容器名称或 IP)。
      • cluster.initial_master_nodes: 初始主节点列表(首次启动时需指定)。
      • ES_JAVA_OPTS: JVM 堆内存设置(建议不超过物理内存的 50%)。
      • 数据卷挂载: 使用 -v 挂载数据目录避免数据丢失。
  2. 使用 Docker Compose 一次启动

    • 创建 docker-compose.yml:

      bash 复制代码
      version: '3'
      services:
        es01:
          image: elasticsearch:8.12.0
          container_name: es01
          environment:
            - node.name=es01
            - cluster.name=es-docker-cluster
            - discovery.seed_hosts=es02,es03
            - cluster.initial_master_nodes=es01,es02,es03
            - ES_JAVA_OPTS=-Xms2g -Xmx2g
          volumes:
            - es-data01:/usr/share/elasticsearch/data
          networks:
            - es-net
          ports:
            - 9200:9200
      
        es02:
          image: elasticsearch:8.12.0
          container_name: es02
          environment:
            - node.name=es02
            - cluster.name=es-docker-cluster
            - discovery.seed_hosts=es01,es03
            - ES_JAVA_OPTS=-Xms2g -Xmx2g
          volumes:
            - es-data02:/usr/share/elasticsearch/data
          networks:
            - es-net
      
        es03:
          image: elasticsearch:8.12.0
          container_name: es03
          environment:
            - node.name=es03
            - cluster.name=es-docker-cluster
            - discovery.seed_hosts=es01,es02
            - ES_JAVA_OPTS=-Xms2g -Xmx2g
          volumes:
            - es-data03:/usr/share/elasticsearch/data
          networks:
            - es-net
      
      volumes:
        es-data01:
        es-data02:
        es-data03:
      
      networks:
        es-net:
          driver: bridge
    • 启动服务:

      bash 复制代码
      docker-compose up -d
2.5 验证集群状态
bash 复制代码
curl -X GET "http://localhost:9200/_cluster/health?pretty"
  • 输出中 status 应为 green 或 yellow,number_of_nodes 显示节点数。
2.6 生产级优化配置
  1. 分片与副本策略

    在创建索引的时候,在 settings 中进行分片及副本数量设置。

    bash 复制代码
    PUT /my_index
    {
      "settings": {
        "number_of_shards": 3,     # 分片数(建议每分片30-50GB)
        "number_of_replicas": 1    # 副本数(生产环境≥1)
      }
    }
  2. 集群发现优化

    bash 复制代码
    # 防止误加入其他集群
    discovery.zen.ping.unicast.hosts.resolve_timeout: 30s
    cluster.join.timeout: 60s
    
    # 启用安全配置(7.x+版本)
    xpack.security.enabled: true
  3. 数据目录分离

    bash 复制代码
    path.data: /ssd1,/ssd2  # 多磁盘路径提升IO
2.7 安全配置(可选)

Elasticsearch 8.x 默认启用安全功能。首次启动容器时,控制台会输出默认密码。

可通过以下命令重置密码:

bash 复制代码
docker exec -it es-test /bin/bash
bin/elasticsearch-reset-password -u elastic

如需禁用(测试环境),可以在启动容器的命令中添加下面配置:

bash 复制代码
-e "xpack.security.enabled=false"

生产环境建议开启安全认证,以下是配置 Elasticsearch 集群安全功能基本步骤:

  1. 生成证书颁发机构(CA)

    • 临时启动一个节点生成 CA

      bash 复制代码
      docker run -d --name es-temp \
        -e "node.name=es-temp" \
        -e "cluster.name=secure-es-cluster" \
        -e "discovery.type=single-node" \
        -e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
        -v es-certs:/usr/share/elasticsearch/config/certs \
        elasticsearch:8.12.0
    • 生成 CA 证书

      bash 复制代码
      docker exec -it es-temp \
        elasticsearch-certutil ca --pass "" --out config/certs/ca.zip
    • 解压 CA 证书并删除临时容器

      bash 复制代码
      docker exec -it es-temp unzip config/certs/ca.zip -d config/certs
      docker rm -f es-temp
  2. 配置安全集群

    • 在每个节点的启动容器命令中添加挂载目录到刚生成的证书目录上。

      bash 复制代码
      -v es-certs:/usr/share/elasticsearch/config/certs
    • 还可以在每个节点的启动容器命令中添加登录密码。

      bash 复制代码
      -e ELASTIC_PASSWORD=your_secure_password
  3. 关键安全配置说明

    • 强制安全特性
      • 节点间 TLS 加密:自动启用,证书挂载到共享卷 es-certs。
      • HTTP 层 HTTPS:默认启用,访问需使用 https://。
      • 内置用户系统:默认创建 elastic、kibana_system 等用户。
    • 环境变量
      • ELASTIC_PASSWORD:设置内置超级用户 elastic 的密码。
      • xpack.security.enrollment.enabled:可设置为 false 禁用自动注册(需手动配置证书)。

三、集群监控与维护

3.1 集群监控
  1. 核心监控指标

    • 集群健康状态:

      bash 复制代码
      curl -u elastic:密码 "https://localhost:9200/_cluster/health?pretty"
      • status: green(所有分片正常)、yellow(主分片正常,副本未分配)、red(主分片缺失)。
      • number_of_nodes: 当前节点数。
      • unassigned_shards: 未分配的分片数。
    • 节点资源使用:

      bash 复制代码
      curl -u elastic:密码 "https://localhost:9200/_nodes/stats?pretty"
      • CPU、内存、磁盘使用率。
      • JVM 堆内存(jvm.mem.heap_used_percent)应低于 75%。
    • 索引性能:

      bash 复制代码
      curl -u elastic:密码 "https://localhost:9200/_cat/indices?v"
      curl -u elastic:密码 "https://localhost:9200/_nodes/hot_threads"
      • 索引速率(indexing.index_total)、搜索速率(search.query_total)。
      • 分片数、文档数、存储大小。
  2. 监控工具

    • Kibana Stack Monitoring(内置):
      • 安装并配置 Kibana,进入 Stack Management > Monitoring。
      • 实时查看集群、节点、索引的详细指标。
    • Prometheus + Grafana:
      • 使用 Elasticsearch Exporter 采集指标。
      • Grafana 仪表盘模板(如 ID 2322)。
    • Cerebro
      • 集群管理Web界面。
      • 分片重分配、节点排除等操作。
    • ElasticHQ
      • 集群管理GUI。
      • 实时监控和简单管理功能。
3.2 日常维护操作
  1. 索引管理

    • 索引生命周期管理(ILM):

      bash 复制代码
      PUT _ilm/policy/hot_warm_policy
      {
        "policy": {
          "phases": {
            "hot": {
              "actions": {
                "rollover": { "max_size": "50GB", "max_age": "30d" }
              }
            },
            "warm": {
              "min_age": "60d",
              "actions": { "shrink": { "number_of_shards": 1 } }
            }
          }
        }
      }
      • 自动滚动创建新索引,归档旧数据。
    • 手动优化索引:

      bash 复制代码
      # 合并段文件(force merge)
      POST /logs-2023-10-01/_forcemerge?max_num_segments=1
      
      # 关闭不再写入的索引
      POST /old-index-*/_close
  2. 分片管理

    • 分片分配策略:

      bash 复制代码
      PUT _cluster/settings
      {
        "persistent": {
          "cluster.routing.allocation.balance.shard": "0.45",
          "cluster.routing.allocation.disk.watermark.low": "85%",
          "cluster.routing.allocation.disk.watermark.high": "90%"
        }
      }
      • 避免磁盘空间不足导致分片迁移失败。
    • 手动迁移分片:

      bash 复制代码
      POST /_cluster/reroute
      {
        "commands": [
          {
            "move": {
              "index": "logs-2023-10-01",
              "shard": 0,
              "from_node": "es01",
              "to_node": "es02"
            }
          }
        ]
      }
3.3 备份与恢复
  1. 快照备份

    • 创建仓库(如 S3、NFS):

      bash 复制代码
      PUT _snapshot/my_backup_repo
      {
        "type": "fs",
        "settings": { "location": "/mnt/backups/es_snapshots" }
      }
    • 手动创建快照:

      bash 复制代码
      PUT _snapshot/my_backup_repo/snapshot_20231001
      {
        "indices": "logs-*",
        "ignore_unavailable": true
      }
  2. 恢复快照

    bash 复制代码
    POST _snapshot/my_backup_repo/snapshot_20231001/_restore
    {
      "indices": "logs-2023-10-01",
      "rename_pattern": "logs-(.+)",
      "rename_replacement": "restored_logs-$1"
    }
3.4 版本升级与滚动重启
  1. 滚动升级步骤
    1. 禁用分片分配:

      bash 复制代码
      PUT _cluster/settings
      {
        "persistent": { "cluster.routing.allocation.enable": "primaries" }
      }
    2. 停止节点并升级:

      bash 复制代码
      # 停止一个节点
      docker stop es01
      # 更新镜像版本(如 8.12.0 → 8.12.1)
      docker run ... elasticsearch:8.12.1
    3. 重新启用分片分配:

      bash 复制代码
      PUT _cluster/settings
      {
        "persistent": { "cluster.routing.allocation.enable": null }
      }
3.5 日志与故障排查
  1. 日志收集

    • Filebeat 配置:

      bash 复制代码
      filebeat.inputs:
        - type: log
          paths:
            - /var/lib/docker/containers/*/*-json.log
          processors:
            - add_docker_metadata: ~
      output.elasticsearch:
        hosts: ["https://es01:9200"]
        username: "filebeat_user"
        password: "密码"
        ssl.certificate_authorities: ["/path/to/ca.crt"]
  2. 常见故障处理

    • 分片未分配:

      bash 复制代码
      GET _cluster/allocation/explain?pretty
      • 检查磁盘空间、分片分配规则。
    • 节点离线:

      • 临时移除节点:

        bash 复制代码
        PUT _cluster/settings
        {
          "transient": { "cluster.routing.allocation.exclude._ip": "故障节点IP" }
        }
    • 脑裂问题恢复:

      1. 停用所有节点
      2. 删除故障节点数据目录下的nodes文件夹
      3. 先启动Master候选节点,再启动其他节点
3.6 自动化运维建议
  1. 定期清理旧索引:

    bash 复制代码
    # 删除 90 天前的索引
    DELETE /logs-*-$(date -d "-90 days" +%Y.%m.%d)
  2. 设置监控告警(如 Watcher):、

    bash 复制代码
    PUT _watcher/watch/disk_usage_alert
    {
      "trigger": { "schedule": { "interval": "5m" } },
      "input": { "search": { ... } },
      "condition": { "compare": { "ctx.payload.hits.total": { "gt": 0 } } },
      "actions": { "send_email": { ... } }
    }
3.7 性能优化技巧
  1. 调整 JVM 堆大小:建议不超过物理内存的 50%(如 32GB 内存 → -Xms16g -Xmx16g)。
  2. 使用 SSD 存储:提升索引和搜索速度。
  3. 分片大小控制:单个分片建议在 10GB--50GB 之间。
相关推荐
ml130185288746 小时前
开发一个环保回收小程序需要哪些功能?环保回收小程序
java·大数据·微信小程序·小程序·开源软件
zybishe7 小时前
免费送源码:Java+ssm+MySQL 酒店预订管理系统的设计与实现 计算机毕业设计原创定制
java·大数据·python·mysql·微信小程序·php·课程设计
塔能物联运维8 小时前
塔能科技解节能密码,工厂成本“效益方程式”精准破题
大数据·人工智能
Lilith的AI学习日记10 小时前
MetaGPT深度解析:重塑AI协作开发的智能体框架实践指南
大数据·人工智能·机器学习·aigc
JKIT沐枫11 小时前
PHP如何能获取网站上返回的数组指南
android·大数据
鸿乃江边鸟12 小时前
Starrocks的Bitmap索引和Bloom filter索引以及全局字典
大数据·starrocks·sql
Hadoop_Liang12 小时前
openEuler24.03 LTS下安装Spark
大数据·分布式·spark·openeuler
ylatin13 小时前
Elasticsearch 索引 es
大数据·linux·elasticsearch
杰克逊的日记14 小时前
es的告警信息
大数据·elasticsearch·搜索引擎