☰
搜索系列 · 第 04 篇——部署实操:内网集群落地
2026/10/2 13:52:20 网站建设 项目流程

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

目 录

一、导读与节点规划

二、单机离线安装

2.1 依赖与解压

2.2 JVM 堆与基础配置

2.3 启动与验证

三、三节点集群部署

3.1 集群发现配置

3.2 启动与验证

四、系统调优与一键脚本

4.1 系统参数调优

4.2 分片副本与索引默认值

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 及关系库全文检索放在同一坐标系横向比较。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询