Elasticsearch搜索引擎集群搭建完整教程
写在前面
Elasticsearch(简称ES)是当下最流行的开源搜索引擎,常用于日志分析、站内搜索、数据聚合等场景。
但单节点一旦宕机,搜索服务就彻底中断,所以搭建ES集群是生产环境的基本要求。
本文从零开始,带你完成一套最小可用集群,所有命令都可直接复制执行。
---
搭建前需要确认的几件事
- 服务器数量:至少2台(推荐3台),每台内存≥2GB(ES非常吃内存)。
- 操作系统:CentOS 7/8 或 Ubuntu 20.04+,自带防火墙暂不干扰。
- JDK版本:ES 7.x 要求 JDK 11 或更高;ES 8.x 自带 JDK 无需额外安装。这里以 ES 7.17.7 为例,需先配置 Java 环境。
- 时间同步:所有服务器时间必须一致,否则节点无法正常通信。
如果使用宝塔面板,建议先切换到系统命令行环境进行操作,ES 集群搭建不推荐在面板内直接配置。
---
一步步搭建 Elasticsearch 集群
1. 在每个节点上执行相同的安装操作
# 下载ES(选择7.17.7版本)
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.7-linux-x86_64.tar.gz
# 解压到 /usr/local 下
sudo tar -zxvf elasticsearch-7.17.7-linux-x86_64.tar.gz -C /usr/local/
sudo mv /usr/local/elasticsearch-7.17.7 /usr/local/elasticsearch
# 创建运行ES的用户(不能用root启动)
sudo useradd -m -s /bin/bash esuser
sudo chown -R esuser:esuser /usr/local/elasticsearch
2. 修改核心配置文件 elasticsearch.yml
# 进入配置目录
cd /usr/local/elasticsearch/config
sudo vim elasticsearch.yml
在每个节点的配置文件中追加以下内容(注意根据节点IP修改):
# 集群名称(所有节点必须一致)
cluster.name: my-es-cluster
# 节点名称(每个节点不同,建议用主机名)
node.name: node-1
# 绑定IP,0.0.0.0表示监听所有网卡
network.host: 0.0.0.0
# 集群通信端口(默认9300)
transport.tcp.port: 9300
# 发现种子节点(填写所有候选节点的IP:9300)
discovery.seed_hosts: ["192.168.1.10:9300", "192.168.1.11:9300", "192.168.1.12:9300"]
# 初始主节点候选(第一次启动时筛选主节点)
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]
注意:cluster.initial_master_nodes 只在集群第一次启动时生效,后续重启不要改动此配置。
3. 调整系统参数(非常重要)
ES 运行时需要大量文件描述符和内存映射区域,否则启动会报错。
# 修改 /etc/security/limits.conf 末尾添加
echo "esuser soft nofile 65536" >> /etc/security/limits.conf
echo "esuser hard nofile 65536" >> /etc/security/limits.conf
echo "esuser soft nproc 4096" >> /etc/security/limits.conf
echo "esuser hard nproc 4096" >> /etc/security/limits.conf
# 修改 /etc/sysctl.conf 末尾添加
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
# 立即生效
sysctl -p
4. 启动每个节点
# 切换为 esuser 用户
su - esuser
# 启动ES(后台运行)
/usr/local/elasticsearch/bin/elasticsearch -d -p /tmp/es.pid
启动后可以使用 tail -f /usr/local/elasticsearch/logs/my-es-cluster.log 查看启动日志。
---
避坑指南与高频问题
常见报错:max file descriptors [4096] for elasticsearch process is too low
原因:系统限制过低。
解决:检查 /etc/security/limits.conf 中 esuser 的 nofile 是否设为 65536,重启 session 后重试。
常见报错:bootstrap check failure [1] of [2]: max virtual memory areas vm.max_map_count [65530] is too low
直接用上面的 sysctl -w vm.max_map_count=262144 即可。
节点一直无法加入集群?
- 确保所有节点防火墙放行 9300/tcp 和 9200/tcp(9200是HTTP API端口)。
- 检查各节点
elasticsearch.yml中cluster.name是否完全一致(包括大小写)。 - 主节点配置
cluster.initial_master_nodes里填写的节点名称必须与node.name一一对应。
内存占用过高怎么办?
默认ES会占用机器一半的物理内存,如果服务器内存只有2GB,请在 jvm.options 中调小堆内存:
# 修改 /usr/local/elasticsearch/config/jvm.options
-Xms512m
-Xmx512m
重启后生效。
---
验证Elasticsearch搜索引擎集群是否搭建成功
执行以下命令,查看集群健康状态:
curl -XGET 'http://192.168.1.10:9200/_cluster/health?pretty'
如果返回 "status" : 表示集群完全正常;
"green"yellow 表示有副本分片未分配(通常是因为只有一个节点,
不影响使用);red 表示有主分片丢失,
需要检查日志。
各节点信息可以通过以下命令查看:
curl -XGET 'http://192.168.1.10:9200/_cat/nodes?v'
出现列表就说明所有节点已成功加入集群。
---
总结
完成上述步骤后,你的Elasticsearch搜索引擎集群搭建就已经落地了。
现在你可以通过Kibana连接集群,或者直接在应用中调用 RESTful API 写入和搜索数据。
如果你是第一次搭建,建议先按本文步骤一步一步来,遇到报错优先对照“避坑指南”部分,大部分问题都能自己解决。
集群稳定后,别忘了配置系统守护进程(systemd)和定期快照备份,这才是生产环境的长久之计。