Mysql-JDBC配置Replication协议

2023-11-19

这部分描述了Mysql-JDBC对于replication协议的一系列特性的支持。
mysql-jdbc-replication初始化于创建连接URL阶段,和通常的jdbc URL类似,但也有些特殊性:

jdbc:mysql:replication://[master host][:port],[slave host 1][:port][,[slave host 2][:port]]...[/[database]] »
[?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]

用户需要指定allowMasterDownConnections=true 来允许即便没有主库,也能创建连接对象。这些连接对象是只读的,调用 isMasterConnection()将返回false,这些连接当Connection.setReadOnly(false)被调用时,会测试主节点的可用性,如果到主节点不可用,将抛出一个SQLException,如果可用,则会在主节点执行操作。
对于mysql-jdbc 5.1.38 和更久之后,用户需要具体指定allowSlavesDownConnections=true,来允许即便没有从库,也能创建连接对象。一个连接,那时候,在运行时,在Connection.setReadOnly(true)时,将测试连接的可用性,如果到从节点不可达(包括readFromMasterWhenNoSlaves=true时,主节点也不可达),将抛出SQLException。

通过分发读请求到从节点来实现负载均衡

mysql-jdbc 3.1.7和更高的版本,包括一系列的驱动来分发请求到读/写节点,提供failover的保障,和基于Connection.getReadOnly()实现的从节点负载均衡。
一个应用如果想通过Connection.setReadOnly(true)开启一个只读事务,驱动知道了应用要使用其中一个从节点,会随机取一个。在一个事务中,所有操作会附着在一个连接上,知道这个事务提交或者回滚,或这个从节点被服务移除。在mysql-jdbc 5.1.38和更久之后,在调用Connection.setReadOnly(true),如果没有从库可用时,你想让连接打到主节点那么你需要设置readFromMasterWhenNoSlaves=true。
如果你有一个写事务,或者你有个读请求是时间敏感的(binlog同步有延迟),通过设置Connection.setReadOnly(false),驱动将会保证你的请求会到主库。驱动负责维护事务的传播等级,隔离级别,以及连接之间的关系和列表。
为了确保这个功能,在创建连接池,或者为单体应用创建JDBC连接时,请使用com.mysql.jdbc.ReplicationDriver 这个驱动,他也接受Mysql-JDBC的标准驱动,ReplicationDriver目前不能和基于java.sql.DriverManager创建的连接一起工作,除非是Mysql-JDBC官方的驱动注册到DriverManager。
这里有个ReplicationDriver的例子:

import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Properties;

import com.mysql.jdbc.ReplicationDriver;

public class ReplicationDriverDemo {

  public static void main(String[] args) throws Exception {
    ReplicationDriver driver = new ReplicationDriver();

    Properties props = new Properties();

    // We want this for failover on the slaves
    props.put("autoReconnect", "true");

    // We want to load balance between the slaves
    props.put("roundRobinLoadBalance", "true");

    props.put("user", "foo");
    props.put("password", "password");

    //
    // Looks like a normal MySQL JDBC url, with a
    // comma-separated list of hosts, the first
    // being the 'master', the rest being any number
    // of slaves that the driver will load balance against
    //

    Connection conn =
        driver.connect("jdbc:mysql:replication://master,slave1,slave2,slave3/test",
            props);

    //
    // Perform read/write work on the master
    // by setting the read-only flag to "false"
    //

    conn.setReadOnly(false);
    conn.setAutoCommit(false);
    conn.createStatement().executeUpdate("UPDATE some_table ....");
    conn.commit();

    //
    // Now, do a query from a slave, the driver automatically picks one
    // from the list
    //

    conn.setReadOnly(true);

    ResultSet rs =
      conn.createStatement().executeQuery("SELECT a,b FROM alt_table");

     .......
  }
}

可以考虑使用loadBalance JDBC连接池工具–lbpool:它在标准jdbc-driver的包装器,包括失败检查,和负载分发,关于更多的信息,请关注:https://code.google.com/archive/p/mysql-lbpool/

对于多主形式的支持

