Sharding JDBC教程之读写分离

1 理解读写分离

​ 面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。 对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。

1564730708262

​ 通过一主多从的配置方式,可以将查询请求均匀的分散到多个数据副本,能够进一步的提升系统的处理能力。 使用多主多从的方式,不但能够提升系统的吞吐量,还能够提升系统的可用性,可以达到在任何一个数据库宕机,甚至磁盘物理损坏的情况下仍然不影响系统的正常运行。

1564730724139

​ 读写分离的数据节点中的数据内容是一致的,而水平分片的每个数据节点的数据内容却并不相同。将水平分片和读写分离联合使用,能够更加有效的提升系统的性能。

Sharding-JDBC读写分离则是根据SQL语义的分析,将读操作和写操作分别路由至主库与从库。它提供透明化读写分离,让使用方尽量像使用一个数据库一样使用主从数据库集群。

1564999956511

​ Sharding-JDBC提供一主多从的读写分离配置,可独立使用,也可配合分库分表使用,同一线程且同一数据库连接内,如有写入操作,以后的读操作均从主库读取,用于保证数据一致性。Sharding-JDBC不提供主从数据库的数据同步功能,需要采用其他机制支持。

1565052450587

​ 接下来,咱们对上面例子中user_db进行读写分离实现。为了实现Sharding-JDBC的读写分离,首先,要进行mysql的主从同步配置。

2.mysql主从同步(windows)

一,新增mysql实例

复制原有mysql如:D:\mysql-5.7.25(作为主库) -> D:\mysql-5.7.25-s1(作为从库),并修改以下从库的my.ini:

[mysqld]
#设置3307端口
port = 3307
# 设置mysql的安装目录
basedir=D:\mysql-5.7.25-s1
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql-5.7.25-s1\data

然后将从库安装为windows服务,注意配置文件位置:

D:\mysql-5.7.25-s1\bin>mysqld install mysqls1 --defaults-file="D:\mysql-5.7.25-s1\my.ini"

由于从库是从主库复制过来的,因此里面的数据完全一致,可使用原来的账号、密码登录。

二,修改主、从库的配置文件(my.ini),新增内容如下:

主库:

[mysqld]
#开启日志
log-bin = mysql-bin
#设置服务id,主从不能一致
server-id = 1
#设置需要同步的数据库
binlog-do-db=user_db
#屏蔽系统库同步
binlog-ignore-db=mysql
binlog-ignore-db=information_schema 
binlog-ignore-db=performance_schema

从库:

[mysqld]
#开启日志
log-bin = mysql-bin
#设置服务id,主从不能一致
server-id = 2
#设置需要同步的数据库
replicate_wild_do_table=user_db.%
#屏蔽系统库同步
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%

重启主库和从库:

net start [主库服务名]
net start [从库服务名mysqls1]

请注意,主从MySQL下的数据(data)目录下有个文件auto.cnf,文件中定义了uuid,要保证主从数据库实例的uuid不一样,建议直接删除掉,重启服务后将会重新生成。

三,授权主从复制专用账号

#切换至主库bin目录,登录主库
mysql -h localhost -uroot -p
#授权主备复制专用账号
GRANT REPLICATION SLAVE ON *.* TO 'db_sync'@'%' IDENTIFIED BY 'db_sync';
#刷新权限
FLUSH PRIVILEGES;
#确认位点 记录下文件名以及位点
show master status;

1564846647990

四,设置从库向主库同步数据、并检查链路

#切换至从库bin目录,登录从库
mysql -h localhost -P3307 -uroot -p
#先停止同步
 STOP SLAVE; 
#修改从库指向到主库,使用上一步记录的文件名以及位点
CHANGE MASTER TO 
 master_host = 'localhost',
 master_user = 'db_sync',
 master_password = 'db_sync',
 master_log_file = 'mysql-bin.000002',
 master_log_pos = 154;
#启动同步
START SLAVE;
#查看从库状态Slave_IO_Runing和Slave_SQL_Runing都为Yes说明同步成功,如果不为Yes,请检查error_log,然后排查相关异常。
show slave status\G

