Elasticsearch集群:高可用与水平扩展的基石

单机版的Elasticsearch能处理的数据量和查询能力是有限的。当数据量达到几亿条,或者每秒查询请求超过单机承受能力时,就需要多台服务器一起工作了。

这就是集群的价值。ES从设计之初就是一个分布式系统,它天生知道怎么在多台机器上分散数据、怎么并行处理查询、怎么在一台机器宕机时保证服务不中断。

这篇文章讲清楚ES集群的核心工作机制:节点类型、分片分布、容错机制,以及如何搭建一个生产可用的集群。


一、集群的节点类型

一个ES集群由多个节点组成。节点是运行着ES进程的服务器,但不同节点扮演的角色可能不同。

主节点不负责存储数据,也不处理搜索请求,它的唯一职责是管理集群状态:创建或删除索引、跟踪有哪些节点在集群里、决定分片分配到哪个节点。主节点由集群中多个节点选举产生,当前只有一个,其他候选节点闲着备用。

数据节点是真正干活的人。它负责存储数据分片、执行数据的增删改查、处理搜索和聚合请求。数据节点是集群中最繁忙的,对CPU、内存、磁盘的要求也最高。在线上环境中,数据节点通常需要配备大内存和SSD硬盘。

协调节点是个轻量角色。它接收客户端请求,把请求转发给相关的数据节点,等所有数据节点返回结果后,合并结果再返回给客户端。默认情况下所有节点都扮演协调节点。如果集群压力特别大,可以设置专门的不存数据、不参与选举的协调节点来分担压力。

在小型集群中,一个节点可以同时承担多个角色。但在生产环境中,通常建议将角色分开------主节点只做管理,数据节点只做存储和计算,避免角色混用导致的不稳定。


二、分片与副本

分片是ES实现分布式的核心机制。

主分片是数据的物理切分。当你创建一个索引时,可以指定主分片的数量,比如设置3个主分片。ES会自动把数据分散到这些分片上,每条数据按照一定规则落在其中一个分片。主分片数量一旦确定就不能更改,因为改了之后数据重新分布的成本极高。

副本分片是主分片的完整副本,每个主分片可以有一个或多个副本。副本的作用有两个:一是高可用,主分片所在的节点宕机了,副本可以快速顶上来;二是提升读性能,读请求可以负载均衡到主分片和副本上并行执行。

副本数量可以在线动态调整。副本不能和对应的主分片在同一个节点上,否则那台机器坏了主副本一起丢。

举个例子:一个索引设置3个主分片,每个主分片配1个副本,总共需要6个分片。集群如果有3个节点,ES会把分片均匀分布,保证每个节点上都有主分片和副本分片,任何一个节点宕机都不影响数据的完整可用。


三、分片的路由机制

当客户端发来一条数据要求写入时,ES需要决定这条数据存放在哪个主分片上。这个决策由路由算法完成,核心是计算一个哈希值:

复制代码
分片编号 = hash(路由键) % 主分片数量

默认的路由键是文档的_id字段。你也可以在写入时指定自定义的路由键,比如把同一个用户的所有订单都用userId作为路由键,这些订单就会落在同一个分片上,查询时可以只扫一个分片。

路由算法的分布式特性也带来了一个问题:主分片数量一旦确定就不能修改。因为修改后取模的结果就变了,原有的数据分布在新的计算规则下全部错位,需要重新整理所有数据。这也是为什么创建索引时必须提前估算好数据量。


四、集群的容错机制

集群之所以叫集群,就是因为能容忍部分节点故障。

主节点选举是自动完成的。当前主节点因为网络故障或宕机失联后,其他有资格成为主节点的候选节点会发起选举,票数过半就能成为新主节点。整个选举过程通常在几秒到十几秒内完成。

主分片故障转移也由新的主节点自动处理。主节点发现某个节点的状态变成不可用后,会检查这个节点上有没有主分片。如果有主分片,就从该主分片的副本中挑选一个,提升为新的主分片。故障转移完成后,集群状态恢复为黄色或绿色。

