3、ES安装与配置:单机部署、集群部署、JVM调优、关键配置项

好,咱们开始聊安装配置。说实话,ES的安装本身并不复杂,但很多人栽在配置上。我见过不少团队,集群搭起来了,跑了两天就崩了,一查全是配置埋的雷。今天我把单机、集群、JVM调优、还有那几个要命的关键配置项,一次性给你讲透。

3.1 单机部署:先跑起来再说

单机部署,说白了就是让你先体验一下ES。我个人习惯在开发环境用单机,生产环境?嗯,除非你数据量极小,否则别这么干。

步骤其实就三步:

  1. 下载解压:去官网下载tar包,解压到你喜欢的目录。我一般放 /usr/local/elasticsearch
  2. 启动./bin/elasticsearch,就这么简单。但注意,ES不允许用root用户启动,你得新建一个用户。
  3. 验证:浏览器访问 http://localhost:9200,看到JSON返回就对了。

重要提醒:单机部署时,cluster.initial_master_nodes 必须配置为节点名称。否则ES会一直等别的节点加入,启动不起来。我曾经帮一个同事排查了半天,最后发现就是少了这一行。

3.2 集群部署:这才是生产环境该有的样子

集群部署,核心就一句话:让多个节点互相发现,然后选一个主节点出来。我建议至少三台机器,别问我为什么,你想想看,两台机器万一挂了一台,集群就脑裂了,多尴尬。

集群配置的关键,在于 elasticsearch.yml 这个文件。我直接给你一个我常用的模板:

# 集群名称,所有节点必须一致
cluster.name: my-es-cluster

# 节点名称,每个节点不同
node.name: node-1

# 网络绑定地址,生产环境别用127.0.0.1
network.host: 0.0.0.0

# 对外服务的端口
http.port: 9200

# 节点间通信端口
transport.port: 9300

# 初始主节点列表
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

# 发现种子节点
discovery.seed_hosts: ["192.168.1.10:9300", "192.168.1.11:9300", "192.168.1.12:9300"]

我的经验discovery.seed_hosts 这个配置,很多人只写IP不写端口,结果节点死活连不上。默认端口是9300,但如果你改了,一定要写全。我踩过这个坑,那次排查了整整两个小时。

3.3 JVM调优:别让内存成为瓶颈

ES是Java写的,JVM调优绕不开。说白了,ES对内存的消耗主要在堆内存和文件系统缓存上。我见过有人给ES分配了64G堆内存,结果GC频繁到服务都挂了。为什么?因为堆内存太大,GC一次要扫半天。

我的建议是:

  • 堆内存不要超过32G:这是JVM的指针压缩临界点。超过32G,对象指针从32位变成64位,内存占用直接翻倍。
  • 堆内存不要超过物理内存的50%:另一半留给Lucene的文件系统缓存。你想想看,ES的搜索性能很大程度上依赖文件缓存,你把内存全给堆了,搜索反而变慢。
  • 修改方式:编辑 config/jvm.options 文件,找到 -Xms-Xmx,设为相同值。比如:
-Xms16g
-Xmx16g

警告:千万别在生产环境动态调整堆内存。我曾经在线上改了 -Xmx 没重启,结果ES直接OOM。JVM参数必须重启才能生效,这是铁律。

3.4 关键配置项详解:network.host 和 discovery.seed_hosts

这两个配置,是ES集群的命门。我单独拿出来讲,因为太多人在这里翻车了。

3.4.1 network.host

这个配置决定了ES监听哪个网络接口。默认是 127.0.0.1,只允许本机访问。生产环境你得改成 0.0.0.0,表示监听所有网卡。但注意,改了之后ES会从 development 模式切换到 production 模式,会强制检查一些配置,比如 discovery.seed_hostscluster.initial_master_nodes。如果你没配,ES会报错启动不了。

我个人习惯是:

  • 开发环境用 127.0.0.1,省事。
  • 生产环境用具体的IP地址,比如 192.168.1.10,而不是 0.0.0.0。这样更安全,也方便排查问题。

3.4.2 discovery.seed_hosts

这个配置是告诉ES:你的小伙伴们在哪。它是一个列表,每个元素是 host:port 的格式。ES启动后,会尝试连接这些地址,发现其他节点。

这里有个坑:列表里不需要包含本节点。ES会自动发现本节点。我曾经把本节点也写进去了,结果启动日志里全是连接自己的报错,虽然不影响运行,但看着闹心。

避坑指南:如果你用Docker部署,discovery.seed_hosts 要写容器名或者服务名,而不是IP。因为Docker容器的IP是动态分配的。我刚开始用Docker跑ES集群时,每次重启都要改配置,后来改成服务名才消停。

3.5 其他值得注意的配置

除了上面两个,还有几个配置我建议你关注一下:

配置项 说明 我的建议
bootstrap.memory_lock 锁定内存,防止被交换到磁盘 设为 true,尤其是内存紧张的环境
gateway.recover_after_nodes 集群恢复时,等待多少个节点加入后才开始恢复数据 设为集群节点数的大多数,比如3节点集群设为2
action.destructive_requires_name 禁止使用通配符删除索引 设为 true,防止误删。我见过有人手滑删了整个集群的数据

一个小技巧:配置完成后,用 curl -X GET "localhost:9200/_cluster/health" 检查集群状态。如果返回 "status": "green",说明一切正常。如果是 yellowred,那就得排查了。我每次部署完都会跑一下这个命令,心里才踏实。

好了,安装配置这块就聊这么多。记住,ES的配置不是一次性的,你得根据实际运行情况不断调整。下一章咱们聊聊索引管理和数据写入,那才是真正考验功底的地方。