分布式系统解决方案(四)--分库分表的选择

分库分表策略

1. 取余

   关于取余的策略,这种方式上面已经进行了详细的介绍,主要的策略就是根据指定的字段对数据库节点数进行取余,从而将其插入到对应的数据库中,这里不再赘述。

2. 按照范围分片

按照范围分片,顾名思义,就是首先对整体数据进行范围划分,然后将各个范围区间分配到对应的数据库节点上,当用户插入数据时,根据指定字段的值,判断其属于哪个范围,然后将数据插入到该范围对应的数据库节点上。需要注意的是,这里会配置一个默认的范围,当用户插入的数据不再任何指定的范围内时,该数据将会被插入到默认节点上。如下是按范围分片的配置:
<!-- schema.xml -->
<table name="t_company" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="range-sharding-by-members-count"/>

3. 按照日期进行分片

按照日期分片,这种方式相对来说理解稍微复杂一点,我们这里直接展示一个配置示例:

<!-- schema.xml -->
<table name="t_order" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="order-sharding-by-date"/>

4. 按照月份进行分片

按照月份进行分片,顾名思义,就是以月为单位,判断目标时间在哪个月内,然后就将数据分配到这个月对应的数据节点上。如下是按照月份进行分片的配置示例:

<!-- schema.xml -->
<table name="t_bank" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8,dn9,dn10,dn11,dn12" rule="sharding-by-month"/>

5. 按照枚举值分片

按照枚举值分片比较适合于某个字段只有固定的几个值的情况,比如省份。通过配置文件将每个枚举值对应的数据库节点进行映射,这样对于指定类型的数据,就会被分配到同一个数据库实例中。如下是按照枚举值分片的一个示例:

<!-- schema.xml -->
<table name="t_customer" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="sharding-by-province"/>

6. 范围取模

范围取模分片的优点在于,既拥有范围分片的固定范围数据不做迁移的优点,也拥有了取模分片对于热点数据均匀分布的优点。首先我们还是以一个示例进行讲解:

<!-- schema.xml -->
<table name="t_car" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="auto-sharding-rang-mod"/>

7. 二进制取模范围分片

二进制取模分片的方式与范围取模非常相似,但也有不同,其分片方式主要是根据目标分片字段的低10位的值来判断其属于哪个分片

8. 一致性hash分片

一致性hash分片方式上面的二进制取模方式非常相似,不过一致性hash的虚拟槽的概念更强,并且一致性hash分片的虚拟槽的数量是可配置的。

9. 按照目标字段前缀指定的进行分区

按照目标字段前缀进行分片,这种方式就比较好理解,其会获取到指定分区字段的前缀值,然后将其转换为十进制数字,将其作为分区值,如果该数字超过了分区数量,则会将当前数据放在默认分区

 

分库分表带来的问题

事务问题

在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。

跨库跨表的join问题。

在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联操作将受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成

额外的数据管理负担和数据运算压力

额外的数据管理负担,最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然引起额外的逻辑运算,例如,对于一个记录用户成绩的用户数据表userTable,业务要求查出成绩最好的100位,在进行分表之前,只需一个order by语句就可以搞定,但是在进行分表之后,将需要n个order by语句,分别查出每一个分表的前100名用户数据,然后再对这些数据进行合并计算,才能得出结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值