数据分片产生的背景,可以查看https://shardingsphere.apache.org/document/current/cn/features/sharding/,包括了垂直拆分和水平拆分的概念.还有这个框架的目标是什么,都写得很清楚
Sharding-JDBC与MyCat:
解决分库分表的中间件.
但是定位不同,Sharding-JDBC定位是轻量级Java框架,以jar包的方式提供服务,未使用中间件,使用代码连接库.MyCat相当于代理,MyCat相当于数据库,直接访问MyCat就可以,不需要关系库和表,MyCat自动处理,但是需要维护MyCat,性能会有损耗.
Sharding-JDBC(1.x):
github地址: https://github.com/apache/incubator-shardingsphere/releases
官网: https://shardingsphere.incubator.apache.org/
文档: https://shardingsphere.apache.org/document/current/en/overview/
使用Sharding-JDBC进行读写分离实战
在数据库的操作中,写操作是非常耗时的,而最常用的是读操作,读写分离的目的是避免数据库的写操作影响读操作的效率.最重要的目的还是减少数据库的压力,提高性能.
这只是模仿读写分析实战,流程是创建两个数据库,配置两个数据源,一个是主表,一个是从表,写修改删除在主表,查询是在从表.
创建数据库的语句:
创建项目,引入依赖
配置文件的编写(使用xml的方式来实现):
编写model,service,controller
启动类:
在查询前使用这句可以指定从主库中进行读取数据.
分片算法参考:
https://blog.csdn.net/gjx8010/article/details/72542207#1-%E5%88%86%E7%89%87%E6%9E%9A%E4%B8%BE
分片枚举: 通过在配置文件中配置可能的枚举id,自己配置分片。 这种规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国的省份区县固定的,这类业务使用这一规则。
范围约定: 此分片适用于提前规划好分片字段某个范围属于哪个分片. 这个接触过,就是比如说id在1~10000的在一张表,10001~20000在另一张表.
取模: 比如说两张表,奇数存一张表,偶数存一张表.
按日期进行分片: 比如说一天一张表,或者一个月一张表(这个一般是看业务需求).
还有很多,不过我觉得我比较喜欢的就这几个,Hash的也很常用,只是我没有用过.真正用过的就是范围约定了.
分库分表
分库分表就是表面上的意思,将一个库分为多个库,讲一个表分为多个表.
单库分表
在前一个项目上进行修改
首先创建数据库ds_03,在数据库中创建4张表
重新创建xml文件sharding-table.xml:
上面在使用分表的时候使用的是inline表达式.还有一种自定义表达式,上面是注释掉的,使用的是类来进行分表,但是我测试过程一直是类型转换异常,Integer转不成Long,这个错误清除,不知道发生在哪,因为着急,就不仔细研究了,下面把自定义表达式的类贴出来,有兴趣的可以试试.
编写controller
分库分表
前面说了单库分表,那分库分表呢?一样的实现.
创建数据库和表
创建sharding-db-table.xml
添加数据库的分库策略
修改controller中的saves方法,进行测试:
分布式主键的使用
为了保证插入的主键不重复,所以使用分布式主键,其实在前面的xml中已经添加了实现<rdb:generate-key-column column-name="id"/>,接下来只要修改saves方法和save方法的实现就可以,也就是不给id赋值,并且插入的时候不给id字段,不过我在实践过程中发现生成的id全是偶数,不知道是不是偶然,如果不是,那么就需要重新找算法或者重新写分配策略了.
欢迎工作一到五年的Java工程师朋友们加入Java高级互联网架构:957734884,欢迎加入我们,给你意想不到的惊喜。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。