10bet网址
连接器和api手册
下载本手册

3.8.4配置Connector/J类型的源复制

本节描述Connector/J对复制感知部署支持的许多特性。

复制是在服务器连接的初始设置阶段通过连接URL配置的,其格式与用于MySQL连接的通用JDBC URL,而是一个专门的方案:

jdbc: mysql:复制:/ /源主机] [:港口]、[复制主机1] [:港口] [[复制主机2] [:港口]]……[/数据库]] [?]propertyName1propertyValue1[&propertyName2propertyValue2]…]

用户可以指定属性allowSourceDownConnections = true允许连接即使无法访问源主机,也要创建对象。这样的连接对象报告它们是只读的,并且isSourceConnection ()为它们返回false。的连接测试可用源主机时Connection.setReadOnly(假)如果无法建立到源的连接,则抛出SQLException,如果主机可用,则切换到源连接。

用户可以指定属性allowReplicasDownConnections = true允许连接即使没有副本主机可访问,也要创建对象。一个连接然后,在运行时测试可用的副本主机,当Connection.setReadOnly(真正的)如果不能建立到副本的连接,则抛出SQLException,除非属性readFromSourceWhenNoReplicas被设定为真正的(请参见下面的属性描述)。

通过将读流量分配到副本来扩展读负载

Connector/J支持支持复制的连接。的状态,它可以自动向读/写源主机或故障转移或轮询负载均衡副本集发送查询Connection.getReadOnly ()

应用程序通过调用表示希望事务为只读Connection.setReadOnly(真正的).可识别复制的连接将使用其中一个复制连接,该连接使用轮询方案对每个复制主机进行负载平衡。在事务边界命令(提交或回滚)发出之前,或在副本从服务中删除之前,给定的连接始终粘在副本上。后调用Connection.setReadOnly(真正的),如果您希望在没有副本可用时允许连接到源,请设置此属性readFromSourceWhenNoReplicas真实的。注意,在这些情况下,源主机将以只读状态使用,就像它是一个副本主机一样。还要注意这个设置readFromSourceWhenNoReplicas = true可能会以透明的方式导致源主机的额外负载。

如果你有一个写事务,或者你有一个时间敏感的读事务(记住,MySQL中的复制是异步的),通过调用将连接设置为非只读Connection.setReadOnly(假)驱动程序将确保进一步的调用被发送到源MySQL服务器。驱动程序负责在用于完成此负载平衡功能的所有连接之间传播自动提交、隔离级别和目录的当前状态。

要启用此功能,请使用专门的复制方案(jdbc: mysql:复制:/ /)连接到服务器。

下面是一个简短的例子,说明如何在一个独立的应用程序中使用复制感知连接:

