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