先定几个原则/目标:

原则:

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操作中读取不出来

这种场景,当然可以通过显示标明调用者为
@Master 来规避;

1.对事务的状态判断,并不能单方面很好的决定是否选择主从,所以一般会选择主库;(TODO:看是否能更好优化)

2.为了程序运行逻辑不出异常的情况下,而大多选择了@Master,那么接下来的级别都会是@Master,@Slave 的场景会非常少,从库利用率会很低

项目地址:

https://github.com/leochowcomtop/db-proxy

springboot based 主从数据源中间件方案的更多相关文章

  1. springboot之多数据源配置JdbcTemplate

    springboot多数据源配置,代码如下 DataSourceConfig package com.rookie.bigdata.config; import org.springframework ...

  2. springboot配置Druid数据源

    springboot配置druid数据源 Author:SimpleWu springboot整合篇 前言 对于数据访问层,无论是Sql还是NoSql,SpringBoot默认采用整合SpringDa ...

  3. springBoot整合多数据源

    springBoot整合相关 1:springBoot整合多数据源: 应用场景:     项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库. 工具/版本: jdk1. ...

  4. springboot + mybatis + 多数据源

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1) ...

  5. 基于springboot的多数据源配置

    发布时间:2018-12-11   技术:springboot1.5.1 + maven3.0.1+ mybatis-plus-boot-starter2.3.1 + dynamic-datasour ...

  6. Spring主从数据源动态切换

    参考文档: http://uule.iteye.com/blog/2126533 http://lanjingling.github.io/2016/02/15/spring-aop-dynamicd ...

  7. Mysql读写分离与主从数据库设置方案

    Mysql读写分离与主从数据库设置方案 亿仁网 18-10-0711:31 Mysql无非四个功能:增,删,改,读.而将增删改和读分离操作.这样有利于提高系统性能.下面是非常直观的操作: 1.配置: ...

  8. Redis Sentinel主从高可用方案

    Redis Sentinel主从高可用方案 本文介绍一种通过Jed和Sentinel实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上 ...

  9. springboot添加多数据源连接池并配置Mybatis

    springboot添加多数据源连接池并配置Mybatis 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9190226.html May 12, 2018  ...

随机推荐

  1. PID算法(c 语言)(转)

    PID算法(c 语言)(来自老外) #include <stdio.h> #include<math.h> //定义PID 的结构体 struct _pid { int pv; ...

  2. 文件和IO流

    摘要:本文主要介绍了Java的文件处理以及常用的IO流操作. 文件操作 概念 File是数据源(保存数据的地方)的一种,可以表示一个文件,也可以表示一个文件目录. File类只能对文件和文件夹进行创建 ...

  3. android开发_view和view属性

    一.view视图的宽度和高度属性,属性值:固定和浮动两种状态 1属性为固定值 <View android:layout_width="30dp" android:layout ...

  4. 安全检查,Windows更新出现8024402F错误如何解决

    背景,每个月都要进行例行检查,需要更新windows补丁包,病毒库等操作,谁知今天windows报错了: windows 代码8024402f 错误,原因是更新日志和缓冲出了问题. 解决步骤 : 1. ...

  5. django url 反响解析,视图

    1. 内容回顾 1. 模板语言(字符串替换) 1. 母版和继承 1. 什么时候用母版? html页面有重复的代码,把它们提取出来放到一个单独的html文件. (比如:导航条和左侧菜单) 2. 子页面如 ...

  6. 关于html中的 script标签中的 代码写法有效性? easyui tabs的href不能载入内容页面

    script标签, 即 html中的 js脚本区域中: 它其实就是一个 普通的 html标签, 在 html 渲染器 parser 看来, 它跟其他任何的普通 的 html标签 , 比如 p 标签, ...

  7. HDU 1542 Atlantis(扫描线)题解

    题意:给n个可能相交的矩形,问你不重复的总面积 思路:扫描线,一边扫一边加. 扫描线:图片来源:理解扫描线 假设我们要算以下四个矩形面积,显然中间深色的是重复的.我们按照x的大小,从左往右扫,然后用线 ...

  8. Jenkins学习

    1.jenkins启动卡在密码初始化处不动的情况,参照: https://blog.csdn.net/lylload/article/details/82754101 https://blog.csd ...

  9. PageRank算法实现

    基本原理 在互联网上,如果一个网页被很多其他网页所链接,说明它受到普遍的承认和信赖,那么它的排名就高.这就是PageRank的核心思想. 引用来自<数学之美>的简单例子: 网页Y的排名应该 ...

  10. Xilinx Vivado的使用详细介绍(1):创建工程、编写代码、行为仿真

    Xilinx Vivado的使用详细介绍(1):创建工程.编写代码.行为仿真 Author:zhangxianhe 新建工程 打开Vivado软件,直接在欢迎界面点击Create New Projec ...