本文作者:梁开权,叩丁狼高级讲师。原创文章,转载请注明出处。

读写分离

接着上一篇的分表分库我们继续来说读写分离

案例模型

让数据库的读和写功能分开,其中master负责所有的写操作以及在特殊情况下负责少量的读操作,slave在任何情况下都负责所有的读操作,不负责任何写操作,同样完成这个操作我们需要至少需要2个连接池,具体选择哪个连接池来操作取决于内部的一个叫路由的组件,该组件具有SQL的识别功能

注意:该功能需要依靠数据库的主从同步才能实现,具体怎么配置请参考之前的笔记

建表

-- 分别在主和从服务器中建立数据库sharding,并且建表employee
CREATE TABLE `employee` (`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ###################################
CREATE TABLE `employee` (`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

application.properties

# 定义连接池
sharding.jdbc.datasource.names=master,slave# 主库连接池
sharding.jdbc.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.master.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.master.url=jdbc:mysql://masterIp:port/sharing
sharding.jdbc.datasource.master.username=xxx
sharding.jdbc.datasource.master.password=xxx# 从库连接池
sharding.jdbc.datasource.slave.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.slave.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.slave.url=jdbc:mysql://slaveIp:port/sharing
sharding.jdbc.datasource.slave.username=xxx
sharding.jdbc.datasource.slave.password=xxx# 主从路由连接池名称,叫dataSource为了方便MyBatis注入
sharding.jdbc.config.masterslave.name=dataSource
# 管理主库连接池
sharding.jdbc.config.masterslave.master-data-source-name=master
# 管理从库连接池
sharding.jdbc.config.masterslave.slave-data-source-names=slave
# 从库负载均衡算法类型:round_robin(轮询),random(随机)
sharding.jdbc.config.masterslave.load-balance-algorithm-type=round_robin# 打印日志
sharding.jdbc.config.props.sql.show=true

mapper

/*** 这里写的employee表是数据库中的真实表*/
@Mapper
public interface EmployeeMapper {@Select("select * from employee")List<Employee> selectAll();@Insert("insert into employee (name) values (#{name})")void inser(Employee entity);
}

测试

跟上面的完全一致,直接运行然后看效果即可

优缺点

  • 增加冗余
  • 增加了机器的处理能力
  • 对于读操作为主的应用,使用读写分离是最好的场景,因为可以确保写的服务器压力更小,而读又可以接受点时间上的延迟

分库分表 + 读写分离

案例模型

做数据分片 + 读写分离,最少需要2主2从,然后再结合前面讲过的数据分片

application.properties

# 数据分片 + 读写分离
sharding.jdbc.datasource.names=master0,master0Slave,master1,master1Slavesharding.jdbc.datasource.master0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.master0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.master0.url=jdbc:mysql://master0Ip:port/sharing
sharding.jdbc.datasource.master0.username=xxx
sharding.jdbc.datasource.master0.password=xxxsharding.jdbc.datasource.master0Slave.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.master0Slave.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.master0Slave.url=jdbc:mysql://master0Ip:port/sharing
sharding.jdbc.datasource.master0Slave.username=xxx
sharding.jdbc.datasource.master0Slave.password=xxxsharding.jdbc.datasource.master1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.master1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.master1.url=jdbc:mysql://master1Ip:port/sharing
sharding.jdbc.datasource.master1.username=xxx
sharding.jdbc.datasource.master1.password=xxxsharding.jdbc.datasource.master1Slave.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.master1Slave.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.master1Slave.url=jdbc:mysql://master1SlaveIp:port/sharing
sharding.jdbc.datasource.master1Slave.username=xxx
sharding.jdbc.datasource.master1Slave.password=xxx# 分库规则
sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=master$->{id % 2}# 绑定逻辑表
sharding.jdbc.config.sharding.binding-tables=employee
# 分表规则
sharding.jdbc.config.sharding.tables.employee.actual-data-nodes=db$->{0..1}.employee_$->{0..1}
sharding.jdbc.config.sharding.tables.employee.table-strategy.inline.sharding-column=id
sharding.jdbc.config.sharding.tables.employee.table-strategy.inline.algorithm-expression=employee_$->{id % 2}
sharding.jdbc.config.sharding.tables.employee.key-generator-column-name=id# 管理主从连接池
sharding.jdbc.config.sharding.master-slave-rules.db0.master-data-source-name=master0
sharding.jdbc.config.sharding.master-slave-rules.db0.slave-data-source-names=master0slave
sharding.jdbc.config.sharding.master-slave-rules.db1.master-data-source-name=master1
sharding.jdbc.config.sharding.master-slave-rules.db1.slave-data-source-names=master1slave

mapper

/*** 这里写的employee表是逻辑表*/
@Mapper
public interface EmployeeMapper {@Select("select * from employee")List<Employee> selectAll();@Insert("insert into employee (name) values (#{name})")void inser(Employee entity);
}

测试

跟上面的完全一致,直接运行然后看效果即可

===============================================

Sharding JDBC-读写分离相关推荐

  1. SpringBoot + Sharding JDBC 读写分离、分库分表

    Sharding-JDBC 最早是当当网内部使用的一款分库分表框架,到2017年的时候才开始对外开源,这几年在大量社区贡献者的不断迭代下,功能也逐渐完善,现已更名为 ShardingSphere,20 ...

  2. 干货丨金仓JDBC读写分离介绍和最佳实践

    背景和目的 当前业务系统面临的业务压力越来越大,单节点已经难以满足现在和未来的业务需求.因此市面上出现了很多的解决方案,其中就包括读写分离集群.读写分离通过备机读负载均衡,降低主机上读负载,以此提高整 ...

  3. Sharding Sphere 读写分离的配置

    #配置主从数据源,要基于MySQL主从架构. spring.shardingsphere.datasource.names=m0,s0spring.shardingsphere.datasource. ...

  4. sharding+druid 读写分离

    ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC.Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的 ...

  5. SpringBoot + Sharding JDBC,一文搞定分库分表、读写分离

    程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 30 分钟. 来自:blog.csdn.net/qq_40378034/article/details/115264837 S ...

  6. 【MySQL 读写分离】Sharding JDBC + Spring boot 实现数据库读写分离的登录 Demo

    上篇文章我们搭建了 MySQL 数据库主从复制集群 MySQL 搭建主从复制集群~~~ 本篇文章我们利用搭建好的主从复制集群,使用 SpringBoot 结合 Sharding-JDBC 搭建一个小的 ...

  7. Sharding JDBC分片和读写分离详解

    目录 Sharding Sphere简介 开始使用Sharding JDBC 数据分片 简单示例 Spring Boot示例 代码分析 属性分析 绑定表和广播表 真实表 绑定表 广播表 Shardin ...

  8. mysql sharding 读取_MySQL读写分离(一)——sharding-jdbc

    sharding-sphere是强大的读写分离.分表分库中间件,sharding-jdbc是sharding-sphere的核心模块.官方网站 springboot项目中集成sharding-jdbc ...

  9. Sharding Sphere ~ Sharding-jdbc分库分表、读写分离

    Sharding Sphere 是什么? 1.一套开源的分布式数据库中间件解决方案 2.有三个产品:Sharding-JDBC 和 Sharding-Proxy 3.定位为关系型数据库中间件,合理在分 ...

  10. ShardingSphere JDBC 分库分表 读写分离 数据加密

    简介 在上篇文章中,在本地搭建了运行环境,本地来体验下ShardingSphere JDBC的三个功能:分库分表.读写分离.数据加密 示例运行 首先把概念先捋一捋,参考下面的文档: 数据分片 读写分离 ...

最新文章

  1. 3天学会TensorFlow | 香港科技大学
  2. 如何用Splunk建立可疑DNS报警系统
  3. 随笔 | 抢红包不是一件小事
  4. 构造函数中的虚拟成员调用
  5. infinity mysql_MySql锁机制
  6. homepage php,HomePage.php
  7. ubuntu16.04 Nvidia 显卡的风扇调速及startx的后果
  8. PCB 机器学习(ML.NET)初体验实现PCB加投率预测
  9. 关于session.auto_start报警的问题
  10. 华为手机连电脑_移动办公利器华为MatePad Pro:能写会画有键盘,能当电脑连手机...
  11. hdu 1083 Courses
  12. 当前目录未找到系统,请尝试选择更深层的目录再次搜索解决方法
  13. 操作系统锁的实现方法有哪几种_Java并发之Monitor实现
  14. 引入 DTM 以支持 ABP 的多租户多数据库场景
  15. 十本经典JavaScript书籍
  16. 永远不要把自己置于一种不得不失去颜面而后退,同时不得不冒险而前进的境地。
  17. ★中国富豪掘第一桶金的九大方式 ★
  18. 天平游码读数例题_2019使用天平游码时的读数方法语文
  19. PMP中工具与技术归类
  20. 三国志战略版:三势贾的另类搭配,也可以这么强?

热门文章

  1. mysql索引原理记录
  2. Qt|layout布局相关,layout属性的含义及使用
  3. 用python获取指定路径下的所有目录路径和文件路径
  4. MySQL连接查询,子查询,union(合并),分页
  5. JavaScript聊天器
  6. Android技术知识点:什么是外边距(margin)
  7. 服务器重装系统进入pe找不到硬盘,U盘装系统进入PE无法找到硬盘怎么办?
  8. qwin10如何删除linux系统,win 10内置了一个Linux子系统,以后使用Linux,不用那么麻烦了...
  9. python:.py文件转.dll文件(.pyd文件)
  10. Latex写文章时插入单栏图片和双栏图片方法