Elasticsearch 介绍及集群部署

一.Elasticsearch核心概念

Elasticsearch(简称 ES)天生就是为集群设计的,单机无意义,ES 单机模式性能差、无高可用、存储容量有限,生产环境中必须部署集群。

1.核心基础概念

  • Node(节点):就是一台运行了 Elasticsearch 服务的服务器 / 虚拟机,是集群的最小组成单元,每一个节点都是一个独立的 ES 进程。
  • Cluster(集群) :由 ≥2 个 Node 节点组成的集合就是集群,所有节点通过相同的 cluster.name 标识组成一个集群,集群对外提供统一的服务入口,对用户来说「集群就是一个整体」,不用关心数据存在哪个节点。
  • 分片(Shard) :ES 中数据的最小存储单元,核心作用是「水平拆分数据」。
    • ES 会把一个索引(Index)的数据,自动切分成多个分片,分散存储在集群的不同节点上;
    • 分片分为两种:主分片 (Primary Shard) + 副本分片 (Replica Shard) ,主副分片永不共存于同一个节点。
    • 作用:解决「单节点存储容量不足」+「单节点查询性能瓶颈」问题,分片数越多,能承载的数据量越大、查询并发越高(分片数创建索引时指定,不可修改)。
  • 副本(Replica) :主分片的完整备份,核心作用是**「高可用」+「分担查询压力」** 。
    • 当存储主分片的节点宕机,ES 会自动将副本分片升级为主分片,业务无感知,保证数据不丢失、服务不中断;
    • 副本分片也能处理查询请求,分担主分片的查询压力,提升集群查询性能。
    • 副本数支持动态修改,生产建议副本数≥1,副本数越多,可用性越高,但占用的磁盘空间越多。

2.索引相关核心概念

  • Index(索引) :ES 中的「索引」≈ 关系型数据库的「数据库 (Database)」,是存储一类结构化 / 非结构化数据的逻辑集合,比如 user_index 存储用户数据、log_index 存储日志数据。
  • Document(文档):ES 中的「文档」≈ 关系型数据库的「行 (Row)」,是 ES 中最小的可检索数据单元,文档是 JSON 格式的键值对数据。
  • Type(类型) :ES7.x 及以上版本 已废弃 Type ,默认只有一个 _doc 类型;ES6.x 中一个索引可以有多个 Type,≈ 数据库的「表 (Table)」。
  • Mapping(映射):ES 中的「Mapping」≈ 关系型数据库的「表结构 / 字段类型」,用来定义文档的字段名称、字段类型(text/keyword/int/date 等)、是否分词、是否创建索引等规则,决定了数据如何被存储和检索。

3.节点角色相关概念

ES7.x 开始废除了旧的节点类型,采用「角色划分」的方式,一个节点可以配置单角色 / 多角色,生产环境建议「角色分离」部署,各司其职,提升集群稳定性,核心角色如下

  • master-eligible 节点(候选主节点) :参与集群「主节点选举」的节点,集群启动时会从该类节点中选举出一个 主节点。
    • 主节点(Master Node):集群的「大脑」,只负责集群的元数据管理,不存储数据、不处理数据读写请求,核心工作:创建 / 删除索引、分片分配、节点上下线管理、维护集群状态。
    • 生产建议:集群至少配置 3 台候选主节点,选举出 1 个主节点,其余为备用,防止主节点宕机导致集群脑裂 / 不可用。
  • data 节点(数据节点) :集群的「苦力」,核心职责是存储数据、处理数据的 CRUD / 查询 / 聚合请求,是集群的性能核心,占用磁盘和内存资源最多。
    • 生产建议:根据数据量和查询压力,部署多台 data 节点,是集群中数量最多的节点类型。
  • ingest 节点(预处理节点):数据写入 ES 前,对数据做「预处理」,比如:字段过滤、数据格式转换、新增字段、数据脱敏等,相当于数据的 "清洗机"。
  • coordinating 节点(协调节点) :集群的「网关」,接收客户端的所有请求,然后分发请求到对应的数据节点,最后汇总节点返回的结果,统一返回给客户端。
    • 所有节点默认都是协调节点,无需单独配置;生产中如果并发请求极高,可以单独部署协调节点,分担请求分发压力。
  • ml 节点(机器学习节点):用于 ES 的机器学习功能,非核心,一般业务不用配置。

