springboot based 主从数据源中间件方案
先定几个原则/目标:
原则:
1.必须保证数据逻辑的一致性;
反例:刚写了数据,(因为主从延迟)查询不到;
2.对开发人员透明,对业务代码无侵入性;与单数据源的业务代码调用一致;
反例:对已有业务代码的侵入式改动,显示说明datasource;
3.根据调用场景自动选择主从数据源
场景:涉及写入,读写都在主库进行。只涉及查询,从库查询
反例:
3.1写事务调用从库
3.2非必要的从主库查询
4.给业务开发选择的权利,可以以最低成本的方式显示进行数据源(类别)选择(如annotation等);
场景:只涉及查询,但是业务需要,必须从主库查询;
5.主从数据源共存,与单数据源方案,可以无缝切换
扩展目标:
6.低成本的数据源切换线程安全
反例:全局悲观锁,同步锁实现
7.支持多个从库/从库HA
8.主数据库不可用,从库自动顶上
9.代码级别上,采用spring boot starter方案
不考虑场景:
sharding 目前不考虑,如果需要,作单独专题展开。
备忘问题:
传播级别:
调用者上下文显示说明MASTER,被调用者显示说明SLAVE; 或反过来,需要一个合理的切换机制/或者不切换;
传播性可以做如下规则:
1.如果外层为master,则内层不管原先级别,都将提升至master级别;
2.级别只升不降
3. 同一个线程,如果不切换主从,同一分类的机器,(主要是指多个slave )实例也不切换
4.更多的调用层级,直接递推即可(传播);
case:
- master → slave => master → master
- master → master => master → master
- slave → master => slave → master
- slave → slave => slave → slave
Master/Slave 切换场景的几种设定:
| 默认Slave(性能优先) | 默认Master(开发效率优先) |
如果调用者未显示说明@Master/Slave,根据事务状态自主选择主从; 不在传播链中生成@Master/Slave |
如果调用者未显示说明@Master/Slave,根据事务状态自主选择主从; 在传播链中生成@Master/Slave |
|
|---|---|---|---|---|
| 优点 |
1.分担主库负担 2.尽可能利用从库,从库只读,HA成本低 |
1.现有代码无任何改动可正常运行 |
1.用户完全控制,截断了隐性的@Master 2.更多的@Slave场景机会 |
1.整个传播链行为一致,使得整个数据行为更一致; |
| 缺点 |
所有现有的服务,涉及到写或者必须连master的场景,必须显示标明@Master; 否则会有两种情况: 1.涉及写入的时候会默认连接到只读从库,程序会报错; 2. 非写入动作,但可能有数据读取的延时性问题 |
1.需要显示标明@Slave,才能连接从库 2.从库利用率会较低 |
1.有可能业务逻辑的不一致; 例子: a.不标明@Master/Slave 的调用上下文先执行了 写操作; b.然后调用了@Slave 的读操作服务; a步骤写入的数据,有可能在b操作中读取不出来 这种场景,当然可以通过显示标明调用者为 |
1.对事务的状态判断,并不能单方面很好的决定是否选择主从,所以一般会选择主库;(TODO:看是否能更好优化) 2.为了程序运行逻辑不出异常的情况下,而大多选择了@Master,那么接下来的级别都会是@Master,@Slave 的场景会非常少,从库利用率会很低 |
项目地址:
https://github.com/leochowcomtop/db-proxy
springboot based 主从数据源中间件方案的更多相关文章
- springboot之多数据源配置JdbcTemplate
springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework ...
- springboot配置Druid数据源
springboot配置druid数据源 Author:SimpleWu springboot整合篇 前言 对于数据访问层,无论是Sql还是NoSql,SpringBoot默认采用整合SpringDa ...
- springBoot整合多数据源
springBoot整合相关 1:springBoot整合多数据源: 应用场景: 项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库. 工具/版本: jdk1. ...
- springboot + mybatis + 多数据源
此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1) ...
- 基于springboot的多数据源配置
发布时间:2018-12-11 技术:springboot1.5.1 + maven3.0.1+ mybatis-plus-boot-starter2.3.1 + dynamic-datasour ...
- Spring主从数据源动态切换
参考文档: http://uule.iteye.com/blog/2126533 http://lanjingling.github.io/2016/02/15/spring-aop-dynamicd ...
- Mysql读写分离与主从数据库设置方案
Mysql读写分离与主从数据库设置方案 亿仁网 18-10-0711:31 Mysql无非四个功能:增,删,改,读.而将增删改和读分离操作.这样有利于提高系统性能.下面是非常直观的操作: 1.配置: ...
- Redis Sentinel主从高可用方案
Redis Sentinel主从高可用方案 本文介绍一种通过Jed和Sentinel实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上 ...
- springboot添加多数据源连接池并配置Mybatis
springboot添加多数据源连接池并配置Mybatis 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190226.html May 12, 2018 ...
随机推荐
- vue配置404页面
{ path:'*', name:"/404", component:cuowu } path星号表示没有这个路由 name表示去这个地址 component这个页面引入的时候叫的 ...
- vue-cli3使用webpack-spritesmith配置雪碧图
一.背景问题 项目中如果有大量的小图标,如果不使用阿里的iconfont.UI给一个加一个,加一个引用一个,每个图标虽然很小,但是也是一次请求,每次请求都是消耗性能资源的. 二.解决思路 使用webp ...
- mysql8操作命令(持续更新)
mysql服务管理 查看服务状态 systemctl status mysqld.service 启动服务 systemctl start mysqld.service 关闭服务 systemctl ...
- op 和 oo 的区别
本是之前一位前辈留下的问题,因为我不是程序出身,略懂一些代码,后又查了很多人的博客,问了周围搞开发的朋友,得出以下结论: 有人这么形容OP和OO的不同:用面向过程的方法写出来的程序是一份蛋炒饭,而用面 ...
- 算法(第四版)C# 习题题解——1.3.49 用 6 个栈实现一个 O(1) 队列
因为这个解法有点复杂,因此单独开一贴介绍. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识——用两个栈模 ...
- EF框架和Ado.Net的使用比较
1.性能上(运行效率) Ado.Net的性能更高些,直接使用SQLHelper的Command.Connection等命令通过写SQL语句对数据库进行操作.(EF的实体模型,性能上肯定要损失些!!) ...
- 剑指offer(66)机器人的运动范围
题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能 ...
- sqlite3出现SQLITE_BUSY错误码的原因以及解决方法
转载:https://www.cnblogs.com/lijingcheng/p/4454884.html 转载:https://blog.csdn.net/venchia_lu/article/de ...
- SQLAlchemy 增删改查 一对多 多对多
1.创建数据表 # ORM中的数据表是什么呢? # Object Relation Mapping # Object - Table 通过 Object 去操纵数据表 # 从而引出了我们的第一步创建数 ...
- 剑指offer:链表中倒数第k个结点
问题描述 输入一个链表,输出该链表中倒数第k个结点. 解题思路 两个指针都指向头结点,第一个指针先移动k-1个结点,之后两指针同时移动,当第一个指针到链表尾的时候,第二个指针刚好指向倒数第k个结点. ...