第2章 Elasticsearch安装部署:单节点安装、集群部署、配置文件详解

Elasticsearch的安装并不复杂,但坑不少。我见过很多新手上来就apt install elasticsearch,然后被默认配置坑得死去活来。其实,生产环境我建议用tar包手动部署,原因很简单——你对目录结构、启动参数、版本控制都有掌控。下面从单节点开始,再到集群,最后把配置文件掰开揉碎讲清楚。

2.1 单节点安装

首先下载tar包,我习惯从官方源拉:

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.10-linux-x86_64.tar.gz
tar -xzf elasticsearch-7.17.10-linux-x86_64.tar.gz
cd elasticsearch-7.17.10

解压后记得检查一下jdk版本。ES自带捆绑JDK,但如果你系统里装了其他版本,容易冲突。我在项目里遇到过默认JDK 11,结果系统变量覆盖了自带的,启动直接报java.lang.UnsupportedClassVersionError。解决办法:进bin/elasticsearch脚本里把JAVA_HOME指向自带目录即可。

启动前做两个系统优化:

  • 文件描述符限制:ulimit -n 65535,不然运行几天就会报too many open files。
  • 虚拟内存映射数:vm.max_map_count = 262144(在/etc/sysctl.conf里加),否则ES拒绝启动。

启动命令就一行:

# 不允许root用户运行,必须新建普通用户
useradd esuser
chown -R esuser:esuser elasticsearch-7.17.10
su esuser
./bin/elasticsearch

看到日志里出现started就表示成功了。验证:

curl http://localhost:9200
# 返回类似 {"name":"node-1","cluster_name":"elasticsearch",...}
小技巧:启动时加-d参数后台运行,日志输出到logs/elasticsearch.log。我习惯用tail -f logs/*.log实时观察启动过程,第一时间发现异常。

2.2 集群部署

单节点只能用来开发测试。生产环境至少三节点起步,说白了就是“不能把所有鸡蛋放一个篮子里”。集群的核心配置就三个:节点发现、主节点选举、数据同步。

假设有三个节点:node-1, node-2, node-3,IP分别是192.168.1.101~103。每个节点的elasticsearch.yml核心改动如下(以node-1为例):

cluster.name: prod-es-cluster          # 三个节点必须相同
node.name: node-1                      # 每个节点唯一
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 192.168.1.101           # 绑定本机IP
http.port: 9200

discovery.seed_hosts: ["192.168.1.101:9300", "192.168.1.102:9300", "192.168.1.103:9300"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

这里有个易错点——cluster.initial_master_nodes只在第一次集群启动时生效。我记得有一次我重启了整个集群,忘记清掉这个配置,结果新节点死活加不进来。其实,首次初始化后,这个配置就可以删掉或者注释掉了,后续靠discovery.seed_hosts自动发现。

分别启动三个节点,观察日志:

# 任一节点上查看集群健康状态
curl http://192.168.1.101:9200/_cluster/health?pretty
# 理想状态:
{
  "cluster_name": "prod-es-cluster",
  "status": "green",
  "number_of_nodes": 3,
  "number_of_data_nodes": 3
}
警告:千万别用network.host: 0.0.0.0对外暴露,除非你做好了防火墙+HTTPS。我亲眼见过一个公司把ES裸奔到公网,第二天就被挖矿了。

2.3 配置文件详解

配置文件主要分三部分:路径、网络、集群。我用表格把最关键的参数列出来,你安装时对着改就行:

配置项 默认值 推荐值 说明
cluster.name elasticsearch 自定义(如app-log-cluster) 同一集群所有节点必须一致
node.name 主机名 手动指定,便于识别 集群内唯一,日志里会用到
path.data $ES_HOME/data /data/elasticsearch/data 建议挂载独立磁盘,避免系统盘占满
path.logs $ES_HOME/logs /var/log/elasticsearch 日志轮转建议交给logrotate
network.host 127.0.0.1 内网IP(如192.168.x.x) 绑定地址,不能写0.0.0.0
http.port 9200-9300 9200 REST接口端口
transport.port 9300-9400 9300 节点间通信端口
discovery.seed_hosts [] 所有节点IP:9300 集群发现种子节点列表
cluster.initial_master_nodes [] 前3个节点名 首次启动时的候选主节点
node.master true 每节点都设true(小集群) 该节点是否可被选举为主节点

另外,JVM堆内存也是配置重点。打开config/jvm.options或者使用ES_JAVA_OPTS环境变量:

-Xms4g
-Xmx4g           # 堆大小不超过物理内存50%,且不超过32GB
-XX:+UseG1GC     # 7.17默认就是G1GC,但显式写上更稳

避坑指南:我曾经把堆内存设到30G,结果GC停顿时间飙到10秒以上,索引写入直接熔断。后来查资料发现<  26G时JVM会启用压缩指针,性能提升明显。现在我的经验是:物理内存64G的机器,堆给16G;128G的机器,堆给31G(别超过32G的踩坑点)。

还有一个容易被忽略的参数——indices.fielddata.cache.size。如果你要做大量聚合查询,建议设为20%堆大小,否则内存溢出分分钟教做人。我当年在生产上吃过亏,一个terms聚合就OOM了,重启后赶紧加上这个限制。

最后,系统层面的/etc/security/limits.conf必须配好:

esuser soft nofile 65536
esuser hard nofile 65536
esuser soft nproc 4096
esuser hard nproc 4096

知识结构:ES安装部署核心关系

Elasticsearch 安装部署核心知识关系图 系统准备 (文件描述符/内存映射) 单节点安装 tar包解压 → 配置 → 启动 集群部署 至少3节点 → 发现 → 选举 配置文件详解 (elasticsearch.yml) cluster.name / node.name / network.host discovery.seed_hosts / initial_master_nodes JVM堆内存 / fielddata缓存 验证:curl /_cluster/health 单节点用于开发测试,集群用于生产。配置文件三要素:集群名、节点名、网络与发现。

好了,上面这张图把安装、部署、配置、验证串了一遍。你按照这个顺序操作,基本不会出大问题。生产环境一定要先测试再上线,特别是集群配置,别像我当年那样手抖写错节点名导致两套集群互相发现——清理索引的滋味可不好受。