10bet网址
MySQL Connector/J 8.0开发指南
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 0.8 mb
PDF (A4)- 0.8 mb
HTML下载(TGZ)- 146.7 kb
HTML下载(邮政编码)- 166.0 kb


MySQL Connector/J 8.0开发指南/多主机连接/配置使用连接器的源/副本复制/J . /

9.4配置连接器为“/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;公共类ReplicationDemo{公共静态void main(String[] args)抛出异常{属性道具=新属性();//我们需要在副本道具上进行故障转移。把(“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(“更新some_table…”);conn.commit ();// //现在,从一个副本中进行查询,驱动程序自动从列表//中选择一个// conn.setReadOnly(true);ResultSet rs = conn.createStatement()。executeQuery("SELECT a,b FROM alt_table"); ....... } }

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

支持多源复制拓扑

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

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

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

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

复制地形的实时重构

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

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

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

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

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

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

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

  • removeReplicaHost(字符串主机,boolean关闭轻轻地):从配置的复制主机列表中删除主机(主机名匹配必须是精确的);如果closeGently为false时,将此主机作为当前活动的现有连接将很难关闭(应用程序应该预期会出现异常)。

  • removeSourceHost(String主机,boolean):一样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组名。这些方法将操作所有匹配的ReplicationConnectionGroups,这有助于从服务中删除一个服务器,并使它在所有可能的情况下退役ReplicationConnectionGroups

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

使用JMX管理复制主机

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

public abstract void addReplicaHost(String groupFilter, String host)抛出SQLException异常;抛出SQLException异常;protereplicatosource (String groupFilter, String主机)抛出SQLException异常;抛出SQLException异常;getSourceHostsList(字符串组);getReplicaHostsList(字符串组);getRegisteredConnectionGroups();public抽象int getActiveSourceHostCount(字符串组);public抽象int getActiveReplicaHostCount(字符串组);public抽象int getReplicaPromotionCount(字符串组); public abstract long getTotalLogicalConnectionCount(String group); public abstract long getActiveLogicalConnectionCount(String group);

使用DNS SRV配置源/副本复制

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