进口java.sql.Connection;进口java.sql.ResultSet;进口java.util.Properties;进口java.sql.DriverManager;public class ReplicationDemo {public static void main(String[] args)抛出异常{Properties props = new Properties();//我们希望在replicas props上进行故障转移。把(“autoReconnect”,“真正的”);//我们想要在副本道具之间实现负载平衡。把(“roundRobinLoadBalance”,“真正的”);道具。把(“用户”、“foo”);道具。put("password", "密码”);// //看起来像一个普通的MySQL JDBC url,有一个//逗号分隔的主机列表,第一个//是“源”,其余的是任意数量的副本,驱动程序将负载平衡// Connection conn = DriverManager。getConnection (" jdbc: mysql:复制:/ /源,replica1, replica2, replica3 /测试”,道具);// //通过将只读标志设置为"false" // conn.setReadOnly(false)在源//上执行读写工作;conn.setAutoCommit(假);conn.createStatement()。executeUpdate("UPDATE some_table ....");conn.commit ();// //现在,从一个副本中进行查询,驱动程序自动从列表中选择一个// // conn.setReadOnly(true);ResultSet rs = conn.createStatement()。executeQuery("SELECT a,b FROM alt_table"); ....... } }

考虑使用负载均衡JDBC池(lbpool)工具,它提供了标准JDBC驱动程序的包装,并允许您使用DB连接池,其中包括检查系统故障和负载分布不均。有关更多信息,请参见负载均衡JDBC驱动程序(MySQL -lbpool)

支持多源复制拓扑

Connector/J支持多源复制拓扑。

前面讨论的用于复制的连接URL(即,格式为jdbc: mysql:复制:/ /源,replica1, replica2 replica3 /测试)假设第一个(且只有第一个)主机是源主机。支持使用任意数量的源和副本的部署,需要在中讨论的多主机连接使用“地址等于”URL语法第3.5.2节,“连接URL语法”,以财产类型=(来源|副本);例如:

jdbc: mysql:复制:/ /地址= =源(类型)(主机= source1host),地址= (type =源)(主机= source2host),地址= (type =副本)(主机= replica1host) /数据库

Connector/J在内部使用负载平衡连接来管理源连接,这意味着ReplicationConnection,当配置为使用多个源时,会公开相同的选项以在多个源主机之间平衡负载,如第3.8.3节,“使用连接器/J配置负载均衡”

复制地形的实时重构

Connector/J还支持对复制主机(单源或多源)拓扑结构的实时管理。这使得用户可以提升Java应用程序的副本,而不需要重新启动应用程序。

复制主机在复制连接组的上下文中得到最有效的管理。ReplicationConnectionGroup类表示可以一起管理的连接的逻辑分组。在给定的Java类装入器中可能有一个或多个这样的复制连接组(可能有两个不同的JDBC资源需要独立管理的应用程序)。这个密钥类公开用于复制连接的主机管理方法ReplicationConnection对象将自己注册到相应的ReplicationConnectionGroup若值为新replicationConnectionGroup属性已指定。的ReplicationConnectionGroup对象跟踪这些连接,直到它们被关闭,并用于操作与这些连接关联的主机。

主机管理的一些重要方法包括:

  • getSourceHosts ():返回一个字符串集合,表示配置为源主机的主机

  • getReplicaHosts ():返回表示配置为复制主机的主机的字符串集合

  • addReplicaHost (String主机):将新主机添加到可能的副本主机池中,以便在新的只读工作负载开始时进行选择

  • promoteReplicaToSource (String主机):将该主机从潜在复制主机池中移除(允许现有只读进程继续完成),并将该主机加入潜在源主机池

  • removeReplicaHost(String host, boolean closeGently):从已配置的复制主机列表中移除主机(主机名匹配必须准确);如果closeGently为false,当前激活该主机的现有连接几乎不会被关闭(应用程序应该会出现异常)

  • removeSourceHost(String host, boolean closeGently):同removeReplicaHost (),但将该主机从配置的源主机列表中移除

一些有用的管理指标包括:

  • getConnectionCountWithHostAsReplica (String主机):返回将指定主机配置为可能的复制主机的ReplicationConnection对象的数量

  • getConnectionCountWithHostAsSource (String主机):返回将指定主机配置为可能源主机的ReplicationConnection对象的数量

  • getNumberOfReplicasAdded ():返回复制主机被动态添加到组池的次数

  • getNumberOfReplicasRemoved ():返回从组池中动态移除副本主机的次数

  • getNumberOfReplicaPromotions ():返回副本主机升级为源主机的次数

  • getTotalConnectionCount ():返回已经注册到这个组的ReplicationConnection对象的个数

  • getActiveConnectionCount ():返回当前由这个组管理的ReplicationConnection对象的个数

ReplicationConnectionGroupManager

com.mysql.cj.jdbc.ha.ReplicationConnectionGroupManager提供对复制连接组的访问以及一些实用程序方法。

  • groupName getConnectionGroup(字符串):返回ReplicationConnectionGroup匹配groupName的对象

其他的方法ReplicationConnectionGroupManager镜像ReplicationConnectionGroup,除了第一个参数是String组名。这些方法将对所有匹配的replicationconnectiongroup进行操作,这有助于从服务中移除服务器,并使其在所有可能的情况下退役ReplicationConnectionGroups

如果应用程序触发地形变化,这些方法对于复制主机的jvm管理可能很有用。为了从JVM外部管理主机配置,可以使用JMX。

使用JMX管理复制主机

当Connector/J以ha.enableJMX = true以及为属性设置的值replicationConnectionGroup,将注册一个JMX MBean,允许JMX客户端操作复制主机。MBean接口定义在com.mysql.cj.jdbc.jmx.ReplicationGroupManagerMBean,并利用ReplicationConnectionGroupManager静态方法:

public void addReplicaHost(String groupFilter, String host)抛出SQLException;removeReplicaHost(String groupFilter, String主机)抛出SQLException;public void promoteReplicaToSource(String groupFilter, String host)(String groupFilter, String host)抛出SQLException;getSourceHostsList(String group);getReplicaHostsList(String group);getRegisteredConnectionGroups();getActiveSourceHostCount(String group);getActiveReplicaHostCount(String group);public abstract int getReplicaPromotionCount(String group); public abstract long getTotalLogicalConnectionCount(String group); public abstract long getActiveLogicalConnectionCount(String group);

配置DNS SRV源复制

看到3.5.13节“对DNS SRV记录的支持”获取详细信息。