返回文章列表
服务器

怎么用三台服务器构建一个高可用的Elasticsearch集群?

消弭
2025-12-15
3小时前
怎么用三台服务器构建一个高可用的Elasticsearch集群?

一、集群架构设计


服务器IP地址角色说明
服务器-node1192.168.178.140master,data,ingest
服务器-node2192.168.178.141master,data,ingest
服务器-node3192.168.178.142master,data,ingest

1、节点角色规划

每台服务器将部署一个Elasticsearch节点,每个节点同时承担MasterDataCoordinating角色,形成对等架构。这种设计在简化部署的同时提供了高可用性:

Master资格:所有节点都具备Master资格,参与集群管理决策

数据存储:所有节点都作为Data节点存储数据分片

请求协调:所有节点都可以作为Coordinating节点处理客户端请求

2、网络架构

使用Docker Overlay网络实现跨主机的容器通信,确保三台服务器上的ES节点能够相互发现和通信。

3、资源分配建议

  • JVM堆内存:16GB(内存分配不超过16G)
  • 剩余内存:用于操作系统缓存,提升ES性能
  • 磁盘空间:500GB主要用于数据存储和日志

二、部署详细步骤

1、系统级配置(三台服务器都需要执行)

# 优化系统参数echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.confecho "net.core.somaxconn=65535" | sudo tee -a /etc/sysctl.confsudo sysctl -pmkdir -p /data/deploy/escd /data/deploy/es# 创建数据目录sudo mkdir -p /data/deploy/es/data/elasticsearch/{data,logs}sudo chmod -R 777 /data/deploy/es/data/elasticsearch

2、每台服务器创建使用到的docker网络

# 创建Docker Overlay网络docker network create --driver overlay --attachable es-cluster-network

所有服务器节点docker network ls查看创建网络


3、Docker Compose文件配置

为每台服务器创建docker-compose.yml文件,注意根据服务器IP调整配置。


3.1、服务器节点1 docker-compose配置

version: '3.8'services:es-node1:    image:swr.cn-north-1.myhuaweicloud.com/meta-swr/x86/elasticsearch:7.17.8    container_name:es-node1    environment:      -node.name=es-node1      -cluster.name=es-production-cluster      -discovery.seed_hosts=192.168.178.141,192.168.178.142      -cluster.initial_master_nodes=es-node1,es-node2,es-node3      -bootstrap.memory_lock=true      -"ES_JAVA_OPTS=-Xms2g -Xmx2g"      -node.roles=master,data,ingest      -network.publish_host=192.168.178.140      -network.host=0.0.0.0      -xpack.security.enabled=false    ulimits:      memlock:        soft:-1        hard:-1    volumes:      -./data/elasticsearch/data:/usr/share/elasticsearch/data      -./data/elasticsearch/logs:/usr/share/elasticsearch/logs    ports:      -"9200:9200"      -"9300:9300"    networks:      -es-cluster-network    deploy:      replicas:1      restart_policy:        condition:on-failurenetworks:es-cluster-network:    external:true    name:es-cluster-network

3.2、服务器节点2 docker-compose配置

version: '3.8'services:es-node1:    image:swr.cn-north-1.myhuaweicloud.com/meta-swr/x86/elasticsearch:7.17.8    container_name:es-node2    environment:      -node.name=es-node2      -cluster.name=es-production-cluster      -discovery.seed_hosts=192.168.178.140,192.168.178.142      -cluster.initial_master_nodes=es-node1,es-node2,es-node3      -bootstrap.memory_lock=true      -"ES_JAVA_OPTS=-Xms2g -Xmx2g"      -node.roles=master,data,ingest      -network.publish_host=192.168.178.141      -network.host=0.0.0.0      -xpack.security.enabled=false    ulimits:      memlock:        soft:-1        hard:-1    volumes:      -./data/elasticsearch/data:/usr/share/elasticsearch/data      -./data/elasticsearch/logs:/usr/share/elasticsearch/logs    ports:      -"9200:9200"      -"9300:9300"    networks:      -es-cluster-network    deploy:      replicas:1      restart_policy:        condition:on-failurenetworks:es-cluster-network:    external:true    name:es-cluster-network

3.3、服务器节点3 docker-compose配置

version: '3.8'services:es-node1:    image:swr.cn-north-1.myhuaweicloud.com/meta-swr/x86/elasticsearch:7.17.8    container_name:es-node3    environment:      -node.name=es-node3      -cluster.name=es-production-cluster      -discovery.seed_hosts=192.168.178.140,192.168.178.141      -cluster.initial_master_nodes=es-node1,es-node2,es-node3      -bootstrap.memory_lock=true      -"ES_JAVA_OPTS=-Xms2g -Xmx2g"      -node.roles=master,data,ingest      -network.publish_host=192.168.178.142      -network.host=0.0.0.0      -xpack.security.enabled=false    ulimits:      memlock:        soft:-1        hard:-1    volumes:      -./data/elasticsearch/data:/usr/share/elasticsearch/data      -./data/elasticsearch/logs:/usr/share/elasticsearch/logs    ports:      -"9200:9200"      -"9300:9300"    networks:      -es-cluster-network    deploy:      replicas:1      restart_policy:        condition:on-failurenetworks:es-cluster-network:    external:true    name:es-cluster-network

4、验证集群状态

# 检查集群健康状态curl -X GET "http://192.168.178.140:9200/_cluster/health?pretty"# 查看节点列表curl -X GET "http://192.168.178.140:9200/_cat/nodes?v"# 查看集群详细信息curl -X GET "http://192.168.178.140:9200/_cluster/stats?pretty"

三、生产环境优化建议

1、性能调优参数

# 在environment部分添加以下参数:- indices.query.bool.max_clause_count=10000- thread_pool.search.size=20- thread_pool.search.queue_size=1000- bootstrap.mlockall=true

2、安全加固

# 启用安全功能- xpack.security.enabled=true- xpack.security.transport.ssl.enabled=true# 生成证书docker exec -it es-node1 bin/elasticsearch-certutil cadocker exec -it es-node1 bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

3、备份与恢复策略

# 创建快照仓库PUT /_snapshot/my_backup{  "type": "fs",  "settings": {    "location": "/usr/share/elasticsearch/snapshots"  }}

四、故障排除指南

1、节点无法加入集群

# 检查网络连通性docker exec -it es-node1 ping es-node2# 查看日志docker-compose logs --tail=100 es-node1

2、分片未分配问题

# 查看未分配原因GET /_cluster/allocation/explain

3、内存不足处理

# 清理缓存POST /_cache/clear

五、集群扩展建议

如果需要进一步扩展:

增加专用主节点:将Master角色分离到专用节点

增加专用协调节点:处理客户端请求,减轻数据节点压力

冷热数据架构:根据数据访问频率使用不同的存储层级


本文内容仅供参考,不构成任何专业建议。使用本文提供的信息时,请自行判断并承担相应风险。

分享文章
合作伙伴

本站所有广告均是第三方投放,详情请查询本站用户协议