分片
什么是分片
分片是把索引数据切分成多个小的索引块,这些小的索引块能够分发到同一个集群中的不同节点。在检索时,检索结果是该索引每个分片上检索结果的合并。类似于数据库的分库分表。
为什么分片
1、这样可以提高读写性能,实现负载均衡。
2、副本容易扩展,备份恢复快。
怎么分片
分片(或者叫分区)是分布式系统的一个经典问题。常用的分片方式:
分片方式 | 说明 | 优点 | 缺点 |
---|---|---|---|
简单hash | 除余取模 | 简单 | 扩展困难、容易数据倾斜 |
数据范围分布 | 按照数据的所处范围进行分类,每个分区可以动态分裂 | 易扩展 | 元数据服务维护复杂,容易成为瓶颈 |
数据量分布 | 按照数据块大小分布 | 与数据内容无关,无数据倾斜,易扩容 | 元数据维护维护复杂 |
一致性hash | 数据和节点hash后沿环形匹配、虚拟节点 | 易扩展 | - |
es采用的是简单hash,默认hash的是_id字段,另外也可以指定分片字段。hash完同一结果的数据分配到一个分片shard中。
分片分配
什么是分片分配
已经切分为多份的索引块,索引块分发到同一个集群中的不同节点。这个把shard分发到node的过程就是分片的分配。分配的原则是主要还是基于提高读写性能,实现负载均衡,备份恢复快。
怎么分片分配
分片时机
This can happen during initial recovery, replica allocation, rebalancing, or when nodes are added or removed.
- index的增删
- node的增删
- reroute操作
- replica的设置更改
- 初始化恢复过程
AllocationService.reroute调用位置,也就是调用分片分配的时机: