开发者学堂课程【数据库中间件ShardingSphere详解:ShardingSphere-Sharding-JDBC (读写分离)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/666/detail/11252
ShardingSphere-Sharding-JDBC (读写分离)
Sharding-JDBC 操作
通过测试,在数据库中添加的数据。然后在从数据库中也做了数据的同步。刚才把 MySQL 数据同步过程做的配置。做完之后,下面就通 Sharding-JDBC 来实现对主从做完之后这个数据的操作。那怎么来做?首先第一部分要用Sharding-JDBC, Sharding-JDBC 并不会做到主从的数据复制,而它做的是什么?根据语义的一个变化来让你访问不同的数据库,看刚才写的有一句话:根据语义的分析,比如所有语中有insert 有 delete 有 update,那这些操作它会执行主数据库,当你是 select 的操作,它就是用我们的同数据库。所以现在通过Sharding-JDBC 来建立过程。
1、配置读写分离策略
配置写法比较固定,现在做的是主从这一种特点。肯定有主从服务器。需要同步数据库是刚才配置这个叫user db 所以现在有一个主服务器,还有一个从服务器器,需要在里面配一个数据,虽然配置过了,但还需要配置一个从服务器叫s0。配置之后,Sharding-JDBC 这并不知道谁是主谁是从,需要给它做个定义,所以这里定义这叫matter data,这叫 slave data,一个是主服务器,一个是从服务器。主就是m0 从就是 s0。这是主从配置,并且起个名字叫做 ds0。
spring.shardingsphere.datasource.s0.username = root.
spring.shardingsphere.datasource.s0.password = root.
# 主库从库逻辑数据源定义 ds0 为 user_db
spring. shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=m0
spring. shardingsphere.
sharding.master-slave-rules.ds0.slave-data-source-names=s0
# t_user 分表策略,固定分配至 ds0 的 t_user 真实表
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes = ds0.t_user
d0 对应的数据库值里边有个主有个从。在这里写到是主库从库的逻辑数据源的定义就是它实际是m0,s0,但是因为操作是同一个数据库,所有起名叫 ds0。最后写上表分布的规则,在 ds0 中 user ,然后对它动的操作,所以现在通过这段配置,然后实现出这个 Sharding-JDBC读写分离的这种做法,下面在代码中,把这个具体给它配置出来。
来到代码中,首先还是把之前这一个先给它复制一份,比如叫 application名字进行保留,然后在这个里边把它配置出来,给它打开。因为现在要对这个 user db 做主从,现在有user db=3306,这指的是主服务器,现在我加一个从服务器。另一个数据源的名字,比如叫这个 s0,名字可以随便起。然后定义之后,在下面这位置写上 s0 那个数据源,用它做一个修改,跟它结构是一样的,加上注释。配置那个主服务器。
#配置第三个数据源具体内容,包金连接池,驱动,地址,用户名和密码
# user_db 主服务器
spring. shardingsphere. datasource. m0. type=com. alibaba. druid. pool. DruidDataSource
Spring. shardingsphere. Datasource. m0. driver-class name=com mysql. cj. jdbe. Driver
Spring. shardingsphere. datasource. m0. url= jdhe:mysql://localhost:3306/user_db?serverTimezone =GMT%2B8
spring. shardingsphere. datasource.m0. username=root
spring. shardingsphere. datasource.m0.password=root
从服务器的名字叫 s0 这里边都改下,然后改完之后,后面改一下连接池,驱动,然后要改成叫3307,包括用密码,这是我们的第一份配置加一个主从的两个数据源。一个是 m0代表主服务器,这个 s0 代表从服务器。
# user_db 从服务器
spring. shardingsphere. datasource. s0. type=com.alibaba. druid. pool. DruidDataSource
spring. shardingsphere. datasource. s0. driver-class-nam
e=com.mysql. cj. jdbc. Driver
spring. shardingsphere. datasource. s0. url=jdbe:mysql://localhost:3307/user_db?serverTimezone =GMT%2B8
spring. shardingsphere. datasource. s0. username=root
spring. shardingsphere. datasource. s0. password=root
加上之后到第二部分,注意,因为现在有主和从就要设计一下谁是主,还有谁是从,所以需要在里面加上我们的这个配置。从word 文档中复制,复制之后有个问题是它的格式问题,需要把这格式稍微改一下,因为它这杠显示有点问题,特别注意,包括后面一样,这个需要改善。
#主库从库逻辑数据源定义 ds0 为 user_db
spring. shardingsphere. sharding. master-slave-rules. ds0. master-data-source-name=m0
spring. shardingsphere. sharding. master-slave-rules. ds0. slave-data-source-names=s0
现在里边两行一行叫 master-data,第二行叫 slave-data,这分别代表主服务器和从服务器。然后现在主和从对应的都是 user db 这个数据库,所以给它起个名字叫 ds0。,最后再配置一下,这个数据库和表的一个分布的一个规则。
之前它只是在 s0 中没有做主从,但是现在加上主从之后,如果还这么做,肯定是不对。因为现在是主从库的做法,所以需要把之前这配置给它去掉,然后这里边改成ds0 里面的 t-user。
#配置 user_db 数据库里面 t_user 专库专表
#spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=m$->{0}. t_user
# t_user 分表策略,固定分配至 ds0 的 t_user 真实表
Spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ds0. t_user
#配置公共表
spring. shardingsphere. sharding. broadcast-tables=t_udict
spring.shardingsphere.sharding.tables. t_udict. key-generator. column=dictid
spring.shardingsphere.sharding.tables. t_udict. key-generator. type=SNOWFLAKE
ds0 它就表示做这个主从库里边表操作。这样的话就可以完成这个具体配置。最终还是写代码,做一个最后的测试。
然后这里强调,因为现在做这个主从是一主一从,你可以做一主多从。一主一从是这配置,如果一主多从也不复杂,看一下官网,主服务器两个从服务器每个都配置数据没有变化,然后往下看,这里边,因为现在它有一主多从,主服务器到从服务器那种规则,比如说是随机还是规则,然后最终名字叫 ms,代表主从。
2、编写测试代码
//添加操作
@Test
public void addUserDb() {
User user = new User():
user. setUsername ("lucymary"):
user.setUstatus("a"):
userMapper. insert (user):
}
首先看看主数据库是否打开,就是 3306,现在添加为了区分改一下名字叫lucymary 给它加到数据库,执行,看看是否满足读写分离的数据库机制,包括数据同步数据复制的过程。
在代码里边,我们看到 m0。对应的 3306 是主库,就是 m0 操作主库就是读写分离,然后看数据在主库里边有,连它的重数据库,因为它要做这个数据库的同步。要把这个打开重数据库,然后看里边 lucymary 就加进来了,
所以这个添加了读写分离效果。然后再试个查询,根据 I D查一下数据,通过日志看数据效果。最终成功了。目前查的数据库
是 s0,s0 是重数据库,也就是 3307 库里的内容,所以就证明了读写分离已经生效,通过Shardding,SharddingJDBC 显现出效果,而 SharddingJDBC是通过语义的变化,做添加修改删除执行主数据库,以执行查询操作从重数据库里找到数据,最终效果为以上演示过程。到这就把 SharddingJDBC 实现读写分离操作演示完毕,过程中要掌握三部分,第一部分读写分离的概念,包括原理基于 binlog 监控过程,最后用 SharddingJDBC 在里面配置读写分离策略,编写代码完成最终测试,如果增加修改删除查询主库,如果查询操作查询重库。
以上是 SharddingJDBC 读写分离的操作。