单机版的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集群的前提,是彻底理解分片和副本这两个核心概念。