面试遇到了 ES 相关的拷打,发现对 ES 还停留在应用层,对于底层的实现没有很好的理解和熟悉,在此整理,温故知新。
本文介绍ES整体架构,节点,分片,副本等概念以及查询流程,数据更新流程。
ES架构
节点及节点类型 - Node
在Elasticsearch中,一个节点Node
可以同时扮演多个角色。例如,一个节点可以同时是数据节点、主可选举节点和预处理节点。但是,为了优化性能和资源使用,通常建议将这些角色分开,特别是在大型集群中。出于多可用的考虑,可以增加Ingest Node
节点,通过读负载均衡将读写请求分发到不同节点,从而提高集群性能。
- Master Node
主节点负责管理集群级别的操作,比如创建或删除索引、跟踪哪些节点是集群的一部分以及决定哪些分片分配给哪些节点。
它们还处理集群范围内的变更,如创建或删除索引、跟踪集群中的节点以及管理集群的状态。
主节点不承担数据相关的任务,如存储或搜索文档。 - Matser eligible Node
主可选举节点是指有资格被选举为master节点的节点。在默认配置下,集群中的每个节点都可以成为master节点。
这些节点参与master节点的选举过程,当当前的master节点不可用时,它们可以被选举为新的master节点。
它们也可以执行数据节点的任务,如存储数据和执行搜索。 - Data Node
数据节点负责存储数据和执行数据相关的操作,如CRUD(创建、读取、更新、删除)操作和搜索。
它们还负责执行集群的分片分配和数据的复制。
数据节点是Elasticsearch集群中工作负载最重的节点,因为它们负责处理数据和搜索请求。 - Coordinating Node
协调节点通常是一个接受客户端请求并向其他节点转发请求的节点。
它们不存储数据,但负责聚合来自不同节点的搜索结果并返回给客户端。
协调节点可以是任何节点,因为任何节点都可以转发请求,但通常,客户端直接连接的节点就充当协调节点的角色。 - Ingest Node
预处理节点负责处理传入数据的预处理工作,如解析、转换和丰富数据。
它们使用预处理管道(Ingest pipelines)来处理文档,这些管道可以在索引之前对文档进行修改。
Ingest节点可以与数据节点和协调节点的功能重叠,因为预处理可以在索引数据之前在任何节点上执行。
分片 - Shard
在创建索引时,可以指定分片的个数和副本个数,多分片分部在集群各个节点,分片分为主分片Primary Shard
和副本分片Replica Shard
。
副分片不会被分配到与主分片相同的节点上。这是为了确保如果一个节点发生故障,主分片和其副分片不会同时丢失,分配情况如下图。
主分片(Primary Shard)
存储和索引:每个文档都存储在一个主分片上。主分片负责处理文档的索引(即插入、更新和删除操作)。
查询处理:主分片也负责处理查询请求,返回与查询条件匹配的文档。
数量固定:在创建索引时,需要指定主分片的数量,这个数量在索引创建后不能更改。
负载均衡:主分片在集群中的节点上分布,以实现负载均衡。
副分片(Replica Shard)
数据复制:副分片是主分片的复制品,它们包含了与主分片相同的数据。副分片的主要目的是提供数据的冗余,以防主分片所在的节点发生故障。
查询负载分担:副分片可以处理查询请求,从而分担主分片的负载,提高查询性能。
数量可变:副分片的数量可以在索引创建后动态调整,以适应集群的负载和可用性需求。
故障恢复:如果一个主分片所在的节点发生故障,Elasticsearch会从副分片中选举一个新的主分片,以保证数据的可用性。
功能区别
数据写入:只有主分片负责处理数据的写入操作,副分片不参与数据写入,它们只是主分片的复制品。
数据读取:主分片和副分片都可以处理数据的读取操作,包括查询和获取文档。副分片可以分担读取负载,提高查询性能。
故障恢复:副分片的主要作用之一是提供故障恢复能力。如果主分片丢失,Elasticsearch会从副分片中选择一个新的主分片,以保证数据的可用性和一致性。
负载均衡:副分片有助于负载均衡,因为它们可以处理部分查询请求,从而减轻主分片的压力。
如何保证主从数据一致性
- 写操作传播
当对主分片执行写操作(如索引、更新或删除文档)时,这个操作会被复制到所有的副分片。
只有当所有的副分片都确认接收到并应用了这个操作后,写操作才会被认为成功。 - 版本控制
每个文档都有一个版本号,当文档被更新时,版本号会增加。
版本号用于确保操作的顺序性,并在冲突发生时解决谁的更新优先。 - 事务日志
主分片会维护一个操作日志(称为translog),记录所有对文档进行的变更操作。
当副分片需要同步数据时,它会从主分片的translog中获取自上次同步以来的所有变更,并应用这些变更。 - 定期刷新
Elasticsearch会定期将内存中的变更刷新到磁盘上的索引文件中。
这个定期刷新的过程称为refresh,它确保了即使在节点故障的情况下,数据也不会丢失。 - 副本同步
主分片和副分片之间的数据同步是实时进行的。
如果副分片落后于主分片,它会自动从主分片获取缺失的操作并应用它们。
小结
主分片和副分片的设计使得Elasticsearch能够实现高可用性、容错能力和负载均衡。主分片负责数据的存储和索引,而副分片提供数据的冗余和读取负载分担。在设计Elasticsearch集群时,合理配置主分片和副分片的数量对于优化性能和可靠性至关重要。