4.集群核心状态

  • green(绿色,健康):最优状态 → 所有主分片 + 副本分片都正常分配,集群无任何异常,数据零丢失,服务完全可用。
  • yellow(黄色,警告):主分片全部正常分配,部分副本分片未分配(比如只有 1 个节点,副本无法分配),数据无丢失,查询 / 写入正常,但高可用能力下降,如果当前节点宕机,数据会丢失。
  • red(红色,故障):部分主分片未分配,意味着这部分数据丢失,集群可以提供部分服务,但查询 / 写入会报错,生产中出现 red 状态属于紧急故障,必须立即处理!

二.Elasticsearch 集群部署(生产标准,3 节点集群)

1.操作系统初始化(所有节点都要执行)

复制代码
# 1. 关闭防火墙和selinux(永久关闭)
systemctl stop firewalld && systemctl disable firewalld
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0

# 2. 禁用swap分区(ES要求必须关闭swap,否则性能极差+启动报错)
swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab

# 3. 修改内核参数,解决文件句柄、线程数、内存锁定限制
cat >> /etc/security/limits.conf <<EOF
* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096
EOF

# 4. 修改sysctl内核参数
cat >> /etc/sysctl.conf <<EOF
vm.max_map_count=262144
net.ipv4.ip_local_port_range=1024 65535
net.core.somaxconn=65535
EOF
sysctl -p

# 5. 创建ES专用用户(ES禁止root用户启动,必须创建普通用户)
useradd elastic
echo "123456" | passwd --stdin elastic
chown -R elastic:elastic /usr/local/es  # 后续ES安装目录授权

2.下载并解压 ES 安装包(所有节点执行)

  • Elasticsearch:7.17.x(推荐,7.x 的长期支持版 LTS,稳定无坑,8.x 有安全强制开启,新手建议先学 7.x)

  • JDK:ES7.x 内置了 JDK,无需单独安装,直接使用即可,省心!

    下载7.17.9版本(长期支持版)

    cd /usr/local
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.9-linux-x86_64.tar.gz

    解压

    tar -zxvf elasticsearch-7.17.9-linux-x86_64.tar.gz

    重命名,方便操作

    mv elasticsearch-7.17.9 es

    授权给elastic用户

    chown -R elastic:elastic /usr/local/es

3.es的核心配置文件(/usr/local/es/config/elasticsearch.yml)

核心规则:所有节点的 cluster.name 必须一致node.name 必须唯一discovery.seed_hosts 填写所有节点的 IP。

以下是生产标准配置,3 节点均配置为「候选主节点 + 数据节点」(中小型集群最优配置,角色合一,减少复杂度)

复制代码
# ======================== Elasticsearch Configuration =========================
# 1. 集群名称,所有节点必须一致!!!
cluster.name: elastic-cluster-pro
# 2. 节点名称,每个节点必须唯一!!!node1填node-1,node2填node-2,node3填node-3
node.name: node-1
# 3. 配置节点角色:候选主节点+数据节点(7.x+新语法)
node.roles: [master, data]
# 4. 本机IP地址,填写当前节点的真实IP
network.host: 10.10.1.10
# 5. ES的http端口,默认9200,对外提供REST API访问
http.port: 9200
# 6. ES的TCP通信端口,默认9300,节点之间通信、集群选举用
transport.port: 9300
# 7. 集群发现:填写集群中所有节点的IP,用于节点之间互相发现组成集群
discovery.seed_hosts: ["10.10.1.10", "10.10.1.11", "10.10.12"]
# 8. 集群初始化主节点候选列表,填写所有候选主节点的IP
cluster.initial_master_nodes: ["10.10.1.10", "10.10.1.11", "10.10.12"]
# 9. 开启跨域访问(Kibana/Head插件连接ES必须开启)
http.cors.enabled: true
http.cors.allow-origin: "*"
# 10. 禁用自动创建索引(可选,生产建议开启,防止误创建)
action.auto_create_index: false

node2 的配置文件只需要改 node.name: node-2 + network.host:192.168.1.11 即可,其余不变;node3 同理.

4.启动集群(所有节点执行,必须用 elastic 用户)

