分区
分区与复制
分区通常与复制结合使⽤,使得每个分区的副本存储在多个节点上。 这意味着,即使每条记录属于⼀个分区,它仍然可以存储在多个不同的节点上以获得容错能⼒。
键值数据的分区
我们可以做得更好。现在假设您有⼀个简单的键值数据模型,其中您总是通过其主键访问记录。例如,在⼀本⽼式的纸质百科全书中,你可以通过标题来查找⼀个条⽬;由于所有条⽬按字⺟顺序排序,因此您可以快速找到您要查找的条⽬。
根据键的范围分区
需要使⽤除了时间戳以外的其他东⻄作为主键的第⼀个部分。 例如,可以在每个时间戳前添加传感器名称,这样会⾸先按传感器名称,然后按时间进⾏分区。 假设有多个传感器同时运⾏,写⼊负载将最终均匀分布在不同分区上。 现在,当想要在⼀个时间范围内获取多个传感器的值时,您需要为每个传感器名称执⾏⼀个单独的范围查询。
根据键的散列分区
⼀旦你有⼀个合适的键散列函数,你可以为每个分区分配⼀个散列范围(⽽不是键的范围),每个通过哈希散列落在分区范围内的键将被存储在该分区中。
负载倾斜与消除热点
如今,⼤多数数据系统⽆法⾃动补偿这种⾼度偏斜的负载,因此应⽤程序有责任减少偏斜。例如,如果⼀个主键被认为是⾮常⽕爆的,⼀个简单的⽅法是在主键的开始或结尾添加⼀个随机数。只要⼀个两位数的⼗进制随机数就可以将主键分散为100钟不同的主键,从⽽存储在不同的分区中。
分⽚与次级索引
次级索引是关系型数据库的基础,并且在⽂档数据库中也很普遍。许多键值存储(如HBase和Volde mort)为了减少实现的复杂度⽽放弃了次级索引,但是⼀些(如Riak)已经开始添加它们,因为它们对于数据模型实在是太有⽤了。并且次级索引也是Solr和Elasticsearch等搜索服务器的基⽯。
按⽂档的⼆级索引
在这种索引⽅法中,每个分区是完全独⽴的:每个分区维护⾃⼰的⼆级索引,仅覆盖该分区中的⽂档。它不关⼼存储在其他分区的数据。⽆论何时您需要写⼊数据库(添加,删除或更新⽂档),只需处理包含您正在编写的⽂档ID的分区即可。出于这个原因,⽂档分区索引也被称为本地索引(local index)(⽽不是将在下⼀节中描述的全局索引(global index))。
根据关键词(Term)的⼆级索引
我们将这种索引称为关键词分区(term-partitioned),因为我们寻找的关键词决定了索引的分区⽅式。例如,⼀个关键词可能是: 颜⾊:红⾊ 。关键词(Term) 来源于来⾃全⽂搜索索引(⼀种特殊的次级索引),指⽂档中出现的所有单词。