数据完整性保障基于多数派。写入数据时,ES默认要求主分片写入成功,再加至少一个副本写入成功,才返回成功。这样任何单个节点故障都不会丢失已经确认写入的数据。这种设计实际上是Paxos或Raft共识算法的简化实现。


五、集群的三种健康状态

ES用三种颜色表示集群的健康状况,非常直观。

绿色意味着所有主分片和副本分片都正常分配。这是最理想的状态,任何单个节点故障都不会丢数据。

黄色意味着所有主分片都正常,但至少有一个副本分片未能分配。这种情况在小规模集群中经常出现,比如只有一台机器却设置了副本。此时集群功能完整,但如果存储主分片的节点挂了,数据可能会丢失。

红色意味着至少有一个主分片未能分配。这个索引的部分数据已经不可用,写入这个分片会失败,查询这个分片的结果也会缺失。红色状态需要立即排查。


六、生产环境集群规划

节点数量没有标准答案,3个节点是最小的高可用配置。因为主节点选举需要过半数投票,两个节点时任意一个故障,剩下的一个票数不过半无法选举,集群就不能正常工作了。

分片大小建议控制在10GB到50GB之间。分片太小会导致数量过多,每个分片都有内存开销,拖慢集群整体性能。分片太大则单个分片查询慢,故障恢复时数据传输时间长。一般建议每个分片存储不超过50GB。

主节点数量官方建议是奇数个,比如3个或5个。奇数节点在选举时更容易形成多数派,不会出现平局的情况。主节点的硬件要求不高,CPU和内存中等即可,但网络必须稳定------主节点一旦失联,整个集群会重新选举,期间服务能力下降。

部署方式推荐将候选主节点和数据节点分开部署。小规模集群可以混合部署,但大型生产环境通常准备3台专门的候选主节点,其他全部是纯数据节点。这样数据节点的负载再高也不会影响集群的管理能力。

七、总结

ES集群通过分片机制实现数据水平扩展,通过副本机制实现高可用。

  • 主节点负责管理集群,数据节点负责存储和计算

  • 分片数量创建时确定,后期无法修改

  • 副本数量动态可调,读性能随副本数线性提升

  • 3个节点是最小的高可用配置

  • 分片大小建议控制在30GB左右

集群的搭建只是第一步,真正的考验在于数据量增长后的持续运营。分片大小和数量的选择、节点角色的分离、资源的合理分配,都是在实践中慢慢摸索出来的。但有一点可以确定:用好ES集群的前提,是彻底理解分片和副本这两个核心概念。

相关推荐
我是发哥哈3 小时前
跨AI模型生成视频的五大维度对比:选型避坑指南
大数据·人工智能·学习·机器学习·chatgpt·音视频
Elastic 中国社区官方博客3 小时前
Elastic 9.4:Workflows 正式发布、Agent Builder 更新,以及 Prometheus / PromQL 支持
运维·数据库·人工智能·elasticsearch·搜索引擎·信息可视化·prometheus
逸Y 仙X3 小时前
Elasticsearch时间类型实战
java·大数据·elasticsearch·搜索引擎·全文检索
Dxy12393102165 小时前
Python如何处理树状分类数据
大数据·python·分类
凡人AI录6 小时前
小红书商业变现 100 个关键词:从流量逻辑到长期复利
大数据
zhongerzixunshi7 小时前
筑牢国家安全防线,赋能企业合规发展
大数据·人工智能·安全
小飞象—木兮7 小时前
2026数据资产入表解决方案(52页 PPT)
大数据·人工智能
Dotrust东信创智7 小时前
革新测试管理3.0:Storm UTP统一测试管理平台全链路追溯与AI赋能升级
大数据·人工智能·storm
烟台业荣数据科技有限公司7 小时前
智能建造知识拓展 | AR技术:虚实融合,赋能施工现场
大数据·人工智能·机器人