一、集群规划
1.1 节点角色规划
节点类型 | 配置要求 | 推荐数量 |
---|---|---|
Master节点 | 低磁盘、中等CPU/内存 | 3(奇数防止脑裂) |
Data节点 | 高磁盘、高内存、多核CPU | 根据数据量扩展 |
Coordinating节点 | 高CPU/内存、低磁盘 | 2+(可选) |
1.2 硬件建议
- 内存:Data节点建议50%内存分配给ES堆(不超过31GB),剩余留给文件缓存。
- 磁盘:SSD优先,RAID 0或JBOD模式,避免NAS/SAN。
- CPU:16核以上,Data节点需更多核心。
1.3 网络要求
- 节点间带宽≥1Gbps,延迟<10ms。
- 禁用Swap,优化TCP参数(如增大net.core.somaxconn)。
二、搭建步骤
2.1 准备工作
- 系统资源充足服务器(Linux)。
- 服务器上确保已安装 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 节点集群为例:
-
docker 依次启动
-
节点 1 (es01 - 主节点)
bashdocker 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 - 数据节点)
bashdocker 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 - 协调节点)
bashdocker 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 挂载数据目录避免数据丢失。
-
-
使用 Docker Compose 一次启动
-
创建 docker-compose.yml:
bashversion: '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
-
启动服务:
bashdocker-compose up -d
-
2.5 验证集群状态
bash
curl -X GET "http://localhost:9200/_cluster/health?pretty"
- 输出中 status 应为 green 或 yellow,number_of_nodes 显示节点数。
2.6 生产级优化配置
-
分片与副本策略
在创建索引的时候,在 settings 中进行分片及副本数量设置。
bashPUT /my_index { "settings": { "number_of_shards": 3, # 分片数(建议每分片30-50GB) "number_of_replicas": 1 # 副本数(生产环境≥1) } }
-
集群发现优化
bash# 防止误加入其他集群 discovery.zen.ping.unicast.hosts.resolve_timeout: 30s cluster.join.timeout: 60s # 启用安全配置(7.x+版本) xpack.security.enabled: true
-
数据目录分离
bashpath.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 集群安全功能基本步骤:
-
生成证书颁发机构(CA)
-
临时启动一个节点生成 CA
bashdocker 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 证书
bashdocker exec -it es-temp \ elasticsearch-certutil ca --pass "" --out config/certs/ca.zip
-
解压 CA 证书并删除临时容器
bashdocker exec -it es-temp unzip config/certs/ca.zip -d config/certs docker rm -f es-temp
-
-
配置安全集群
-
在每个节点的启动容器命令中添加挂载目录到刚生成的证书目录上。
bash-v es-certs:/usr/share/elasticsearch/config/certs
-
还可以在每个节点的启动容器命令中添加登录密码。
bash-e ELASTIC_PASSWORD=your_secure_password
-
-
关键安全配置说明
- 强制安全特性
- 节点间 TLS 加密:自动启用,证书挂载到共享卷 es-certs。
- HTTP 层 HTTPS:默认启用,访问需使用 https://。
- 内置用户系统:默认创建 elastic、kibana_system 等用户。
- 环境变量
- ELASTIC_PASSWORD:设置内置超级用户 elastic 的密码。
- xpack.security.enrollment.enabled:可设置为 false 禁用自动注册(需手动配置证书)。
- 强制安全特性
三、集群监控与维护
3.1 集群监控
-
核心监控指标
-
集群健康状态:
bashcurl -u elastic:密码 "https://localhost:9200/_cluster/health?pretty"
- status: green(所有分片正常)、yellow(主分片正常,副本未分配)、red(主分片缺失)。
- number_of_nodes: 当前节点数。
- unassigned_shards: 未分配的分片数。
-
节点资源使用:
bashcurl -u elastic:密码 "https://localhost:9200/_nodes/stats?pretty"
- CPU、内存、磁盘使用率。
- JVM 堆内存(jvm.mem.heap_used_percent)应低于 75%。
-
索引性能:
bashcurl -u elastic:密码 "https://localhost:9200/_cat/indices?v" curl -u elastic:密码 "https://localhost:9200/_nodes/hot_threads"
- 索引速率(indexing.index_total)、搜索速率(search.query_total)。
- 分片数、文档数、存储大小。
-
-
监控工具
- Kibana Stack Monitoring(内置):
- 安装并配置 Kibana,进入 Stack Management > Monitoring。
- 实时查看集群、节点、索引的详细指标。
- Prometheus + Grafana:
- 使用 Elasticsearch Exporter 采集指标。
- Grafana 仪表盘模板(如 ID 2322)。
- Cerebro
- 集群管理Web界面。
- 分片重分配、节点排除等操作。
- ElasticHQ
- 集群管理GUI。
- 实时监控和简单管理功能。
- Kibana Stack Monitoring(内置):
3.2 日常维护操作
-
索引管理
-
索引生命周期管理(ILM):
bashPUT _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
-
-
分片管理
-
分片分配策略:
bashPUT _cluster/settings { "persistent": { "cluster.routing.allocation.balance.shard": "0.45", "cluster.routing.allocation.disk.watermark.low": "85%", "cluster.routing.allocation.disk.watermark.high": "90%" } }
- 避免磁盘空间不足导致分片迁移失败。
-
手动迁移分片:
bashPOST /_cluster/reroute { "commands": [ { "move": { "index": "logs-2023-10-01", "shard": 0, "from_node": "es01", "to_node": "es02" } } ] }
-
3.3 备份与恢复
-
快照备份
-
创建仓库(如 S3、NFS):
bashPUT _snapshot/my_backup_repo { "type": "fs", "settings": { "location": "/mnt/backups/es_snapshots" } }
-
手动创建快照:
bashPUT _snapshot/my_backup_repo/snapshot_20231001 { "indices": "logs-*", "ignore_unavailable": true }
-
-
恢复快照
bashPOST _snapshot/my_backup_repo/snapshot_20231001/_restore { "indices": "logs-2023-10-01", "rename_pattern": "logs-(.+)", "rename_replacement": "restored_logs-$1" }
3.4 版本升级与滚动重启
- 滚动升级步骤
-
禁用分片分配:
bashPUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": "primaries" } }
-
停止节点并升级:
bash# 停止一个节点 docker stop es01 # 更新镜像版本(如 8.12.0 → 8.12.1) docker run ... elasticsearch:8.12.1
-
重新启用分片分配:
bashPUT _cluster/settings { "persistent": { "cluster.routing.allocation.enable": null } }
-
3.5 日志与故障排查
-
日志收集
-
Filebeat 配置:
bashfilebeat.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"]
-
-
常见故障处理
-
分片未分配:
bashGET _cluster/allocation/explain?pretty
- 检查磁盘空间、分片分配规则。
-
节点离线:
-
临时移除节点:
bashPUT _cluster/settings { "transient": { "cluster.routing.allocation.exclude._ip": "故障节点IP" } }
-
-
脑裂问题恢复:
- 停用所有节点
- 删除故障节点数据目录下的nodes文件夹
- 先启动Master候选节点,再启动其他节点
-
3.6 自动化运维建议
-
定期清理旧索引:
bash# 删除 90 天前的索引 DELETE /logs-*-$(date -d "-90 days" +%Y.%m.%d)
-
设置监控告警(如 Watcher):、
bashPUT _watcher/watch/disk_usage_alert { "trigger": { "schedule": { "interval": "5m" } }, "input": { "search": { ... } }, "condition": { "compare": { "ctx.payload.hits.total": { "gt": 0 } } }, "actions": { "send_email": { ... } } }
3.7 性能优化技巧
- 调整 JVM 堆大小:建议不超过物理内存的 50%(如 32GB 内存 → -Xms16g -Xmx16g)。
- 使用 SSD 存储:提升索引和搜索速度。
- 分片大小控制:单个分片建议在 10GB--50GB 之间。