在mysql-jdbc 5.1.27后,开始支持多主replication驱动
连接模式如下:

jdbc:mysql:replication://address=(type=master)(host=master1host),address=(type=master)(host=master2host),address=(type=slave)(host=slave1host)/database

Connector/J本质上使用了loadBalance来管理多主连接,这意味着,ReplicationConnection在配置使用多主时,暴露相同的选项来平衡主节点的负载。详情:https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-usagenotes-j2ee-concepts-managing-load-balanced-connections.html

Replication的实时重构

自动mysql-jdbc 5.1.28后,提供了replication实时重构的功能,用户可以在不停用java应用时,动态的添加,删除节点。
replication主机连接在replication连接组下管理最有效,一个replication连接组,代表了被统一管理的一个逻辑组,在一个java应用,可能有一个或多个replication连接组,主类暴露出管理replication连接内主机的方法,replication对象注册在自己的连接组内。每个连接组追踪自己的连接,直至关闭,并且操作这些关联的主机。
有一些重要的管理主机的方法:

  • getMasterHosts()
  • getSlaveHosts()
  • addSlaveHost(String host)
  • promoteSlaveToMaster(String host)
  • removeSlaveHost(String host, boolean closeGently)
  • removeMasterHost(String host, boolean closeGently)

有些有用的管理方法如下:

  • getConnectionCountWithHostAsSlave(String host)
  • getConnectionCountWithHostAsMaster(String host)
  • getNumberOfSlavesAdded() --返回动态添加的从节点数量
  • getNumberOfSlavesRemoved() --返回动态删除的节点数量
  • getNumberOfSlavePromotions() --动态升主次数
  • getTotalConnectionCount() --注册在这个组内的replication连接数
  • getActiveConnectionCount() --正在被组内管理的replication连接数

Replication连接组管理器

com.mysql.jdbc.ReplicationConnectionGroupManager 提供了接入replication连接组的方法,和其他一些方法

  • getConnectionGroup(String groupName) --根据组名返回组对象
    在ReplicationConnectionGroupManager中的其他方法,反应了ReplicationConnectionGroup,除了第一次声明为String类型的组名的组。(什么鬼。。。)这些方法将会操作所有匹配的replication组,对移除应用中的组有用。
    如果应用触发了Replication模式的改变,这些方法对于JVM管理Replication主机也许会有用,对于JVM外管理主机配置,JMX也许会有用

使用JMX管理Replication主机

当Connector/J以replicationEnableJMX=true开头,而且设置了replicationConnectionGroup属性,JMX的MBean将会被注册,允许通过JMX客户端操作Replication主机,MBean的接口定义在com.mysql.jdbc.jmx.ReplicationGroupManagerMBean并且促使ReplicationConnectionGroupManager改变静态方法。