复制代码
# 切换到elastic用户
su elastic
# 进入ES安装目录
cd /usr/local/es
# 后台启动ES(推荐,日志输出到logs目录),可以配置成systemd启动
./bin/elasticsearch -d
# 验证是否启动成功:查看9200端口是否监听
netstat -tulpn | grep 9200

5.验证集群是否搭建成功(任意节点执行,核心验证命令)

复制代码
# 访问ES的http接口,查看集群状态,返回json即成功
curl http://10.10.1.10:9200/_cluster/health?pretty

三.Elasticsearch 集群核心管理方式

ES 的集群管理、索引管理、数据操作,核心有 3 种方式,生产环境中都会用到,优先级:Kibana > REST API > 配置文件,所有管理操作的核心都是「维护集群健康、保障数据安全、优化性能」

方式一:RESTful API 管理(最核心、最通用,必学)

ES 提供了完整的 HTTP RESTful API,所有操作都可以通过 curl 命令 / Postman 调用,无任何依赖,所有环境都能使用,是集群管理的核心方式,端口都是默认的 9200,以下是生产高频使用的核心管理命令。

复制代码
# 1. 查看集群健康状态(重点,green/yellow/red)
curl http://IP:9200/_cluster/health?pretty

# 2. 查看集群详细信息(节点数、分片数、版本等)
curl http://IP:9200/_cluster/state?pretty

# 3. 查看集群所有节点信息(节点名称、角色、IP、状态)
curl http://IP:9200/_cat/nodes?v

# 4. 创建索引(指定主分片3,副本分片1,生产标准配置)
curl -XPUT http://IP:9200/user_index -H 'Content-Type: application/json' -d '{
  "settings": {
    "number_of_shards": 3,  # 主分片数,创建后不可修改!!!
    "number_of_replicas": 1 # 副本分片数,支持动态修改
  }
}'

# 5. 查看所有索引列表
curl http://IP:9200/_cat/indices?v

# 6. 动态修改索引副本数(比如把副本数改为2,提升可用性)
curl -XPUT http://IP:9200/user_index/_settings -H 'Content-Type: application/json' -d '{
  "number_of_replicas": 2
}'

# 7. 删除索引(谨慎操作!!!删除后数据不可恢复)
curl -XDELETE http://IP:9200/user_index

# 8. 查看未分配的分片详情(red/yellow状态必查,看为什么分片未分配)
curl http://IP:9200/_cluster/allocation/explain?pretty

# 9. 手动分片重分配(比如把分片从node1迁移到node2,平衡节点负载)
curl -XPOST http://IP:9200/_cluster/reroute -H 'Content-Type: application/json' -d '{
  "commands": [
    {
      "move": {
        "index": "user_index",
        "shard": 0,
        "from_node": "node-1",
        "to_node": "node-2"
      }
    }
  ]
}'

# 10. 临时下线节点(准备重启/维护节点时,先把节点设置为不可分配,防止分片迁移)
curl -XPUT http://IP:9200/_cluster/settings -H 'Content-Type: application/json' -d '{
  "transient": {
    "cluster.routing.allocation.exclude._ip": "192.168.1.10"
  }
}'

# 11. 节点维护完成后,恢复上线
curl -XPUT http://IP:9200/_cluster/settings -H 'Content-Type: application/json' -d '{
  "transient": {
    "cluster.routing.allocation.exclude._ip": null
  }
}'

方式二:Kibana 可视化管理

REST API 是命令行操作,对新手不友好,Kibana 是 ES 的官方可视化管理工具,是生产环境的标配,核心优势:

  • 图形化界面,一键查看集群健康状态、节点信息、索引列表、分片分布,无需记命令;

  • 内置 Dev Tools,可以直接编写 / 执行 REST API,自动补全,调试效率极高;

  • 支持索引创建、mapping 配置、数据查询、聚合分析、集群监控等所有操作;

  • 还能配置日志可视化、告警规则等。

部署建议:Kibana 只需要部署 1 台,配置文件中填写 ES 集群任意节点的 IP 即可,无需部署多台。Kibana 连接 ES 集群后,打开「Dev Tools」,直接输入 API 命令即可执行

复制代码
GET _cluster/health
GET _cat/nodes?v
PUT user_index
{
  "settings": {"number_of_shards":3,"number_of_replicas":1}
}

