概要:1分区方式:关键字、哈希值、解决负载倾斜
2分区与二级索引:基于文档(读慢)、基于词条(读快,写慢)
3分区再平衡:固定数量分区(调与节点关系)、动态分区(阈值)、按节点比例分区
4请求路由:任意节点(有则处理,没有转发)、发路由层(转发)、感知分区和节点关系
一、分区方式
目标均匀分布。最繁忙几个为热点。知道数据在哪,避免向所有查
1、基于关键字分区
为每个分区分配一段连续关键字区间。根据关键字所在区间上下限,直接请求节点
缺点:数据倾斜,如单词表,x,i,o等开头单词少
解决:调整分区边界、选合适关键字
2、基于关键字的哈希值分区
优点:更均匀:并不能均匀分配负载,需一致性哈希。
缺点:失去良好区间查询特性,相邻关键字可能在不同分区
3、解决负载倾斜
同一个关键字的大量读写,所有请求都到同一个分区。如明星分手
应用层解决:关键字后面添加两位数序号,分配到100个不同的分区上。但合并开销大
二、分区与二级索引
二级索引:不能唯一标识一条记录,不能规整映射到分区
1、基于文档
分区完全独立,各自维护自己二级索引。查时向所有分区发读请求,合并结果,代价高
2、基于词条
构建全局索引,也分区。
优点:读高效,索引中包含的词条为关键字,向包含该词条的分区查询
缺点:写慢,因为更新数涉及多个二级索引,写放大(可能在不同节点上)。都是异步更新,刚不即查到
三、分区再平衡
增加cpu、磁盘、内存后,或者节点故障后,负载再平衡过程中保持可用性。避免不必要迁移,减少网络和磁盘I/O。动态再平衡策略:
1、固定数量分区
分区总数、分区和关键字映射关系不变,节点数变,调整分区和节点映射关系
2、动态分区
自动调整分区边界。到一个阈值时,分裂,转移到其他节点平衡负载,类似b树
优点:自动适配,少量数据开销小,大量数据可配置最大值
3、按节点比例分区
前两种策略,分区数和节点数无关。
此策略,节点分区数固定。节点数不变时,分区数据量和数据集大小正比。新节点加入,随机选固定数分区进行分裂。ps:随机选前提是基于哈希分区(可一致性哈希),如Cassandra和Ketama
五、请求路由
客户端如何知道连哪个节点:
1、允许连接任意节点,如节点有请求的分区,则处理,否则转发给别的节点。
2、发送给路由层,转发给对应节点
3、感知分区和节点关系,连接到目标节点
Zk:每个节点向zk中注册自己,zk维护分区到节点关系。客户端向zk订阅,分区和节点变时,zk主动通知路由层