public abstract void addSlaveHost(String groupFilter, String host) throws SQLException;
 public abstract void removeSlaveHost(String groupFilter, String host) throws SQLException;
 public abstract void promoteSlaveToMaster(String groupFilter, String host) throws SQLException;
 public abstract void removeMasterHost(String groupFilter, String host) throws SQLException;
 public abstract String getMasterHostsList(String group);
 public abstract String getSlaveHostsList(String group);
 public abstract String getRegisteredConnectionGroups();
 public abstract int getActiveMasterHostCount(String group);
 public abstract int getActiveSlaveHostCount(String group);
 public abstract int getSlavePromotionCount(String group);
 public abstract long getTotalLogicalConnectionCount(String group);
 public abstract long getActiveLogicalConnectionCount(String group);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql-JDBC配置Replication协议 的相关文章

  • 朗润国际期货技术分析——日内交易图表类型

    一张图表胜过千言万语 你以前听说过这句话 对吗 在日内交易员的世界里 一张图表往往比千言万语更有价值 它不仅告诉我们过去发生了什么 而且告诉我们一个市场在未来可能会做什么 它将继续走高还是走低 它是否处于一个区间 也许一个重大的方向变化或反
  • 2D/3D人体姿态估计 (2D/3D Human Pose Estimation)

    1 基本概念 算法改进入口 网络设计 特征流 损失函数 数据集的重要性 只要有一个好的 针对性的数据集 问题都可以解决 过集成新一代AutoML技术 可降低算法试错成本 人体姿态估计 Human Pose Estimation 是指图像或视
  • 在C语言中,“>>=”;“<<=”;“&=”;“

    C语言中 gt gt 的意思是 右移后赋值 示例 x 8 1000 x gt gt 3 结果为 0001 C语言中 lt lt 的意思是 左移后赋值 示例 x 1 0001 x lt lt 3 结果为 1000 C语言中 的意思是 按位与后
  • pycharm 代码上传到gitee仓库里

    目录 一 准备 二 1 新建仓库 2 commit和push 一 准备 1 在pycharm中安装插件 github git 2 在本地安装git 二 1 新建仓库 首先在pycharm中打开自己的本地项目 如果没有配置过 主界面应该是这样
  • 2023年数学建模B组:利用AHP层次分析法解决实际问题(Matlab)

    目录 利用AHP层次分析法解决实际问题 Matlab实现 介绍 案例背景 步骤1 建立层次结构模型
  • Flutter酷炫的路由动画效果

    现在Flutter的路由效果已经非常不错了 能满足大部分App的需求 但是谁不希望自己的App更酷更炫那 下面介绍几个酷炫的路由动画 其实路由动画的原理很简单 就是重写并继承PageRouterBuilder这个类里的transitions
  • 详解JS前端异步文件加载篇之Async与Defer区别

    目录 同步 异步及推迟的概念 async和defer解决文件加载阻塞问题 在了解async和defer的区别之前 我们需要先了解同步 异步和推迟的概念 同步 异步及推迟的概念 假如现在有一条非常狭隘的胡同 里面有两个人挨着走 那么现在请问后
  • Java集合的两种遍历方式

    Java集合共有两种遍历方式 增强for循环 foreach 迭代器 Main方法 public static void main String args 创建集合 Collection collection new ArrayList 添
  • XXL-JOB分布式任务调度平台配置详解

    XXL JOB是一个分布式任务调度平台 其核心设计目标是开发迅速 学习简单 轻量级 易扩展 个人建议 对于需要定时调度任务开箱即用的小伙伴来说 完全可以学习参考下 本文主要介绍了Xxl Job分布式任务调度框架的配置信息详解 以及路由策略
  • git clone下新项目后运行报错‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

    报错 vue cli service 不是内部或外部命令 也不是可运行的程序 或批处理文件 因为项目里还没有node modules这个包 需要运行npm install 运行后没有报错但是有个警告 npm WARN read shrink
  • MySQL导入导出数据mysqldump,mysql,select into file,load data

    研发人员往往需要从数据库中导出数据 或者将数据导入到数据库中 一些客户端工具提供了简单方便的功能 可以让他们不用使用命令进行操作 但是客户端工具可能会受到环境的限制而不能使用 所以 研发人员有必要掌握一些常用的命令来进行操作数据 MySQL
  • 残差神经网络的研究

    目录 一 ResNet残差神经网络 1 1 提出 1 2 作用 1 3 应用场景 1 4 残差单元的结构 1 4 1 残差网络得名的原因 1 4 2 残差网络可以有效缓解退化现象的原因 1 4 3 数学原理 二 附录 2 1 残差神经网络可
  • GD32F303调试小记(一)之USART(接收中断、接收空闲中断+DMA、发送DMA)

    前言 之前写了GD32F103调试小记 二 之USART 接收中断 接收空闲中断 DMA 发送DMA 一文 这次我们来看看GD32F303的USART是如何配置的 结合这两篇文章 相信大家GD32的USART配置流程会十分熟悉 DMA 能大
  • SpringBoot项目实战,附源码

    SpringBoot2 0笔记 一 SpringBoot基本操作 环境搭建及项目创建 有demo 二 SpringBoot基本操作 使用IDEA打war包发布及测试 三 SpringBoot基本操作 SpringBoot整合SpringDa
  • 逆向爬虫09 协程 & 异步编程(asyncio)

    逆向爬虫09 协程 异步编程 asyncio 1 什么是协程 What 协程 Coroutine 也可以被称为微线程 是一种用户态内的上下文切换技术 简而言之 其实就是通过一个线程实现代码块相互切换执行 def func1 print 1
  • Unity 拖尾(Trail Renderer)效果的实现

    1 新建场景 创建一个球 在球上添加组件Trail Renderer 2 在Trail Renderer组件设置Time为0 5 Materials材质 3 Width下点击右键 Add key 添加控制点 起始宽度为1 0 结束宽度为0
  • Nginx配置https网站

    1 什么是https https超文本传输安全协议是http ssl安全套接层和tls传输层安全的组合 用于提供加密通信和鉴定网络服务器的身份 网上的支付交易 个人隐私和企业中的敏感信息等越来越受到人们的关注和保护 因此https目前已经是
  • ICCV 2021: AdaAttN: Revisit Attention Mechanism in Arbitrary Neural Style Transfer 阅读笔记

    ICCV 2021 AdaAttN Revisit Attention Mechanism in Arbitrary Neural Style Transfer 论文 https arxiv org pdf 2108 03647 pdf 代
  • app上架流程的整理

    app的上架流程 一 准备工作 首先需要有开发者账号 企业级的账号是299 个人开发者账号是99 没有的话可以登录http developer apple com 自行申请 假如你已经有账号了 进入苹果官网点击Accout登录 二 申请证书
  • Android课设——理财小助手

    一 app介绍 理财小助手是一款利用Android studio软件实现的APP 可以录入每天的消费项目以及消费金额 同时也可以查找消费记录 统计消费总额 我用到的Android studio版本如下 二 模块设计 下面是我实现的一些模块

