数据库 sharding
分布式数据库的核心算法就是sharding,把一个数据库通过sharding算法映射到不同的机器上处理。
sharding 分为两种方式:
纵向切分:就是把一个表按不同列进行切分。比如我们有一个 User 表,那么可以按照不同的列拆分成 User Profile,User BaseInfo 等表,存在不同的机器上。说的通俗点就是拆表。
横向切分:就是按照行进行切分,比如我们有四台机器,那么每一行数据都通过一个 sharding 算法 映射到其中的一台机器上。
一般来讲,如果表中有很多列,压力分布在多个列中,可以通过 纵向切分的方式进行 sharding。但是如果表中本来就只有一列数据承载了巨大压力,或者因为某些原因无法拆表,那么就无法通过纵向切分,只能进行横向切分。
纵向切分比较简单,但是可能会影响业务代码(data entity的实现要变),因为实际存储的表变了,横向切分会相对复杂一些,不过对业务代码是透明的。两种方式可以结合使用。
下面重点讲一下横向切分,也就是一致性哈希算法。
一致性哈希算法
我们假设现在有2台机器,我们需要把User表横向切分映射到这2台机器上。
一个简单的想法就是 userid % 2
,余数可能是 0, 1
分别是2台机器的编号。
但是这样做存在一个巨大的问题,就是如果加一台机器怎么办?我们的算法肯定要有扩展性,能自由加减机器。假设我们现在加了一台机器,那么现在有3台,于是我们的sharding变成了 use