分布式的 ES
分布式的 ES节点:一个物理或者虚拟的 ElasticSearch 进程,拥有 CPU、内存、磁盘等资源。只有 Data 节点可以持有分片;
分片:索引数据会被分成多个分片(都是主分片),副本分片是每个主分片的 copy,每个分片都是一个独立的 Lucene 索引。
ES 中一个索引(Index)逻辑上就是一个完整数据库,物理上会被分成多个分片(Shard),每个分片都是一个 Lucene 实例,Index 在创建时,分片数就确定了。
为什么要分片?
水平扩展:单个节点放不下的数据,可以分布在多个节点上;
并行处理请求:查询请求可以在多个分片中并行查询,最后合并,提高 I/O。
分片的分配创建索引时,索引一般有多个主分片,存储互不重复的数据子集。Master 节点需要计算这三个分片存到哪些 Data 节点上。
路由
前一篇描述了 Lucene 创建索引,因为在 es 中,每个分片都是一个 Lucene 节点,那么索引请求应该写入到哪个分片中呢?实际上会通过 doc_id 哈希取模得出分片 id:
1shard_num = hash(doc_id) % num_primary ...
