多租户分库:一个租户一个库

状态:原创 / 转载(请表明来源)

关于多租户分库,最近尝试使用shardingsphere落地,分享一下我的最终落地方案。

  • 需求
    多租户分库,每个租户对应一个数据库
  • 使用方案
    shardingsphere-jdbc5.0.0 + mybatis-plus+mysql
  • 配置
  • 效果
    1. 通过上面的配置,实现了每个租户路由至各自的数据库。
    2. 新增一个租户只需要在数据源配置的地方加上对应的数据源即可
    3. 新增表只需要在tables下面加上表配置即可。
  • 说明
    1. 我使用的分库策略是标准分片算法 standard,是最简单的一种(已经满足我现阶段的需求)。
    2. 我的所有表都有tenant_id字段。通过mybatis-plus多租户插件实现。
    3. 动态添加数据源和规则,我们暂时没有这样的考虑。
    4. 后续如果有分表需求可以方便的配置对应的表的分片策略。
2 个赞

很有价值的分享 :100:

@方保彦 但是新增一个租户。每次都要修改配置新增一个数据源,这样就需要重启应用啊。这样的话可能会丢失数据。

不错不错,这个是通过自定义一个分片的列来做,如果不想在每个表中,都加一个租户字段,通过hint,能实现么?

这样的话就可以使用proxy,然后使用他的distsql。

老师您好
我这边也有类似的需求,但是要强制路由,使用java代码来配置,但是在配置的时候必需指定表名,如果想忽略表名,所有表进行路由应该怎么配置?

ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTables().add(new ShardingTableRuleConfiguration("*"));//这一行
Properties props = new Properties();
props.setProperty("algorithmClassName", ZjHintShardingAlgorithm.class.getName());
props.setProperty("strategy", ClassBasedShardingAlgorithmStrategyType.HINT.name());
shardingRuleConfig.getShardingAlgorithms().put("tableShardingAlgorithm", new ShardingSphereAlgorithmConfiguration("CLASS_BASED", props));

上面代码中设置ShardingTableRuleConfiguration这一行去掉后会报错:

No available sharding rule configurations in schema `logic_db`.

你好,想要配置所有表共用的分片策略,可以指定 defaultDatabaseShardingStrategydefaultTableShardingStrategy

ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.setDefaultDatabaseShardingStrategy(...);
shardingRuleConfig.setDefaultTableShardingStrategy(...);

感谢回复,我尝试下。

赞!加上Proxy就可以做到扩展了。基本上可以满足大部分场景了。

是不是一定要配置每张表,可以通用配置所有表吗

要使用默认分片策略,也要在 sharding rule 中配置表名的,未配置的表都按 single table 处理。

按这个格式
每一个需要分片的表都需要加一条配置?
如果我要加一张表还需要先更新配置?

的确是的,需要一个显示定义的规则来让 SS 知道哪些表是分片表。

京ICP备2021015875号