Elasticsearch集群架构&&如何保证分片数据一致性

 面试遇到了 ES 相关的拷打,发现对 ES 还停留在应用层,对于底层的实现没有很好的理解和熟悉,在此整理,温故知新。
 本文介绍ES整体架构,节点,分片,副本等概念以及查询流程,数据更新流程。

ES架构

ES架构图及请求节点访问流程.png

节点及节点类型 - 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
 副分片不会被分配到与主分片相同的节点上。这是为了确保如果一个节点发生故障,主分片和其副分片不会同时丢失,分配情况如下图。

主分片及副分片在节点分部情况.png

主分片(Primary Shard)

存储和索引:每个文档都存储在一个主分片上。主分片负责处理文档的索引(即插入、更新和删除操作)。
查询处理:主分片也负责处理查询请求,返回与查询条件匹配的文档。
数量固定:在创建索引时,需要指定主分片的数量,这个数量在索引创建后不能更改。
负载均衡:主分片在集群中的节点上分布,以实现负载均衡。

副分片(Replica Shard)

数据复制:副分片是主分片的复制品,它们包含了与主分片相同的数据。副分片的主要目的是提供数据的冗余,以防主分片所在的节点发生故障。
查询负载分担:副分片可以处理查询请求,从而分担主分片的负载,提高查询性能。
数量可变:副分片的数量可以在索引创建后动态调整,以适应集群的负载和可用性需求。
故障恢复:如果一个主分片所在的节点发生故障,Elasticsearch会从副分片中选举一个新的主分片,以保证数据的可用性。

功能区别

数据写入:只有主分片负责处理数据的写入操作,副分片不参与数据写入,它们只是主分片的复制品。
数据读取:主分片和副分片都可以处理数据的读取操作,包括查询和获取文档。副分片可以分担读取负载,提高查询性能。
故障恢复:副分片的主要作用之一是提供故障恢复能力。如果主分片丢失,Elasticsearch会从副分片中选择一个新的主分片,以保证数据的可用性和一致性。
负载均衡:副分片有助于负载均衡,因为它们可以处理部分查询请求,从而减轻主分片的压力。

如何保证主从数据一致性

  • 写操作传播
    当对主分片执行写操作(如索引、更新或删除文档)时,这个操作会被复制到所有的副分片。
    只有当所有的副分片都确认接收到并应用了这个操作后,写操作才会被认为成功。
  • 版本控制
    每个文档都有一个版本号,当文档被更新时,版本号会增加。
    版本号用于确保操作的顺序性,并在冲突发生时解决谁的更新优先。
  • 事务日志
    主分片会维护一个操作日志(称为translog),记录所有对文档进行的变更操作。
    当副分片需要同步数据时,它会从主分片的translog中获取自上次同步以来的所有变更,并应用这些变更。
  • 定期刷新
    Elasticsearch会定期将内存中的变更刷新到磁盘上的索引文件中。
    这个定期刷新的过程称为refresh,它确保了即使在节点故障的情况下,数据也不会丢失。
  • 副本同步
    主分片和副分片之间的数据同步是实时进行的。
    如果副分片落后于主分片,它会自动从主分片获取缺失的操作并应用它们。

小结

 主分片和副分片的设计使得Elasticsearch能够实现高可用性、容错能力和负载均衡。主分片负责数据的存储和索引,而副分片提供数据的冗余和读取负载分担。在设计Elasticsearch集群时,合理配置主分片和副分片的数量对于优化性能和可靠性至关重要。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容