分布式的 ES

节点:一个物理或者虚拟的 ElasticSearch 进程,拥有 CPU、内存、磁盘等资源。只有 Data 节点可以持有分片;

分片:索引数据会被分成多个分片(都是主分片),副本分片是每个主分片的 copy,每个分片都是一个独立的 Lucene 索引。

ES 中一个索引(Index)逻辑上就是一个完整数据库,物理上会被分成多个分片(Shard),每个分片都是一个 Lucene 实例,Index 在创建时,分片数就确定了。

为什么要分片?

  • 水平扩展:单个节点放不下的数据,可以分布在多个节点上;
  • 并行处理请求:查询请求可以在多个分片中并行查询,最后合并,提高 I/O。

分片的分配

创建索引时,索引一般有多个主分片,存储互不重复的数据子集。Master 节点需要计算这三个分片存到哪些 Data 节点上。

路由

前一篇描述了 Lucene 创建索引,因为在 es 中,每个分片都是一个 Lucene 节点,那么索引请求应该写入到哪个分片中呢?实际上会通过 doc_id 哈希取模得出分片 id:

1
shard_num = hash(doc_id) % num_primary_shards

主分片与副本

每个分片都有主分片(Primary Shard)和副本分片(Replica Shard)区分。

主分片是一个完整的 Lucene 实例,副本分片是主分片的一个完整精确的 copy。

写入

写入请求必须由主分片处理。主分片处理完成后,将操作转发到副本分片,等待副本分片全部确认(或部分确认,由一致性参数决定),返回写入成功。

写入索引是由路由计算得出的分片处理的,写入都是主分片来操作的。

读取

读取请求可以由主分片或者副本分片处理,副本分片可以分担查询压力。

容错

当一个节点宕机后,如果有主分片在上面,会先提升对应副本分片作为主分片,然后重建一个副本分片。

集群状态

  • Green:所有主分片和副本分片都已 ready;
  • Yellow:主分片都已 ready,但副本分片还未就绪(可能是单节点,也可能是刚刚宕机,副本还在恢复)
  • Red:有主分片丢失,当前数据不完整。

节点角色

  • Master 节点:负责集群管理
  • Coordinating 节点:负责分发数据,不存数据
  • Data 节点:存储分片数据

Refenrece

https://www.cnblogs.com/xiaoyh/p/15999190.html