#注意 如果之前此备库已有主库指向 需要先执行以下命令清空
STOP SLAVE IO_THREAD FOR CHANNEL '';
reset slave all;

最后测试在主库修改数据库,看从库是否能够同步成功。

3.实现sharding-jdbc读写分离

(1)在Sharding-JDBC规则中修改

# 增加数据源s0,使用上面主从同步配置的从库。
spring.shardingsphere.datasource.names = m0,m1,m2,s0
...
spring.shardingsphere.datasource.s0.type = com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.s0.driver-class-name = com.mysql.jdbc.Driver
spring.shardingsphere.datasource.s0.url = jdbc:mysql://localhost:3307/user_db?useUnicode=true
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
....

(2)测试

执行testInsertUser单元测试:

1566387302826

通过日志可以看出,所有写操作落入m0数据源。

执行testSelectUserbyIds单元测试:

1566387409180

通过日志可以看出,所有写操作落入s0数据源,达到目标。

4 更多参考

参考代码:https://github.com/pbteach/PB-Sharding-JDBC

Sharding-JDBC系列教程:http://www.pbteach.com/java/java_06_04/index.html

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Sharding JDBC实现读写分离的方法是:通过在数据库层面对数据进行分片,将读操作和写操作分别路由到不同的数据库服务器上,从而实现读写分离。例如,通过在主数据库服务器上进行写操作,在从数据库服务器上进行读操作,可以提高数据库的读写性能,并且可以减少单点故障对整个系统的影响。 ### 回答2: Sharding JDBC通过读写分离功能实现了数据库的负载均衡和性能优化。具体而言,其实现主要涉及以下几个方面。 首先,Sharding JDBC通过数据源层实现读写分离。用户可以配置主库和从库的数据源,将读操作请求路由到从库,而将写操作请求转发到主库。这样一来,主库负责处理写操作,从库负责处理读操作,有效实现了读写分离。 其次,Sharding JDBC通过使用数据库的读写分离插件,将读操作请求分发到从库。这个插件负责在代码层面拦截读操作,并根据一定的规则将其转发到从库,例如轮询、随机、权重等。 第三,Sharding JDBC还提供了基于SQL的读写分离规则配置。用户可以配置一系列规则,包括表级别和数据库级别的规则。通过这些规则,可以指定哪些表或数据库需要执行读操作,哪些需要执行写操作,从而实现细粒度的读写分离控制。 最后,Sharding JDBC通过数据同步机制确保主库和从库之间的数据一致性。当写操作被路由到主库时,其会自动将写操作同步到相关的从库上,保证数据的一致性。 总结来说,Sharding JDBC通过数据源层的配置、读写分离插件、基于SQL的读写分离规则配置和数据同步机制等方法,实现了读写分离。通过将读操作请求路由到从库,有效降低了主库的负载压力,提升了系统的整体性能和可扩展性。 ### 回答3: Sharding JDBC是一个开源的分布式数据库中间件,提供了读写分离的功能。它通过在应用程序和数据库之间增加一层代理来实现读写分离。 首先,在Sharding JDBC的配置文件中,我们可以配置多个数据源,每个数据源对应着一个真实的数据库实例。这些数据库实例可以是主从复制的架构,也可以是分布式数据库集群。 其次,Sharding JDBC通过一定的算法将相应的读请求和写请求分发给不同的数据源。对于写请求,Sharding JDBC可以将其发送给主数据库,确保数据的一致性。对于读请求,Sharding JDBC可以将其发送给从数据库或者分布式数据库集群中的任意节点,实现了读的负载均衡和扩展性。 另外,Sharding JDBC还提供了事务的支持。当应用程序开启一个事务时,Sharding JDBC会将所有的写请求都发送给主数据库,保证事务的原子性。当应用程序结束一个事务时,Sharding JDBC会将该事务中的读请求发送给从数据库或者分布式数据库集群,提高了读的性能。 总而言之,Sharding JDBC通过配置多个数据源和合理地分发读写请求,实现了读写分离的功能。这样做既解决了大量读写请求同时访问数据库时的性能瓶颈,也提高了数据库的可扩展性和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值