`
QING____
  • 浏览: 2251507 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDBC Replication协议

 
阅读更多

一、Connector与Failover协议

 

    Mysql Connector/J支持failover协议:即Client链接失效时,将会尝试与其他host建立链接,这个过程对上层应用是透明的。Failover协议是“Multi-Host”链接模式中最基础的协议,“load balancing”、“replication”、“farbic”协议都基于Failover协议。其URL格式如下:

 

jdbc:mysql://[primary-host]:[port],[secondary-host]:[port],.../[database]?[property=<value>]&[property=<value>]

 

    Host列表中有两种hosts:primary(master)和secondaries(slaves),priamry需要位于hosts列表的第一个;当创建一个新的connection时,driver会首先尝试与primary链接,如果primary链接异常,将会依次与secondaries建立链接直到成功为止;即使与primary的链接失效,但是driver并不会丢失primary的特殊状态:比如它的访问模式、优先级等。

 

    Failover协议支持如下属性:

    1)failOverReadOnly

    2)secondsBeforeRetryMaster

    3)queriesBeforeRetryMaster

    4)retriesAllDown:当所有的hosts都无法连接时重试的最大次数(依次循环重试),默认为120。重试次数达到阈值仍然无法获取有效链接,将会抛出SQLException。

    5)autoReconnect

    6)autoReconnectForPools


    “failOverReadOnly”用于控制connection中“read_only”参数,即当primary链接失效时,failover到secondary时链接的默认访问模式,此值默认为“true”,即与secondary的链接访问模式为“只读”;通常情况下,primary的链接访问模式为“read/write”,即read_only为false。Connector J在failover时可以修改read_only的值,当然application在获取链接后也可以调整此值。无论何时,failover到primary的链接总是“read/write”模式;当Client与primary的链接失效时(可能primary节点并没有失效),如果failOverReadOnly为false,表示与secondary的连接上允许发生“write”操作,这极有可能是危险的,因为slaves上如果被Client写入数据将导致replicaiton集群中的数据不一致,除非slaves节点上已经设定了全局“read_only=true”。

 

    在failover发生后,Driver会定期检测primary的链接状况,如果发现primary的链接恢复正常,那么客户端链接也将会“Fallback”(回落)到primary上,即此后的read/write将在primary链接上发生(与secondary的链接将会保持空闲,或者断开)。“secondsBeforeRetryMaster”表示driver每隔多少秒将重试master的链接,“quriesBeforeRetryMaster”表示执行多少次queries后重试master的链接,如果重试成功,则将会“Fallback”到primary上;可以将上述两个属性设置为“0”来关闭自动Fallback。

 

 

    当primary的链接失效后,触发failover,此时driver将依次与hosts列表中的secondary建立链接,直到与某个Secondary链接成功,否则将所有的secondaries都尝试完毕,然后继续从头开始,直到与其中一个secondary链接成功。如果所有的hosts都无法链接,driver最多重试“retriesAllDown”次(默认为120)。

 

    “autoReconnect”、“autoReconnectForPools”这两个参数用于控制“重连”特性,即当一个session(或者事务)操作过程中,如果链接异常,driver不会抛出Exception而是尝试重新链接并继续执行;如果你的操作是非事务性的(Query或者变更MyISAM表),reconnect通常不会带来问题;但是如果是一个事务操作,在事务中的多个操作过程中发生重连,有可能会对session状态造成破坏,从而导致数据不一致性问题,即使开启“autocommit=false”时仍然不能避免问题,事实上重连之后并不会rollback原来中断的事务,而是继续进行,参见【autoReconnect】。此参数选项将会在未来的版本中被移除,也有可能不同版本的Connector J中实现会有不同,建议开发者禁用此特性。

 

 

    Failover协议,它解决了:当master失效后,Driver能够透明的与其他secondary建立链接,当master恢复后,能够自动的Fallback到primary。对于application而言,可以利用“replication”架构的优势,以提高可用性;MySQL实例的故障或者恢复,不需要调整application代码。

 

    参见源码:FailoverConnectionProxy,它为代理类,即Connection上的所有操作方法均有此proxy代理。

  

二、Connector与Load Balancing(LB)

 

    Failover协议并没有提供“load balancing”特性,即读(写)操作总是只发生在一个host上。对于“replication”、“多Master”架构,我们通常希望“负载均衡”、“读写分离”等高级特性,这就是Load Balancing协议所能解决的。Load Balancing可以将read/write负载,分布在多个MySQL实例上,这些MySQL实例通常为Cluster架构或者Replication架构,本文主要讲解“Replication”架构相关的知识。LB协议基于“Failover协议”,即具备Failover特性,其URL格式:

 

jdbc:mysql:loadbalance://[host]:[port],[host]:[port],...[/database]?[property=<value>]&[property=<value>]

 

    LB协议支持2个配置选项:

 

    1)loadBalanceConnectionGroup:将来自不同资源(hosts)的链接进行分组,通常每个LB协议都需要一个group名字,所有的LB链接都共享一个group名称,特别是当JVM进程上有多个LB Datasource时。

 

    2)loadBalanceEnableJMX:当定义group名称后,可以将管理链接的方式暴露给JMX。此后可以通过JMXBean(LoadBalanceConnectionGroupManagerMBean)相关接口来管理和操作:比如运行时增减hosts列表等。

 

    3)loadBalanceStrategy:负载均衡的策略,默认值为“random”;其支持简写值为“random”、“bestResponseTime”(最小响应时间优先);对于其他负载均衡策略,需要指定类的全名。请参见BalanceStrategry的实现类。

 

    4)loadBalanceBlacklistTimeout:为loadBalanceStrategy服务,如果某个节点请求时返回SQLException,那么此host将会被添加到黑名单中,在此后的timeout时间内下一次选择时将不会再被选中。默认值为0,表示“立即过期”,即每次重新选择连接时都将参与选择(本次选择时加入黑名单后,将不会在本次选择时考虑)。其中内部机制比较简单,在获取新连接时,首先获取并检查黑名单列表,此时会检测timeout时间是否过期,如果过期将从黑名单列表中移除,并允许此host参与本次选择。(参见LoadBalanceConnectionProxy.getGlobalBlacklist()) 

 

    LB协议允许在运行时增减hosts,这对二次开发的人来说非常有用,本文将不再赘言。

 

    driver创建的LoadBalancedConnection是一个逻辑链接,其内部持有一个物理链接列表,即与每个host建立一个Connection。1)当autocommit为false时,在事务的边界方法执行后,比如commit、rollback,将会触发BalanceStrategy从host列表中重新选择新的链接。2)当链接上发生Exception时,比如socket异常,将会导致重新选择链接。3)当autocommit为true时,当链接上执行“loadBalanceAutoCommitStatementThreshold”个statements后(Queries或者updates等),将会导致重新选择链接,默认为0表示“粘性链接,不重新选择链接”。(这是负载均衡的一种补偿措施)

 

    选择链接的方式参见LoadBalancedConnectionProxy.pickConnection()。(以及其invokeMore()方法,注意本文中提到的*ConnectionProxy类均为代理类,JAVA动态代理,代理对应的*Connection方法)

   参见源码:LoadBalancedConnectionProxy,BalanceStrategy,LoadBalancedConnection

 

Driver driver = new NonRegisteringDriver();
Properties properties = new Properties();
properties.put("user",USER);
properties.put("password",PASSWORD);
properties.put("loadBalanceAutoCommitStatementThreshold","2");
Connection connection = driver.connect("jdbc:mysql:loadbalance://127.0.0.1:3306,127.0.0.1:4306,127.0.0.1:5306/mydb", properties);
ResultSet resultSet = connection.createStatement().executeQuery("SELECT * FROM test where id = 1");
while (resultSet.next()) {
    Date created = resultSet.getDate(2);
    System.out.println(DateFormatUtils.format(created, "yyyy-MM-dd HH:mm:ss"));
}
resultSet.close();
connection.close();//将导致LoadBalancedConnection中所有的连接关闭

 

    LoadBalancedConnectionProxy为代理类,Connection上的所有方法操作均其代理,因此它可以在执行方法时选择“内部的物理链接”执行,达到LB的效果。

 

三、Connector与Replication

 

    Replication是MySQL最常见、最有效的架构模式之一,Replication协议基于Failover与LB,只适用与replicaiton架构,主要用于解决replication架构下“读写分流”、“负载均衡”等问题。其URL格式为:

 

jdbc:mysql:replication://[master-host]:[port],[slave-host]:[port],.../database?[property=<value>]

 

    在5.127版本之后,relplication协议也支持了多master模式,此时协议样例为:

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

 

    Replication协议主要参数:

     1、“allowMasterDownConnections=true”属性表示当master失效时可以继续创建其Connections对象,但是Connection的访问模式为“read_only=true”,当master有效后会调用Connection.setReadOnly(false)方法修改其访问模式,在此之前如果通过Connection提交writes操作将会抛出异常,此属性默认值为false。“allowSlavesDownConnections=true”表示当所有的slaves都失效时是否也能创建相应的Connections对象,访问模式也是“read_only=true”,此链接有效之前如果通过Connection发送read操作将会抛出异常,此属性默认值为false。“readFromMasterNoSlaves”表示如果所有的slaves都不可用,read操作将在master连接上发生,此属性默认值为false。

 

    2、“readFromMasterWhenNoSlaves”表示当所有的slaves都失效(异常)时,是否允许将read请求转发给master。默认为false,建议设置为true。

 

 

    在replication模式下,默认slaves的负载均衡的策略与LoadBalance协议保持一致,而且由Connection.getReadOnly()值决定;如果read_only为true,Replication Connection将使用“随机”模式选择一个slave链接,如果所有的slaves都失效,此时将使用master链接(由readFromMasterNoSlaves参数控制)。如果你需要提交write请求或者read实时数据,那么需要将read_only=false,那么read/write操作将在master链接上发生。master链接上除了可以接受read_only外,还可以指定autocommit和事务隔离级别。

 

 

    还有一个比较重要的参数“replicationConnectionGroup”,我们为一组master-slaves指定唯一的group名称,此后即可通过“ReplicationConnectionGroupManager”来跟踪链接以及动态管理hosts列表,即允许开发者在运行时动态调整hosts拓扑结构。(比如addSlaveHost,promoteSlaveToMaster等等)。

 

    ReplicationDrvier创建的Connection类型为ReplicationConnection,ReplicationConnection也由ReplicationConnectionProxy代理执行;每个ReplicationConnection对应一个proxy实例,每个proxy内部都持有一个masterConnection和类型为LoadBalancedConnection的slavesConnection,因此slaves链接具备LB特性。如果read_only为false,那么在执行操作方法时,proxy将选择masterConnection;否则将从slavesConnections中选择一个。每个ReplicationConnection均会与所有的host建立一个物理链接,这一点需要清楚,这会导致每个MySQL实例(master、slave节点)都持有相同的连接数。

    参见源码:ReplicationConnection,ReplicationDriver,ReplicationConnectionProxy。

 

ReplicationDriver driver = new ReplicationDriver();
Properties properties = new Properties();
properties.put("user",USER);
properties.put("password",PASSWORD);
Connection connection = driver.connect("jdbc:mysql:replication://127.0.0.1:3306,127.0.0.1:4306,127.0.0.1:5306/mydb", properties);
connection.setAutoCommit(true);
connection.setReadOnly(true);
ResultSet resultSet = connection.createStatement().executeQuery("SELECT * FROM test where id = 1");
while (resultSet.next()) {
    Date created = resultSet.getDate(2);
    System.out.println(DateFormatUtils.format(created,"yyyy-MM-dd HH:mm:ss"));
}
resultSet.close();
connection.close();

 

四、Connector J问题小结

    1、选择合适的Driver:对于Failover和LB协议,可以选用NonRegisterDriver;对于replication协议,我们需要使用ReplicationDriver。对于单点host,普通的Driver类即可。

    2、为了便于跟踪replication模式下,LB协议是否生效或者query在哪个节点执行,我们可以开启“general_log”功能:

>SET GLOBAL general_log=1;
>select @@global.general_log;

 

    3、autoReconnect属性建议禁用,因为在事务操作中,如果链接重连并不会导致事务回滚而是继续执行,这会带来事务完整性的问题,导致数据不一致。具体原理参见【autoReconnect】

 

参考文档:

1、https://dev.mysql.com/doc/connector-j/en/connector-j-usagenotes-troubleshooting.html

2、https://dev.mysql.com/doc/connector-j/en/connector-j-multi-host-connections.html

3、https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html

分享到:
评论

相关推荐

    mysql8.0 JDBC驱动

    4. **加密增强**:数据库中的数据安全得到加强,支持TLS 1.2协议,提高了数据传输的安全性,并且支持透明数据加密(TDE)以保护静态数据。 5. **更好的复制功能**:MySQL 8.0改进了复制机制,包括半同步复制、GTID...

    dbproxy使用限制1

    - **URL中的多个地址配置**: 如loadbalance、failover、replication等不被支持。 - **allowMultiQueries=true**: 这个参数用于允许一次执行多条SQL语句,在`dbproxy`中是不可用的。 - **SSL协议和压缩协议**: `...

    HP-Unix 安装Sybase

    Sybase公司拥有多项技术专利,比如Adaptive Component Architecture、Adaptive Server Enterprise Monitor、Adaptive Server Enterprise Replication等,这些都为Sybase数据库产品的稳定性和可靠性提供了保障。...

    EAserver程序员指南

    - **许可协议**: 软件通过特定的许可协议提供,使用时需遵守协议条款。 #### 九、获取更多信息 - **联系方式**: 提供了美国和加拿大客户的联系方式,以及其他国际客户的获取途径。 - **升级文档**: 只在软件定期...

    Oracle精简客户端驱动

    Oracle 9i是Oracle数据库的第9个主要版本,发布于2001年,引入了许多新特性,如自动存储管理(Automatic Storage Management, ASM)、流复制(Stream Replication)以及数据仓库优化等。尽管现在可能已经有更先进的...

    elasticsearch7.17.10-最新支持Java1.8版本

    每个节点都可以存储、搜索和路由数据,通过Sharding和Replication确保数据的安全和性能。 2. **倒排索引**:Elasticsearch使用倒排索引机制进行快速的全文搜索,将每个词项指向包含该词的文档集合,而不是将每个...

    MySQL高可用的最佳应用与实践.docx

    VIP漂移是基于HA同步软件,如MHA(Master High Availability)和MMM(Master-Master Replication Manager for MySQL),它们监控MySQL状态并在主节点故障时自动切换VIP。API调用方式则更灵活,允许应用程序直接控制...

    OceanBase 数据库大赛初赛赛题.zip

    1. **分布式数据库基础**:理解分布式数据库的基本概念,如分片(Sharding)、副本(Replication)、分布式事务处理等,以及它们在OceanBase中的实现方式。 2. **OceanBase架构**:学习OceanBase的三副本一致性模型...

    Sybase Adaptive Server Enterprise 12.0 实用程序(UNIX平台)-210

    其次,ASE 12.0提供了丰富的客户端库和连接选项,如Open Client、Open Server以及多种连接协议(如DB-Library、ODBC和JDBC的jConnect)。这些库和接口允许应用程序无缝地与数据库进行交互,无论它们是在同一服务器上...

    informix入门指南v9.4

    1. **Informix架构**:了解Informix的基本架构是学习的基础,包括服务器进程、客户进程、数据存储结构(如表空间、日志文件等)以及网络通信协议。 2. **安装与配置**:包括如何在不同的操作系统平台上安装Informix...

    DB2 v9安装步骤图

    - **JDBC Support**:Java Database Connectivity支持,用于Java应用程序连接数据库。 - **SDK for Java**:软件开发工具包,包含Java开发所需的库和工具。 - **Sample databases**和**ADT sample programs**:...

    oracle 9i dsi

    3. **数据服务**:通过Web服务接口,DSI允许开发人员创建和发布数据库操作作为Web服务,使得其他应用程序可以通过标准的SOAP协议调用这些服务,实现数据的远程访问和共享。 4. **安全管理**:Oracle 9i DSI强化了...

    mysqld_exporter-0.10.0.linux-amd64.tar.gz

    - mysqld_exporter通过JDBC或者MySQL的管理协议与MySQL服务器建立连接。 - 执行预设的SQL查询,获取性能数据。 - 将数据转化为Prometheus的指标格式,暴露在指定的HTTP端口上。 二、mysqld_exporter的安装与配置...

    sybase大全

    3. **网络通信**:Sybase使用ASE(Adaptive Server Enterprise)协议进行网络通信,同时支持TCP/IP、 Named Pipes等多种通信协议。 4. **数据库复制**:Sybase的Replication Server技术可以实现数据库的实时同步,...

    sybase中文资料-四部分

    其核心组件包括:数据库引擎、客户端工具、网络通信协议和存储过程语言等。数据库引擎负责数据的存储、管理和检索,客户端工具则为用户提供交互式查询、数据管理等功能。 二、安装与配置 在安装Sybase时,需考虑...

    ORACLE DB数据库常见问题解决及诊断技巧集锦-ORACLE DBA故障修复必备手册

    #### 复制问题(Replication) 在进行数据复制时遇到的问题,可能涉及多个方面,如配置错误、数据类型不匹配等。解决方法包括: 1. **检查复制配置**:确保复制配置正确无误。 2. **优化数据类型转换**:确保源数据...

Global site tag (gtag.js) - Google Analytics