分库分表 Sharding: 6. Sharing 最佳实践

205 篇文章 0 订阅
47 篇文章 0 订阅

6.    Sharing 最佳实践
6.1    表节点分布要有规律
数据库的基本名称一样,只是后缀不一样;表的名称规则也一样。实际表使用均匀顺序分布。如下,基本名称为 ds 的 3 数据库,有 6 个表,表基本名称为 user。ds0=[user 0, user 1], ds1=[ user 2, user 3], ds2=[ user 4, user 5]。
后缀用连续的数字下标表示最为简单。
6.2    配置简单方便
上面的例子:ds0=[user 0, user 1], ds1=[ user 2, user 3], ds2=[ user 4, user 5] 是有规律的,可以用简单的式子:
ds[0..2].user[0..5] 
来表示。从式子中,可以知道数据库和表的基本名称,还有它们的后缀。
   系统解析后,表达式与对应的格式 (系统内部使用更简洁的形式):
user={ds0=[0, 1], ds1=[2, 3], ds2=[4, 5]}
基本表名 {数据源名称 0=[相应表后缀列表], 数据源名称 1=[相应表后缀列表],…}
Bee Sharding 表达式用 [min..max] 表示连接的数字下标作为后缀,用逗号(,)表示要列举的后缀。如:"ds [0,3].test [1,3,4,5]" 表示:test={ds0=[1, 3], ds3=[4, 5]}
Bee (2.0) 默认是使用均匀顺序分布排列实际表;同时也支持指定使用轮询方式(ShardingBean 的 tabAssignType 属性设置为 1),如:
ds[0..2].test[0..5]
会解析为:
{test={ds0=[0, 3], ds1=[1, 4], ds2=[2, 5]}}
6.3    允许只有部分表分片
允许只有部分表分片。不分片的表,无需额外添加逻辑处理。
假设原来数据库中有 users 用户表,orders 订单表,orders_item 订单明细表,stock 库存表;users,orders,orders_item 可以分片,但 stock 可以不分片。无需添加额外的逻辑专门判断 stock。
6.4    无侵入架构设计
加入分片中间件或分片功能后,原来的代码,无需耦合分片的 api。如数据源要耦合分片的逻辑,则属于 API 侵入性设计。无侵入设计,除了分片的配置信息外,是否使用分片,并不影响使用 ORM 的基本功能。
6.5    分片透明化 
分片透明化,代码无需改动或改动少,用户编码可不用关注分片逻辑。
6.6    示例

      //1. 分片配置

        ShardingConfig.addShardingBean(Orders.class,new ShardingBean("ds[0..1].orders[0..5]", "userid"));

        //2. 查询

        Suid suid=BF.getSuid(); // 获取 select,update,insert,delete 操作对象

        Orders orders1=new Orders();

        orders1.setUserid(3L); // 分片值

        List<Orders> list=suid.select(orders1,condition); // 查询 Orders 实体列表

其中:"ds [0..1].orders [0..5]", "userid"     表示,数据源有:ds0, ds1;  ds0 里有:orders0,orders1,orders2; ds1 里有表:orders3,orders4,orders5; 表的分片键是:userid;  默认是根据表分片键(字段)的值,来路由到相应的表,如 条件 where userid =3, 则  3%6=3, 就会路由到表 orders3。Bee 默认还支持分片值是 String 的类型。

示例中,“//2. 查询” 注释的部分代码,是原来数据库没有分片时,ORM 用来查询的代码。在分片的情况下,只需要添加 “//1. 分片配置” 部分的代码即可;该部分是 Java 风格的配置,也可以使用 properties 风格的方式进行添加配置信息。


Bee 使用分片的相关配置:
#开启 Bee Sharding 分片功能进行分库分表
bee.dosql.multiDS.enable=true
bee.dosql.multiDS.sharding=true
# since v2.0   开启 Sharding 日志
bee.osql.showSQL=true
bee.osql.showShardingSQL=true
6.7    建议
分配表一般不采用:
ds0:orders0,orders1,orders2;
ds1:orders0,orders1,orders2;
即不同库的分表名是相同的。
这样,在只知道表名的情况下,不能反向推断数据源的名称。可能会产生额外的查询。

Bee 源码地址:

bee: Bee,互联网新时代的Java ORM框架,支持Sharding;JDBC,Android,HarmonyOS;更快、更简单、更自动,开发速度快,运行快,更智能!

https://github.com/automvc/bee

Bee 经过 10 几个版本的迭代,ORM 的基本功能已趋于成熟稳定。

Bee 从 2.0 版本开始,将全面支持 Sharding 分库分表功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值