分区,又称为分片,是解决大数据存储的常见解决方案,大数据存储量超过了单节点的存储上限,因此需要进行分区操作将数据分散存储在不同节点上,通常每个单个分区可以理解成一个小型的数据库,尽管数据库能同时支持多个分区操作;分区引入多分区概念,可以同时对外服务提高性能。
常常和分区一并提及的概念是复制,分区通常与复制结合使⽤,使得每个分区的副本存储在多个节点上。 这意味着,即使每条记录属于⼀个分区,它仍然可以存储在多个不同的节点上以获得容错能⼒。分区在许多技术或框架中都有体现,例如MQ中topic下的分区消息实现,如kafka中的partion、rocketmq中的queue等;例如SQL/NoSQL中分区数据储存实现,如ElascticSearch中的Shards分片、MySQL中的分表等。
关于分区,本文主要讨论下键值分区的几种方式、分区再平衡策略和请求路由处理机制等,最后以ES(ElascticSearch)的查询请求处理为例,分析分区下查询的请求处理流程。话不多说,Let's Go~
键值分区的几种方式
如果有大量数据需要分散存储,应该如何进行分区呢?分区的目前就是将数据均衡的分散在各节点,这样同时也能分散对数据的处理请求,如果分区不均衡,那么会造成某些分区有大量的数据或查询请求,这就是常说的倾斜。数据倾斜会造成高负载节点形成热点,避免热点可以使用随机路由方式将数据散列到各分区中。对数据进行分区操作,不能仅仅是随机数据存储,因为存储之后肯定还是要进行查询的,所以要按照固定键值来进行散列分区操作,方便后续查询请求的路由。常见的键值分区方式有按照范围分区、按照键的散列分区:
按照范围分区
按照范围分区就是每个分区存储指定一段连续的数据,比如按照时间戳来存储数据,最简单常见的日志按照时间分割为不同的文件;按照编号id来存储数据,如图书馆书籍陈列,编号连续数据存放在同一个书架上。按照范围分区有时候会造成分区数据不均衡,比如按照时间戳,可能某段时间内数据比较少而某些时间段数据较多而造成分区不均衡。
键值散列分区
由于按照范围分区容易造成数据负载不均衡问题,所以一般应用场景下(非顺序类