背景
我们当前项目有如下要求:
- 一个服务端给多个终端提供服务(老板不肯多买一台服务器部署)
- 多个终端之间的数据,我想要隔离(对了对了,就是这个要求,让我想到了ShardingSphere)
问题
我估计懂的朋友会问了:不对不对,你这个需求,一个动态多数据源不是搞定了吗? 答:确实是的。
:那为何你还要用ShardingSphere呢? 答:虽然我最后还是放弃了这个方案,但我最初选择这个方案,主要还是想学习一下这个东西。并且,查阅资料后,让我错误的以为,可以满足我的需求。事实上,我想要实现的业务目的是:分库不分表,也即:数据隔离。。 呜呜呜…
自我扫盲
言归正传,这边,我总结一下我这两天看资料之后,给自己总结的初步扫盲攻略,我估计有的朋友们第一次看ShardingSphere技术文档的时候,也会跟我有一样的疑惑。先来一张配置表示例:
假设,数据源为m1,逻辑表名称course,以这个为例子
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_$->{1..2}
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.tables.course.key-generator.props.worker.id=1
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column= cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid%2+1}
spring.shardingsphere.sharding.tables.course.databse-strategy.inline.sharding-column= cid
spring.shardingsphere.sharding.tables.course.database-strategy.inline.algorithm-expression=m_$->{cid%2+1}
【盲点一】ShardingSphere不适合只分库,不分表的场景。我也查阅了很多资料才逐渐意识到,ShardingSphere这个东西,往透了说,它针对的是分表这个使用场景,或者说,“分库分表”这两个东西是不能拆开来讲的,是原子性的。 如果你跟我一样,没有分表的需求,只是想要分库做数据隔离的话,绕道走吧,这个真不适合! 不是说做不了,而是,如果你真要实现的话,那么,你得给每一张表做一个“分库分表”策略!即,对于表course跟表user,或者其他xxx表,都要有一个对应的.properties文件配置(当然你可以合在一张配置表,我只是给你解释"一张表一个配置"这个逻辑关系而已)
【盲点二】“一表一配置”。每一张你需要做数据隔离的业务表,都要分别设置对应的分库、分表策略。关于(官网链接:ShardingSphere核心概念),官网给出的概念-分片的每个元素,都是必不可少的。 一开始我以为,我不需要分表,那么我不用设置分表策略啊,我只需要做数据隔离,那我只需要做好分库策略就好了呀! 不不不xdm,it is my fault。我所有的认知,都是建立在我以为“可以只分库,不分表”这个错误的认知上。事实上,分库策略也是针对某个表的分库策略,不能一次性设置针对所有表的分库策略。如果你有100张业务表想要做分库,那你就要给这100张表,分别做分库策略。(这不就是我的业务场景了吗,我需要对我现有所有表,甚至包括字典、配置表,都要隔离)
结语
最后,声明一下,这是我自己的一些个人总结,不一定正确哦。主要是,网上全都是教程,千篇一律的,根本没有针对初学者,想用但是不知道适合不适合的扫盲文。
|