分布式的 ES
分布式的 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
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment
