对所有数据构建全局索引,为了避免瓶颈,对索引本身进行分区,比如:
- 将 a~r 开始的关键字放在分区 0
- 将 s~z 开始的关键字放在分区 1
优点
- 可以支持高效的区间查询
- 读取更为高效
缺点
- 写入速度慢,会引入明显的写入放大
- 写入逻辑复杂
- 难以保证索引时刻最新,需要跨多个相关分区的分布式事务支持
实践
对全局二级索引的更新往往都是异步的。
对所有数据构建全局索引,为了避免瓶颈,对索引本身进行分区,比如:
对全局二级索引的更新往往都是异步的。
每一条数据都属于特定的分区,每个分区都是一个小型数据库。 目的 提高扩展性,分散大的数据集和查询负载。 目标 将数据和查询负载均匀的分步在所有节点上。如果分布不均匀会出现负载倾斜和系统热点。 数据分区与数据复制 结合数据复制每个分区在多个节点都有副本,进行冗余提高可用性。 键-值数据的分区 避免系统热点最简单的方法是将记录随机分配给所有节点上,缺点是:没办法知道数据保存在哪个节点上,所以读取时需要查询所有节点。 基于关键字区间分区 基于关键字哈希值分区 负载倾斜与系统热点 分区与二级索引 二级索引不能唯一标识一条记录,比如查询颜色为红色的汽车。二级索引带来的主要挑战是它们不能规整的映射到分区中。 有两种方法来支持对二级索引进行分区: 基于文档分区的二级索引 基于词条的二级索引分区 分区再平衡 动态再平衡策略 自动与手动再平衡操作 请求路由 策略 客户端可以连接任意节点,并由节点做转发不在当前节点的分区请求。 由路由层来充当分区感知的负载均衡器。 客户端直接感知分区和节点分配关系,客户端直连目标节点。 做出路由决策的组件 Zookeeper gossip 协议