一.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 分钟搞定,预防故障)
- 检查集群状态:必须是
green,如果是yellow及时处理副本分片未分配问题,如果是red立即处理(主分片丢失); - 检查节点状态:所有节点都是「在线」状态,无节点宕机;
- 检查磁盘使用率:ES 的磁盘使用率超过 85%,会触发「只读保护」,无法写入数据,生产建议磁盘使用率控制在 70% 以内;
- 检查内存使用率:ES 的 JVM 内存建议设置为物理内存的 50%(比如 8G 内存,JVM 堆内存设置为 4G),内存过高会导致 GC 频繁,性能下降。
集群扩容(横向扩容,核心优势,无缝扩容)
ES 集群是无缝水平扩容的,这是 ES 的核心优势之一,扩容步骤极其简单,生产中数据量 / 并发量增加时,直接加节点即可:
- 新增服务器,完成系统初始化(和原有节点一致的内核优化、用户创建);
- 安装 ES,修改配置文件:
cluster.name与原有集群一致,node.name唯一,discovery.seed_hosts填写原有集群所有节点 IP; - 启动新节点,新节点会自动加入集群,ES 会自动将分片均匀分配到新节点,无需手动干预;
- 扩容完成后,检查集群状态是否恢复 green 即可。
集群高可用保障(生产核心要求,杜绝数据丢失 / 服务中断)
- 节点层面:候选主节点≥3 台,数据节点≥2 台,避免单点故障;
- 分片层面:副本数≥1,核心索引副本数建议设置为 2;
- 配置层面:开启 ES 的「磁盘水位线保护」、关闭 swap 分区、合理设置 JVM 内存;
- 运维层面:节点重启 / 维护前,先执行「节点下线」命令,防止分片迁移导致集群压力过大;维护完成后再上线。
常见故障处理(生产高频,对症下药)
- 集群状态 yellow(黄色):99% 的原因是「副本分片未分配」→ 解决:检查节点是否正常、磁盘是否充足,要么扩容节点,要么动态减少副本数;
- 集群状态 red(红色):99% 的原因是「主分片未分配」→ 解决:查看未分配分片详情,要么重启对应节点,要么手动重分配分片,核心原则:找回主分片,数据优先;
- ES 无法写入数据:大概率是磁盘使用率超过 85% 触发只读保护 → 解决:清理磁盘空间、扩容节点,然后关闭只读保护;
- 查询性能慢:大概率是分片数不合理、副本数太少、查询语句未优化 → 解决:合理设置分片数、增加副本数分担查询压力、优化查询语句(避免通配符开头、减少聚合层级)。