搜索系列 · 第 04 篇——部署实操:内网集群落地

从离线安装到 Elasticsearch 高可用集群

目 录

一、导读与节点规划

二、单机离线安装

[2.1 依赖与解压](#2.1 依赖与解压)

[2.2 JVM 堆与基础配置](#2.2 JVM 堆与基础配置)

[2.3 启动与验证](#2.3 启动与验证)

三、三节点集群部署

[3.1 集群发现配置](#3.1 集群发现配置)

[3.2 启动与验证](#3.2 启动与验证)

四、系统调优与一键脚本

[4.1 系统参数调优](#4.1 系统参数调优)

[4.2 分片副本与索引默认值](#4.2 分片副本与索引默认值)

[4.3 一键部署脚本骨架](#4.3 一键部署脚本骨架)

五、本篇小结

一、导读与节点规划

前两讲明确了架构与原理,本讲在内网环境从零落地。以 3 台虚机(es01 / 02 / 03)为例部署 Elasticsearch 集群,所有命令均可复制直接执行。生产黄金法则是「主节点不存数据(或少存),数据节点不当主节点」,可拆分为 3 个仅 Master 节点 + N 个纯 Data 节点;本例为简洁采用 3 个 Master + Data 组合节点,兼顾高可用与易维护。

|------------|-------------|---------------|
| 节点 | IP | 角色 |
| es01 | 10.10.10.71 | Master + Data |
| es02 | 10.10.10.72 | Master + Data |
| es03 | 10.10.10.73 | Master + Data |

生产建议最少 3 个主节点候选,仲裁多数派即可容忍 1 台故障。示例 IP 可替换为实际内网环境。

二、单机离线安装

2.1 依赖与解压

Elasticsearch 由 Java 编写,8.x 需 JDK 17+(自带内置 JDK,也可用系统 JDK)。内网环境先把 tar 包放入内网源,再分发到各节点。Elasticsearch 禁止以 root 运行,需创建专用用户:

|-------------------------------------------------------------|
| yum install -y java-17-openjdk |
| tar -zxvf elasticsearch-8.13.2-linux-x86_64.tar.gz -C /opt/ |
| mv /opt/elasticsearch-8.13.2 /opt/elasticsearch |
| useradd -r -M -s /sbin/nologin elasticsearch |
| chown -R elasticsearch:elasticsearch /opt/elasticsearch |

内网需提前备齐:ES tar 包、对应版本的 JDK 与插件(如 IK 分词器插件离线 zip),并核对 glibc 版本(CentOS 7 需 ≥2.17)。

2.2 JVM 堆与基础配置

编辑 config/jvm.options 设置堆大小(生产建议不超物理内存一半、最大约 30GB,避免指针压缩失效):

|----------------------------|
| -Xms4g |
| -Xmx4g |
| # 生产可启用 GC 日志与 CMS/G1 相关参数 |

编辑 config/elasticsearch.yml 配置集群名、节点名、数据/日志目录与监听地址:

|----------------------------------------------|
| cluster.name: nosql-search |
| node.name: es01 # 每节点填各自主机名 |
| path.data: /opt/elasticsearch/data |
| path.logs: /opt/elasticsearch/logs |
| network.host: 0.0.0.0 # 监听地址 |
| http.port: 9200 # REST 接口 |
| discovery.type: single-node # 单机测试用,集群部署删掉本行 |

2.3 启动与验证

|-------------------------------------------------------------------------|
| su -s /bin/bash elasticsearch -c "/opt/elasticsearch/bin/elasticsearch" |
| # 或 systemd 托管(生产推荐) |
| curl -s http://es01:9200 |
| { |
| "cluster_name" : "nosql-search", |
| "tagline" : "You Know, for Search" |
| } |

ES 8.x 默认开启安全认证(xpack.security.enabled: true),首次启动会自动生成证书与内置用户密码;纯内网快速交付时也可先显式关闭安全(xpack.security.enabled: false),跑通后再补安全配置,避免被动。

三、三节点集群部署

3.1 集群发现配置

集群组网靠两项配置:discovery.seed_hosts 列出可联系的其他主节点候选;cluster.initial_master_nodes 在首次组集群时指定参与选主的节点。三节点统一 cluster.name 与 seed_hosts,即可互相发现并选主:

|----------------------------------------------------------|
| # 三节点统一配置(node.name 各自不同) |
| cluster.name: nosql-search |
| node.name: es01 |
| network.host: 0.0.0.0 |
| http.port: 9200 |
| transport.port: 9300 # 节点间通信端口 |
| discovery.seed_hosts: "es01", "es02", "es03" |
| cluster.initial_master_nodes: "es01", "es02", "es03" |
| node.roles: "master", "data", "ingest" |

transport.port 9300 仅用于节点间通信(传输层),HTTP 端口 9200 供 REST 客户端使用。node.roles 通过 node.roles 显式指定角色;不设置则节点承担全部默认角色。

3.2 启动与验证

|-------------------------------------------------|
| systemctl start elasticsearch # 三节点分别启动 |
| curl -s http://es01:9200/_cluster/health?pretty |
| curl -s http://es01:9200/_cat/nodes?v |
| curl -s http://es01:9200/_cat/master?v |

集群健康状态三色:green 表示所有主分片与副本就绪;yellow 表示副本未分配;red 表示存在主分片不可用。看到 es01/02/03 均在 _cat/nodes 列表中且状态 green,即集群形成。

四、系统调优与一键脚本

4.1 系统参数调优

Elasticsearch 对系统资源有硬性要求,不调优启动即报错。核心三项:文件句柄与进程数上限、虚拟内存映射数、内存锁定:

|-------------------------------------------------------|
| cat >> /etc/security/limits.conf <<EOF |
| elasticsearch - nofile 65535 |
| elasticsearch - nproc 4096 |
| EOF |
| sysctl -w vm.max_map_count=262144 # 必须 ≥262144,否则无法启动 |
| sysctl -w vm.swappiness=1 |
| ulimit -l unlimited # 配合 bootstrap.memory_lock 锁定堆 |

在 elasticsearch.yml 中设置 bootstrap.memory_lock: true 可锁定堆内存避免被 swap 换出,显著提升稳定性。

4.2 分片副本与索引默认值

|-----------------------------|
| # 索引默认分片数与副本数 |
| index.number_of_shards: 3 |
| index.number_of_replicas: 1 |
| # 生产建议单分片 10-50GB,副本数提供高可用 |

4.3 一键部署脚本骨架

|----------------------------------------------------------------------------------|
| #!/bin/bash |
| # es-deploy.sh ------ 按 hostname 配置 ES 并启动 |
| SELF=(hostname) | | IP=(grep -F "SELF" /etc/hosts \| awk "{print 1}") |
| CFG=/opt/elasticsearch/config/elasticsearch.yml |
| sed -i "s/^node.name:.*/node.name: SELF/" CFG |
| grep -q "discovery.seed_hosts" CFG \\ | | \|\| echo "discovery.seed_hosts: \[\\"es01\\",\\"es02\\",\\"es03\\"\]" \>\> CFG |
| sysctl -w vm.max_map_count=262144 |
| systemctl start elasticsearch |

脚本仅演示核心逻辑,生产还需补充 systemd 服务文件、防火墙放行 9200/9300、数据目录定期快照、与 Logstash/Kibana 的对接,以及滚动升级与备份策略。

五、本篇小结

本讲完成 Elasticsearch 内网落地:先做单机离线安装(JDK + tar 包 + jvm.options + elasticsearch.yml + curl 验证),再基于 discovery.seed_hosts 与 cluster.initial_master_nodes 搭建三节点集群,并给出系统调优、分片副本默认值与一键脚本骨架。

下一篇进入选型对比,把 Elasticsearch 与 Solr、OpenSearch 及关系库全文检索放在同一坐标系横向比较。

相关推荐
Elastic 中国社区官方博客1 小时前
使用 Jev 作为 search reranker:基准测试与实现方法
大数据·运维·elasticsearch·全文检索
红红谈说2 小时前
浏览器自动化环境老是起不来?依赖治理与启动自检的一次复盘
运维·自动化·浏览器自动化·进程残留·环境依赖·启动自检·版本比较
赵民勇2 小时前
glib-compile-schemas命令详解
linux·运维
小小、码农2 小时前
〖Linux进程间通信〗IPC全家桶:匿名管道、FIFO、共享内存、消息队列与信号量一篇打通
linux·运维·服务器
阳光九叶草LXGZXJ3 小时前
达梦数据库-学习-67-SSL加密认证
linux·运维·数据库·sql·学习·ssl
掉进电商坑三年没爬出来的东叔3 小时前
2026最新:青龙面板搭建全自动薅羊毛脚本,云服务器24小时挂机教程
运维·服务器·pygame
ggaofeng3 小时前
精简版ssh(去掉认证和加密流程,更清晰的展示远程登录的底层实现)
运维·ssh
0+1113 小时前
Linux --应用层自定义协议与序列化
linux·运维·服务器·网络·tcp
dyxal3 小时前
Linux Crontab 防重复执行利器:flock 文件锁实战详解(脱敏版)
linux·运维·服务器