欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > Elasticsearch 集群搭建

Elasticsearch 集群搭建

2025/5/21 15:40:58 来源:https://blog.csdn.net/qq_33807380/article/details/147102731  浏览:    关键词: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 镜像
# 拉取最新版
docker pull docker.elastic.co/elasticsearch/elasticsearch:latest# 拉取指定版本(例如 8.13.4)
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.0
2.3 创建 Docker 网络

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

docker network create es-net
2.4 集群模式配置

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

  1. docker 依次启动

    • 节点 1 (es01 - 主节点)
      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 - 数据节点)
      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 - 协调节点)
      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:
      version: '3'
      services:es01:image: elasticsearch:8.12.0container_name: es01environment:- node.name=es01- cluster.name=es-docker-cluster- discovery.seed_hosts=es02,es03- cluster.initial_master_nodes=es01,es02,es03- ES_JAVA_OPTS=-Xms2g -Xmx2gvolumes:- es-data01:/usr/share/elasticsearch/datanetworks:- es-netports:- 9200:9200es02:image: elasticsearch:8.12.0container_name: es02environment:- node.name=es02- cluster.name=es-docker-cluster- discovery.seed_hosts=es01,es03- ES_JAVA_OPTS=-Xms2g -Xmx2gvolumes:- es-data02:/usr/share/elasticsearch/datanetworks:- es-netes03:image: elasticsearch:8.12.0container_name: es03environment:- node.name=es03- cluster.name=es-docker-cluster- discovery.seed_hosts=es01,es02- ES_JAVA_OPTS=-Xms2g -Xmx2gvolumes:- es-data03:/usr/share/elasticsearch/datanetworks:- es-netvolumes:es-data01:es-data02:es-data03:networks:es-net:driver: bridge
      
    • 启动服务:
      docker-compose up -d
      
2.5 验证集群状态
curl -X GET "http://localhost:9200/_cluster/health?pretty"
  • 输出中 status 应为 green 或 yellow,number_of_nodes 显示节点数。
2.6 生产级优化配置
  1. 分片与副本策略
    在创建索引的时候,在 settings 中进行分片及副本数量设置。

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

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

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

Elasticsearch 8.x 默认启用安全功能。首次启动容器时,控制台会输出默认密码。
可通过以下命令重置密码:

docker exec -it es-test /bin/bash
bin/elasticsearch-reset-password -u elastic

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

-e "xpack.security.enabled=false"

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

  1. 生成证书颁发机构(CA)
    • 临时启动一个节点生成 CA
      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 证书
      docker exec -it es-temp \elasticsearch-certutil ca --pass "" --out config/certs/ca.zip
      
    • 解压 CA 证书并删除临时容器
      docker exec -it es-temp unzip config/certs/ca.zip -d config/certs
      docker rm -f es-temp
      
  2. 配置安全集群
    • 在每个节点的启动容器命令中添加挂载目录到刚生成的证书目录上。
      -v es-certs:/usr/share/elasticsearch/config/certs
      
    • 还可以在每个节点的启动容器命令中添加登录密码。
      -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. 核心监控指标

    • 集群健康状态:
      curl -u elastic:密码 "https://localhost:9200/_cluster/health?pretty"
      
      • status: green(所有分片正常)、yellow(主分片正常,副本未分配)、red(主分片缺失)。
      • number_of_nodes: 当前节点数。
      • unassigned_shards: 未分配的分片数。
    • 节点资源使用:
      curl -u elastic:密码 "https://localhost:9200/_nodes/stats?pretty"
      
      • CPU、内存、磁盘使用率。
      • JVM 堆内存(jvm.mem.heap_used_percent)应低于 75%。
    • 索引性能:
      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):
      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 } }}}}
      }
      
      • 自动滚动创建新索引,归档旧数据。
    • 手动优化索引:
      # 合并段文件(force merge)
      POST /logs-2023-10-01/_forcemerge?max_num_segments=1# 关闭不再写入的索引
      POST /old-index-*/_close
      
  2. 分片管理

    • 分片分配策略:
      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%"}
      }
      
      • 避免磁盘空间不足导致分片迁移失败。
    • 手动迁移分片:
      POST /_cluster/reroute
      {"commands": [{"move": {"index": "logs-2023-10-01","shard": 0,"from_node": "es01","to_node": "es02"}}]
      }
      
3.3 备份与恢复
  1. 快照备份

    • 创建仓库(如 S3、NFS):
      PUT _snapshot/my_backup_repo
      {"type": "fs","settings": { "location": "/mnt/backups/es_snapshots" }
      }
      
    • 手动创建快照:
      PUT _snapshot/my_backup_repo/snapshot_20231001
      {"indices": "logs-*","ignore_unavailable": true
      }
      
  2. 恢复快照

    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. 禁用分片分配:
      PUT _cluster/settings
      {"persistent": { "cluster.routing.allocation.enable": "primaries" }
      }
      
    2. 停止节点并升级:
      # 停止一个节点
      docker stop es01
      # 更新镜像版本(如 8.12.0 → 8.12.1)
      docker run ... elasticsearch:8.12.1
      
    3. 重新启用分片分配:
      PUT _cluster/settings
      {"persistent": { "cluster.routing.allocation.enable": null }
      }
      
3.5 日志与故障排查
  1. 日志收集

    • Filebeat 配置:
      filebeat.inputs:- type: logpaths:- /var/lib/docker/containers/*/*-json.logprocessors:- add_docker_metadata: ~
      output.elasticsearch:hosts: ["https://es01:9200"]username: "filebeat_user"password: "密码"ssl.certificate_authorities: ["/path/to/ca.crt"]
      
  2. 常见故障处理

    • 分片未分配:

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

      • 临时移除节点:
        PUT _cluster/settings
        {"transient": { "cluster.routing.allocation.exclude._ip": "故障节点IP" }
        }
        
    • 脑裂问题恢复:
      在 Elasticsearch 集群中,脑裂指多个节点同时认为自己是主节点(Master Node),导致集群分裂成多个独立子集群的现象。这会引发数据不一致、写入冲突,甚至服务中断。

      • 脑裂的成因:
        • 网络分区:节点间网络中断,部分节点无法通信。
        • Master节点高负载:长时间GC或CPU满载导致心跳超时。
        • 节点角色分配不合理:过多节点具备 master 角色,增加选举复杂度。
      • 紧急恢复步骤:
        1. 停用所有节点。
        2. 确定有效数据节点,检查各节点数据目录(path.data)的最后更新时间,保留最新数据的节点。
        3. 清理故障节点状态,删除所有节点的 data/nodes 目录(重置集群状态)。
        4. 先启动原主节点或数据最新的节点,确认集群健康状态后再启动其他节点。
3.6 自动化运维建议
  1. 定期清理旧索引:

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

    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 之间。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词