随机推荐

  • iOS Sqlite数据库增删改查基本操作

    Sqlite是ios上最常用的数据库之一 大家还是有必要了解一下的 实现效果如图 先来看看数据库方法类 将各个操作都封装在一个类里面 达到代码重用的目的 这是程序员都应该努力去实现的目标 这样在下一次用到同样的方法和类的时候 就可以直接使用
  • 推荐几款实用的Android Studio 插件

    http www jcodecraeer com a anzhuokaifa Android Studio 2015 1009 3557 html
  • 【Python小游戏】当当当当 万众瞩目得《滑雪大冒险》来啦~(附源码)

    前文 大家好 我是梨子同学 希望大家多多支持我 哈哈 为了感谢每一个关注我的小可爱 每篇文章的项目源码都是无偿分享滴 见文末 很多csdn的功能还在研究中 还有小编的文笔不好勿怪 会慢慢进步跟大家一起学习的 小编也一直在学习编程 如果代码小
  • javaweb——Response下载文件

    HttpServletResponse web服务器接收到客户端的http请求 针对这个请求分别创建一个代表请求的HttpServletResponse对象 一个代表响应的HttpServletResponse对象 如果要获取客户端请求过来
  • 查看Linux内存cpu使用情况,某一应用内存占用大小

    查看Linux内存 cpu使用情况排序 某一应用内存占用大小 virt res shr data的意义 1 知识点 1 top命令使用 2 如何查看某一应用内存占用大小 3 回收buff cache 1 使用 1 使用top查看cpu 内存
  • java中对象克隆的基本应用

    为什么需要克隆对象 直接new一个对象不行吗 答案是 克隆的对象可以直接使用已经有的属性值 而new出来的对象的属性都还是初始化时候的值 所以当需要一个新的对象来保存当前对象的 状态 就靠clone方法了 那么我把这个对象的临时属性一个一个
  • 行政如何借助ChatGPT提高效率

    文章目录 ChatGPT的优势与局限 行政人员的核心价值 行政人员应对策略 借助ChatGPT提高效率 结论 创作者 全栈弄潮儿 个人主页 全栈弄潮儿的个人主页 个人社区 欢迎你的加入 全栈弄潮儿的个人社区 专栏地址 AI大模型 随着人工智
  • c++ goto语句

    goto语句又称无条件跳转语句 用于改变语句执行顺序 goto语句的一般格式为 goto label 其他语句 label statement label是用户可定义的一个标识符 以冒号结束 例如 include
  • 考公考研热度上升、是增加就业筹码or恐惧就业?

    现在 金三银四 的春招季已经逐渐告一段落 先不从本次职场招聘看 从考公考研来看 很大部分应届毕业生选择去考公务员和研究生 据统计今年457万考研大军比去年的377万整整多了80万人 今年也是最近几年考研人数增长最快的 今年考研大军达457万
  • Python学习-----起步4(列表元素的添加,删除,修改,查询,获取长度)

    目录 前言 列表元素的添加 或者叫写入 1 append 函数 2 extend 函数 3 insert 函数 列表元素的删除 1 remove 函数 2 pop 函数 3 clear 函数 4 del 方法 这个不是函数哦 列表元素的修改
  • layui会议OA项目数据表格新增改查

    文章目录 前言 一 后台代码编写 1 1 数据表优化 1 2 R工具类 1 3 UserDao新增改查 1 4 Servlet的编写 二 前台页面的编写 2 1 userManege jsp 2 2 userManage js 2 3 新增
  • 【ViT(Vision Transformer)】(二) 阅读笔记

    简介 ViT是2020年Google团队提出的将Transformer应用在图像分类的模型 虽然不是第一篇将transformer应用在视觉任务的论文 但是因为其模型 简单 且效果好 可扩展性强 scalable 模型越大效果越好 成为了t
  • php请求api接口获取公众号基本信息,使用appid,appsecret获取微信公众号基本信息

    使用access token微信公众平台提供的 获取公众号基本信息 接口 来获取公众号的基本信息 首先通过appID和appsecret获取access token 然后使用access token调用获取公众号基本信息的API
  • ADPCM WAVE文件的压缩与解压缩

    一 WAVE文件 WAVE文件是计算机领域最常用的数字化声音文件格式之一 它是微软专门为Windows系统定义的波形文件格式 Waveform Audio 由于其扩展名为 wav 最基本的WAVE文件是PCM 脉冲编码调制 格式的 这种文件
  • ch01-核心概念 (进阶)

    文章目录 常量 特殊值 空值 无穷 数据类型 类型 大小 顺序 结构化数组 时间数组 数组对象 ndarray array 自定义数组容器 子类化与标准子类 小结 参考 安装watermark pip install watermark l
  • 解决数据库高并发访问瓶颈问题

    一 缓存式的Web应用程序架构 在Web层和db层之间加一层cache层 主要目的 减少数据库读取负担 提高数据读取速度 cache存取的媒介是内存 可以考虑采用分布式的cache层 这样更容易破除内存容量的限制 同时增加了灵活性 二 实现
  • linux创建套接字文件类型,Linux日记---0X03文件类型

    文件类型 文件 文件是文件系统中存储数据的一个命名对象 文件是linux系统处理信息的基本单元 一个文件可以空文件 但空文件仍然为操作系统提供了其他信息 文件组成了linux的一切 linux将数据库文件 游戏文件或者字处理文件都仅仅看做一
  • [学习笔记]Matlab(持续更新)

    文章目录 一 Matlab知识学习 1 输入输出语句 注意 Matlab中disp fprintf及sprintf三者之间的区别 2 exist函数的使用 3 matlab中的注释 4 几种常用的清除命令 5 MAT文件如何操作 6 dir
  • 期货投资如何能少犯错

    无论投资者进行哪种投资 肯定或多或少都会犯错误 毕竟没有谁能保证自己一定不会犯错误 但投资者应该尽量让自己少犯错误 并把这点作为自己追求的目标 投资者如果想要少犯错误 就要尊重市场 不做违背市场规则的操作 其实很多投资者都知道这点 但是当自
  • Mysql-JDBC配置Replication协议

    这部分描述了Mysql JDBC对于replication协议的一系列特性的支持 mysql jdbc replication初始化于创建连接URL阶段 和通常的jdbc URL类似 但也有些特殊性 jdbc mysql replicati