📌 什么是 Elasticsearch?
Elasticsearch(简称 ES)是基于 Apache Lucene 构建的开源分布式、RESTful 风格的搜索与实时数据分析引擎。作为 Elastic Stack(ELK:Elasticsearch, Logstash, Kibana)的核心枢纽,它支持海量结构化与非结构化数据的水平扩展、倒排索引全文检索及聚合统计分析。
凭借其准实时搜索(NRT)、PB 级分布式高可用架构、强大的多维聚合分析及丰富的多语言客户端 SDK,Elasticsearch 被广泛应用于站内搜索引擎、微服务日志集中检索系统(ELK)、安全运维监控(SIEM)及电商商品复杂过滤检索等领域。
🛠️ 一、Linux 系统中安装指定版本 Elasticsearch
在版本选择上:
- ES 7.x(如 7.17.x):成熟稳定,默认不强制开启 HTTPS 安全认证(开箱直连)。
- ES 8.x(如 8.12.x):全面内置优化版 JDK 运行时,默认强制启用 Security(HTTPS + 密码生成),性能和索引压缩率显著提高。
步骤 1:安装 Elasticsearch 指定版本
方法 1:使用 Elastic 官方仓库安装(推荐)
1. Ubuntu / Debian 系统
# 1. 导入 Elastic GPG 公钥sudo apt update && sudo apt install -y wget apt-transport-https gpgwget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
# 2. 添加官方 8.x 或 7.x 仓库源echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
# 3. 更新并检索版本sudo apt updateapt-cache madison elasticsearch
# 4. 安装指定版本(例如 8.12.2)sudo apt install -y elasticsearch=8.12.2sudo apt-mark hold elasticsearch2. CentOS / RHEL / Rocky Linux 系统
# 1. 导入公钥sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# 2. 创建仓库配置文件 /etc/yum.repos.d/elasticsearch.reposudo tee /etc/yum.repos.d/elasticsearch.repo <<EOF[elasticsearch-8.x]name=Elasticsearch repository for 8.x packagesbaseurl=https://artifacts.elastic.co/packages/8.x/yumgpgcheck=1gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearchenabled=1autorefresh=1type=rpm-mdEOF
# 3. 安装指定版本sudo yum list elasticsearch --showduplicates | sort -rsudo yum install -y elasticsearch-8.12.2方法 2:通用归档包免安装解压部署(Generic Tarball)
# 1. 下载指定版本(自带 Bundled JDK)wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.12.2-linux-x86_64.tar.gztar -zxvf elasticsearch-8.12.2-linux-x86_64.tar.gzsudo mv elasticsearch-8.12.2 /opt/elasticsearch
# 2. 创建专用的非特权用户(ES 严格禁止 root 直接运行)sudo groupadd esgroupsudo useradd -g esgroup esusersudo chown -R esuser:esgroup /opt/elasticsearch
# 3. 切换为 esuser 启动sudo -u esuser /opt/elasticsearch/bin/elasticsearch -d步骤 2:修改核心配置文件(elasticsearch.yml)
Elasticsearch 的主配置文件路径:
- 包管理器安装(DEB / RPM):
/etc/elasticsearch/elasticsearch.yml - 归档包解压安装(Tarball):
/opt/elasticsearch/config/elasticsearch.yml
使用文本编辑器(如 sudo nano 或 sudo vim)编辑该文件,配置核心参数:
# ======================== 集群与节点设置 ========================# 集群名称(同集群内所有节点名称必须相同,默认 elasticsearch)cluster.name: my-application
# 当前节点名称(节点间不可重复,便于日志与集群监控定位)node.name: node-1
# ======================== 路径设置 ========================# 数据持久化存储路径path.data: /var/lib/elasticsearch
# 日志存储路径path.logs: /var/log/elasticsearch
# ======================== 网络与端口设置 ========================# 监听网络地址:0.0.0.0 允许所有网络/远程客户端访问(默认仅监听 127.0.0.1)network.host: 0.0.0.0
# HTTP RESTful API 监听端口(默认 9200)http.port: 9200
# 集群内部节点间 TCP 通信端口(默认 9300)transport.port: 9300
# ======================== 集群发现与初始主节点 ========================# 初始化主节点选举列表(首次启动集群时必配,填写参与选举的 node.name)cluster.initial_master_nodes: ["node-1"]
# 集群节点发现种子主机列表(单机部署可保留本节点或注释)# discovery.seed_hosts: ["127.0.0.1", "[::1]"]
# ======================== 安全机制(ES 8.x 默认开启) ========================# 是否开启 X-Pack 身份认证与访问控制(生产环境强烈建议开启)xpack.security.enabled: true
# 是否开启 HTTP 传输层 SSL/TLS 加密通信(开启后需使用 https:// 访问)xpack.security.http.ssl: enabled: trueTIP
- 修改
network.host为非本地回环地址(如0.0.0.0)后,Elasticsearch 会自动由“开发模式”切换为**“生产模式”**,启动时会执行严格的系统自检(如vm.max_map_count、文件描述符等)。- 如果是学习测试环境且不想配置 SSL 证书,可临时将
xpack.security.http.ssl.enabled设为false(支持直接用http://访问)。
步骤 3:通过 systemctl 管理 Elasticsearch 服务
包管理器(APT/YUM)安装完成后,Elasticsearch 会自动注册为 systemd 系统服务:
# 1. 重新加载 systemd 守护进程配置文件sudo systemctl daemon-reload
# 2. 设置开机自启动sudo systemctl enable elasticsearch
# 3. 启动 Elasticsearch 服务sudo systemctl start elasticsearch
# 4. 检查服务运行状态(确认 active (running) 状态)sudo systemctl status elasticsearch
# 5. 常用维护命令:停止与重启sudo systemctl stop elasticsearch # 停止服务sudo systemctl restart elasticsearch # 重启服务步骤 4:配置防火墙放行 9200 端口
为了让局域网或外部客户端能够访问 Elasticsearch 的 HTTP 接口,需要放行 9200 端口(若有集群节点通信需求,还需放行 9300 端口):
1. Ubuntu / Debian 系统(UFW 防火墙)
# 放行 9200 端口(TCP)sudo ufw allow 9200/tcp
# 重新加载防火墙规则sudo ufw reload
# 查看当前放行规则状态sudo ufw status2. CentOS / RHEL / Rocky Linux 系统(Firewalld 防火墙)
# 永久放行 9200 端口sudo firewall-cmd --zone=public --add-port=9200/tcp --permanent
# 重新加载生效sudo firewall-cmd --reload
# 查看已放行的端口列表sudo firewall-cmd --list-ports步骤 5:验证 Elasticsearch 版本、运行状态与网页访问
1. 命令行查看 Elasticsearch 安装版本
通过 CLI 命令或系统包管理器可直接查询当前安装的精准版本及编译信息:
# 方式 A:直接运行 ES 可执行文件查询版本与内置 JVM/usr/share/elasticsearch/bin/elasticsearch --version# 输出示例:Version: 8.12.2, Build: deb/48a64abb7d686e820c4733fbe177bd70f1a0058c/2024-02-19T10:04:32.774273129Z, JVM: 21.0.2
# 方式 B:通过系统包管理器检索已安装包版本# Ubuntu / Debiandpkg -l | grep elasticsearch
# CentOS / RHEL / Rocky Linuxrpm -qa | grep elasticsearch2. 检查服务与端口监听状态
# 1. 查看 systemd 服务运行状态sudo systemctl status elasticsearch
# 2. 检查 9200 (HTTP) 与 9300 (TCP 集群通信) 端口监听情况sudo ss -tulpn | grep -E '9200|9300'# 或使用 netstatsudo netstat -tulpn | grep -E '9200|9300'3. 设置 / 重置超级管理员 elastic 密码
- 在 ES 8.x 首次安装启动时,系统会在控制台自动输出默认超级用户
elastic的临时初始密码。 - 若未记录或需要自定义密码,可使用官方提供的重置密码工具:
# 方式 A:交互式自定义输入新密码(推荐)sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -i
# 方式 B:自动生成并打印随机强密码sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic4. 通过 REST API 验证版本信息与集群健康状态
(1) 查看基础版本信息(根路径 API)
# ES 8.x 启用了 HTTPS 时访问(使用 -k 忽略自签名证书告警)curl -k -u elastic:你的密码 https://localhost:9200
# 若关闭了 SSL 或为 ES 7.x 纯 HTTP 访问curl -u elastic:你的密码 http://localhost:9200(2) 查看集群健康状态(Cluster Health)
curl -k -u elastic:你的密码 https://localhost:9200/_cluster/health?pretty健康状态(status)说明:
- 🟢 green(绿色):所有主分片(Primary)和副本分片(Replica)均正常分配运行,集群处于最理想状态。
- 🟡 yellow(黄色):所有主分片正常运行,但部分副本分片尚未分配(单节点单机部署未配置从节点时为正常现象)。
- 🔴 red(红色):存在部分主分片未分配,数据存在丢失或无法写入风险,需紧急排查节点或磁盘。
(3) 查看集群节点列表与资源信息(_cat/nodes)
curl -k -u elastic:你的密码 "https://localhost:9200/_cat/nodes?v&h=ip,port,heap.percent,ram.percent,cpu,load_1m,node.role,master,name"5. 浏览器网页访问验证
- 打开电脑浏览器,在地址栏输入访问地址:
https://<你的服务器IP地址>:9200
(若关闭了 SSL 则输入http://<你的服务器IP地址>:9200) - 浏览器会弹出 HTTP 基础身份认证(Basic Auth)登录弹窗,输入:
- 用户名:
elastic - 密码:前面重置或设置的密码
- 用户名:
- 点击登录后,页面成功输出以下格式的 JSON 数据,并看到经典的
"tagline": "You Know, for Search",即代表 Elasticsearch 已成功部署并正常对外提供服务:
{ "name" : "node-1", "cluster_name" : "my-application", "cluster_uuid" : "abc123XYZ456-example", "version" : { "number" : "8.12.2", "build_flavor" : "default", "build_type" : "deb", "build_hash" : "48a64abb7d686e820c4733fbe177bd70f1a0058c", "build_date" : "2024-02-19T10:04:32.774273129Z", "build_snapshot" : false, "lucene_version" : "9.9.2", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search"}🐳 二、Linux 下使用 Docker 快速部署 Elasticsearch + Kibana
1. docker run 单节点单行极速启动
docker run -d \ --name es-server \ -p 9200:9200 \ -p 9300:9300 \ -e "discovery.type=single-node" \ -e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \ -e "xpack.security.enabled=false" \ -v /opt/es/data:/usr/share/elasticsearch/data \ --restart unless-stopped \ elasticsearch:8.12.2端口说明:
9200:HTTP RESTful 接口与客户端访问端口。9300:集群节点间内部 TCP 节点发现与数据同步通信端口。
2. docker-compose.yml 完整编排(ES + Kibana 控制台)
version: '3.8'
services: elasticsearch: image: elasticsearch:8.12.2 container_name: es-node restart: always environment: - node.name=es-node1 - cluster.name=es-docker-cluster - discovery.type=single-node - bootstrap.memory_lock=true - "ES_JAVA_OPTS=-Xms2g -Xmx2g" - xpack.security.enabled=false # 开发/内网测试环境可设为 false 避免证书阻碍 ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 ports: - "9200:9200" - "9300:9300" volumes: - ./data:/usr/share/elasticsearch/data - ./logs:/usr/share/elasticsearch/logs
kibana: image: kibana:8.12.2 container_name: kibana-dashboard restart: always environment: - ELASTICSEARCH_HOSTS=http://elasticsearch:9200 - I18N_LOCALE=zh-CN ports: - "5601:5601" depends_on: - elasticsearch⚖️ 三、Docker 部署 vs 传统宿主机部署优劣对比
| 评估维度 | Docker 容器化部署 | 传统宿主机/裸机部署 (APT/YUM/RPM) |
|---|---|---|
| JDK 依赖管理 | 🌟 完全内置,无需在宿主机配置复杂 Java 环境 | 🌟 ES 7/8 已自带 Bundled JDK,包管理器安装也会自动配置 |
| 系统参数与资源调优 | 需在宿主机配置 sysctl 并对容器声明 ulimits | 🛠️ 直接修改 /etc/security/limits.conf 和 /etc/sysctl.conf,更直观 |
| 集群扩展与节点编排 | 🌟 极度灵活,在一台大物理机上快速拉起多分片测试集群 | ⚠️ 需要为每个节点单独建立数据、配置与日志目录 |
| 磁盘 I/O 极限性能 | 存在微小文件层虚拟化损耗(大批量 Bulk 写入时体现) | 🚀 原生磁盘读写极限性能,直接配合 NVMe SSD RAID0/10 表现最佳 |
NOTE选型决策参考:
- 开发、测试、日志收集(ELK 架构)、中小规模检索:优先选用 Docker + Docker Compose。
- TB/PB 级大规模生产集群、严苛低延迟检索与海量 Bulk 写入:建议 物理机/宿主机独立部署,以确保充分利用物理内存并锁定内存页。
⚠️ 四、新手最容易犯错的关键坑点与解决方案
💣 坑点 1:使用 root 用户启动直接报错退出
现象
执行 ./bin/elasticsearch 启动时直接报错崩溃:
java.lang.RuntimeException: can not run elasticsearch as root。
核心原因
出于系统安全防护考量,Lucene 和 Elasticsearch 严禁在 root 超级用户下运行(防止通过脚本注入攻击掌控整台服务器)。
解决方案
必须创建非特权用户启动:
sudo groupadd esgroupsudo useradd -g esgroup esusersudo chown -R esuser:esgroup /opt/elasticsearchsudo -u esuser /opt/elasticsearch/bin/elasticsearch💣 坑点 2:虚拟内存区域不足导致启动闪退(max virtual memory areas vm.max_map_count)
现象
日志报出启动自检严重错误:
max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]。
核心原因
Elasticsearch 大量依赖 Lucene 的 MMapDirectory 映射倒排索引,Linux 默认的 vm.max_map_count=65530 远无法满足要求。
解决方案
修改宿主机 Linux 内核参数:
# 临时生效sudo sysctl -w vm.max_map_count=262144
# 永久生效echo "vm.max_map_count = 262144" | sudo tee -a /etc/sysctl.confsudo sysctl -p💣 坑点 3:文件描述符与线程数上限限制(nofile / nproc)
现象
自检失败提示:
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]。
解决方案
编辑 /etc/security/limits.conf,在末尾添加:
* soft nofile 65536* hard nofile 65536* soft nproc 4096* hard nproc 4096* soft memlock unlimited* hard memlock unlimited💣 坑点 4:ES 8.x 默认强制开启 HTTPS 导致业务 SDK 握手报错
现象
使用 Java RestHighLevelClient、Python 或 Node.js 连接 ES 8.x 时报 SSLHandshakeException 或 ProtocolException: connection closed。
核心原因
ES 8.0+ 默认启用了 X-Pack Security 与自签名 SSL 证书。
解决方案
- 方式 A(测试环境关闭安全校验):
在
elasticsearch.yml中将 security 设为false:elasticsearch.yml xpack.security.enabled: falsexpack.security.http.ssl.enabled: false - 方式 B(生产环境推荐:重置密码并信任证书):
系统终端 # 重置 elastic 账号的超级管理员密码sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
💣 坑点 5:JVM 堆内存设置超出 31GB(压缩指针失效)
现象
服务器有 128GB 物理内存,管理员为了追求高性能将 ES 堆内存设为 64GB,结果检索性能反而急剧下滑、GC 停顿暴增。
核心原因
Java 64 位 JVM 在堆内存小于 32GB 时会默认启用压缩对象指针(Compressed OOPs),指针仅占 4 字节;一旦超过 31GB~32GB 临界值,指针被迫升级为 8 字节,不仅占用内存多出近一倍,还会降低 CPU 缓存命中率。
CAUTIONES 内存黄金配置法则:
- 单个 ES 节点的 JVM 堆内存切勿超过物理内存的 50%(留出一半内存给 Linux 系统的 PageCache 缓存 Lucene 索引文件)。
- JVM 堆内存上限绝不可超过 31GB(推荐设置为
30g以内)。
解决方案
在 config/jvm.options 中配置:
-Xms30g-Xmx30g📋 五、生产环境通用优化配置模板(elasticsearch.yml)
# === 集群与节点标识 ===cluster.name: my-prod-clusternode.name: node-1node.roles: ["master", "data", "ingest"]
# === 存储与日志路径 ===path.data: /var/lib/elasticsearchpath.logs: /var/log/elasticsearch
# === 内存锁定(防止内存交换到 Swap 产生严重停顿) ===bootstrap.memory_lock: true
# === 网络监听 ===network.host: 0.0.0.0http.port: 9200transport.port: 9300
# === 集群发现与初始主节点选举 ===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"]
# === 跨域配置(供 Web 端 Header 与管理控制台连接) ===http.cors.enabled: truehttp.cors.allow-origin: "*"http.cors.allow-headers: "X-Requested-With,Content-Type,Content-Length,Authorization"
# === 默认分片与生命周期 ===cluster.routing.allocation.enable: all🎯 总结速查
- 版本选择:
- 追求简单开箱直连与旧生态兼容选 ES 7.17.x;追求最新高效索引压缩与内置 JDK 选 ES 8.x。
- 生产上线避坑清单:
- 禁止使用 root 身份直接启动 Elasticsearch;
- 永久将系统
vm.max_map_count调高至262144; - 将最大文件描述符
nofile调高至65536; - 堆内存严格遵守
Xms = Xmx = 物理内存 50%且不超过31GB; - 开启
bootstrap.memory_lock: true彻底禁用 Swap 内存置换。
发现错误或想要改进这篇文章?
在 GitHub 上编辑此页
陕公网安备61040202000874号