天天看点

分库分表 Sharding: 4. 路由 / 映射:如何找到要操作的表

4.    路由 / 映射:如何找到要操作的表

4.1    实际表的分布种类

基本表与实际表的映射关系,可分为均匀顺序分布,均匀轮询分布,仅均匀分布和自定义分布 4 种形式。

现通过例子,说明各种表分布的特点。基本名称为 ds 的 3 数据库,有 6 个表,表基本名称为 user。以下为数据库与对应表下标的分布。

均匀顺序分布:

ds0=[ 0, 1],  ds1=[ 2, 3], ds2=[ 4, 5]

均匀轮询分布:

ds0=[0, 3] ,  ds1=[1, 4] ,ds2=[2, 5]

仅均匀分布:

ds0=[ 0, 1],  ds1=[ 0, 1],  ds2=[ 0, 1]

自定义:可能是

ds0=[ 0,],  ds1=[ 1,2, 3], ds2=[ 4, 5]

通过观察和判断,发现,仅均匀分布每个库中的表的名称是相同的,只知道表名,无法由表名推断表所对应的库,因此不适合用来通用分片处理;自定义,无规律可言,也不适合。

4.2    分片键

分片键,即用来寻找到对应库和表的表中字段。

4.2.1    分库键

表的字段中,使用其值,按一定算法找到唯一数据库的字段。如,orders 订单表中,userid 用户 id,可以作为分库键。

4.2.2    分表键

表的字段中,使用其值,按一定算法找到唯一实际的字段。如,orders 订单表中,userid 用户 id,可以作为分表键。分片键中,可以只使用分表键,然后根据确定的表名,推断所有的库;从而省略分库键。

4.2.3    分片键的选择

分片键即分库 / 分表字段,是在水平拆分过程中用于生成拆分规则的数据表字段。根据分片键的值将数据表水平拆分到每个物理分库中。

根据表拆分的首要原则,就是要尽可能找到数据表中的数据在业务逻辑上的主体,并确定大部分(或核心的)数据库操作都是围绕这个主体的数据进行,然后可使用该主体对应的字段作为分片键,进行分库分表。

业务逻辑上的主体,通常与业务的应用场景相关,下面的一些典型应用场景都有明确的业务逻辑主体,可用于分片键:

面向用户的互联网应用,都是围绕用户维度来做各种操作,那么业务逻辑主体就是用户,可使用用户对应的字段作为分片键;一般可以使用 userid 用户 id。

侧重于卖家的电商应用,都是围绕卖家维度来进行各种操作,那么业务逻辑主体就是卖家,可使用卖家对应的字段作为分片键;一般可以使用商家 id。

以此类推,其它类型的应用场景,大多也能找到合适的业务逻辑主体作为分片键的选择。

如果确实找不到合适的业务逻辑主体作为分片键,那么可以考虑下面的方法来选择分片键:

根据数据分布和访问的均衡度来考虑分片键,尽量将数据表中的数据相对均匀地分布在不同的物理分库 / 分表中,适用于大量分析型查询的应用场景(查询并发度大部分能维持为 1);

按照数字(字符串)类型与时间类型字段相结合作为分片键,进行分库和分表,适用于日志检索类的应用场景。

注意:无论选择什么拆分键,采用何种拆分策略,都要注意拆分值是否存在热点的问题,尽量规避热点数据来选择拆分键。

注意:不一定需要拿数据库主键当做分片键,也可以拿其他业务值当分片键。拿主键当分片键的好处是可以散列均衡,减少热点问题。但这种分法,会将业务逻辑相关的数据放到不同的表,甚至不同的库,从而引起跨库问题。

分片键中,可以只使用分表键,然后根据确定的表名,推断所有的库;从而省略分库键。

4.2.4    实践 — 用 userid 作为分表键的好处

4.3    分片算法及分片函数

分片算法,指由分片键及其值,找到对应的库和表的步骤与方法。

分片函数,指由分片值计算后得到相应的值的表达式或程序代码段。例如,分片键 userid 的值是 10, 通过求余表达式,userid%6,代入得 10%6=4;当是求映射的表,基本表是 orders,则得到目标表:orders4。

分片算法可以使用不同的分片函数,除了常用的数字求余,还有分片字段是字符串类型的求余,字符串或时间取其中部分子串。

正则表达式适合用作分库分表的分片函数吗?不适合,它不能由分片值,确定库和表。

4.4    默认分片函数及分片的自动化

Bee 采用最简单的求余表达式分片函数作为默认方式;还支持字符串类型的求余,最大程序实现自动化。最简单的配置,只需要指定实现表节点和分表键即可。

4.5    强制指定分片路由

用户可以指定使用的具体 ds 和 table,而无需使用分片值通过路由算法计算。在 Bee 中,可以使用

继续阅读