数据分片策略

x33g5p2x  于2022-02-19 转载在 其他  
字(0.8k)|赞(0)|评价(0)|浏览(655)

为什么要数据分片?

所有的应用都可以归结为两种操作的集合:

随着数据量的增加,单台机器的能力是有限的。一方面,机器的容量会无法容纳数据,另一方面数据的读取速度会变慢。

所以我们可以将数据分片,分到多台机器上,这样的话存储压力和读取速度就变快了。

上述是数据分片的好处,但也带来的挑战:

  1. 分布式事务
    数据被分到不同的数据库,无法保证事务
  2. 数据查询难度变高
    没分片之前,只需要在一台机器上就可以查出全部的数据,分片之后,需要从所有机器上查出所有的数据,然后进行整合。并且还需要维护数据和机器之间的映射关系。
  3. 扩展问题
    当扩展机器的时候,数据映射的结果发生变化,数据需要在机器之间搬运。

数据分片的做法

哈希

对主键或者其他字段进行hash,然后hash%n,n是机器的个数,取模的结果作为数据存储的机器

好处: 数据分布均匀
坏处: 扩展机器的时候,搬运的数据太多。

一致性哈希

为了改善哈希导致的数据搬运问题,引入了一致性hash。

一致性hash的做法:
1、将机器的ip或者其他信息来作为hash的字段,将hash%2^32-1,作为机器的位置
2、对数据的主键或者其他字段进行hash,也hash%2^32-1。数据存放的位置是哈希结果顺时针的第一个节点。

好处: 数据搬运变少,当增加或者减少机器的时候,只与其顺时针的下一台机器有关。

坏处: 如下图所示,数据不均匀,大部分数据都落到了机器A上。如果A机器要去除,所有的数据都会转移到B上,大量的数据会导致B的宕机。

带有虚拟节点的一致性哈希

对于一台机器,加入多个虚拟节点,虚拟节点指向同一台物理机器。

好处:
1、数据的分布就均匀了
2、可以根据虚拟节点的个数来调整机器的权重。如果一个机器的配置比较好,就可以为其分配更多的虚拟节点,让其存储更多的数据

当删除一台机器的时候,该台机器的数据会被转移到多台机器上。

range分片

按照时间、id等字段的范围来分片。

好处:
查询比较方便,因为可以清楚的知道机器中存储的数据的范围

坏处:
1、数据分布有可能不均匀

参考

一致性hash

相关文章