方式三:修改配置文件管理(集群级全局配置,重启生效)

所有在 elasticsearch.yml 中的配置,都是集群的全局核心配置,比如集群名称、节点角色、网络配置、发现节点等,这类配置修改后必须重启 ES 服务才能生效,生产中尽量少改,除非是集群扩容、节点角色调整等重大变更。

四.Elasticsearch 集群运维核心管理规范

集群日常巡检(每天必做,5 分钟搞定,预防故障)

  1. 检查集群状态:必须是 green,如果是 yellow 及时处理副本分片未分配问题,如果是 red 立即处理(主分片丢失);
  2. 检查节点状态:所有节点都是「在线」状态,无节点宕机;
  3. 检查磁盘使用率:ES 的磁盘使用率超过 85%,会触发「只读保护」,无法写入数据,生产建议磁盘使用率控制在 70% 以内;
  4. 检查内存使用率:ES 的 JVM 内存建议设置为物理内存的 50%(比如 8G 内存,JVM 堆内存设置为 4G),内存过高会导致 GC 频繁,性能下降。

集群扩容(横向扩容,核心优势,无缝扩容)

ES 集群是无缝水平扩容的,这是 ES 的核心优势之一,扩容步骤极其简单,生产中数据量 / 并发量增加时,直接加节点即可:

  1. 新增服务器,完成系统初始化(和原有节点一致的内核优化、用户创建);
  2. 安装 ES,修改配置文件:cluster.name 与原有集群一致,node.name 唯一,discovery.seed_hosts 填写原有集群所有节点 IP;
  3. 启动新节点,新节点会自动加入集群,ES 会自动将分片均匀分配到新节点,无需手动干预;
  4. 扩容完成后,检查集群状态是否恢复 green 即可。

集群高可用保障(生产核心要求,杜绝数据丢失 / 服务中断)

  1. 节点层面:候选主节点≥3 台,数据节点≥2 台,避免单点故障;
  2. 分片层面:副本数≥1,核心索引副本数建议设置为 2;
  3. 配置层面:开启 ES 的「磁盘水位线保护」、关闭 swap 分区、合理设置 JVM 内存;
  4. 运维层面:节点重启 / 维护前,先执行「节点下线」命令,防止分片迁移导致集群压力过大;维护完成后再上线。

常见故障处理(生产高频,对症下药)

  1. 集群状态 yellow(黄色):99% 的原因是「副本分片未分配」→ 解决:检查节点是否正常、磁盘是否充足,要么扩容节点,要么动态减少副本数;
  2. 集群状态 red(红色):99% 的原因是「主分片未分配」→ 解决:查看未分配分片详情,要么重启对应节点,要么手动重分配分片,核心原则:找回主分片,数据优先;
  3. ES 无法写入数据:大概率是磁盘使用率超过 85% 触发只读保护 → 解决:清理磁盘空间、扩容节点,然后关闭只读保护;
  4. 查询性能慢:大概率是分片数不合理、副本数太少、查询语句未优化 → 解决:合理设置分片数、增加副本数分担查询压力、优化查询语句(避免通配符开头、减少聚合层级)。
相关推荐
OctShop大型商城源码2 小时前
OctShop源码高效灵活构建小程序多用户商城
大数据·小程序·多用户商城系统·小程序商城系统·小程序多用户商城
罗小爬EX2 小时前
升级IDEA 2025.3+后 Spring Boot 配置文件自动提示插件推荐
java·spring boot·intellij-idea
程序媛Dev3 小时前
训练模型用GCP,推理服务放阿里云?聊聊AIGC时代的多云自由
阿里云·云计算·aigc
曹轲恒10 小时前
Java中断
java·开发语言
xxxmine10 小时前
Java并发wait(timeout)
java
冰冰菜的扣jio10 小时前
Redis缓存问题——一致性问题、事务、持久化
java·spring·mybatis
施棠海10 小时前
监听与回调的三个demo
java·开发语言
微光闪现11 小时前
AI识别宠物焦虑、紧张和晕车行为,是否已经具备实际可行性?
大数据·人工智能·宠物
毕设源码-钟学长11 小时前
【开题答辩全过程】以 家政服务平台为例,包含答辩的问题和答案
java