JDBC Postgres基于仲裁的同步复制的故障转移

时间:2018-06-17 06:05:17

标签: java postgresql jdbc

假设我在3个节点群集的ANY中的FIRSTsynchronous_standby_names中使用了quorum based synchronous replication个2个节点名称。

我正试图从postgres jdbc doc中讨论的奴隶中读取。

jdbc:postgresql://node1,node2,node3/accounting?targetServerType=preferSlave&loadBalanceHosts=true

有人能告诉我吗

  1. 如何选择奴隶?是随机选择的从站还是首选具有零滞后或最小滞后的从站?
  2. jdbc url中是否有任何设置只会选择零复制的slave,如果不存在这样的slave,那么read会被发送给master吗?
    • Postgres - 10.4
    • Postgres JDBC Driver - 42.2.2

2 个答案:

答案 0 :(得分:0)

这已在this主题的postgres邮件列表中得到解答。

  

不,我猜没有这样的选择。如果可以的话,也许你会提出PR:)

     

在infra级别可以执行的操作是将数据库放在Load之后   平衡器(如haproxy或nginx)并根据滞后进行健康检查   等等,然后将连接路由到备用节点,否则采取   它离开了负载均衡器。

     

问候,维杰

           

来自:Debraj Manna发送:2018年6月17日,星期日   下午2:42:46致:Vijaykumar Jain Cc:pgsql-admin主题:回复:[外部]   使用基于仲裁的同步复制的JDBC Postgres故障转移

     

是的,Vijaykumar你是对的,这只是一个随机的随机洗牌   奴隶。

     

https://github.com/pgjdbc/pgjdbc/blob/f78a639d1ed3c64e80e1fa107691b4af5945cb84/pgjdbc/src/main/java/org/postgresql/hostchooser/MultiHostChooser.java#L51

     

我有没有办法在连接参数中指定选择a   零滞后的奴隶还会回归主人?

     

On Sun,2018年6月17日下午2:11,Vijaykumar Jain   >中写道:   我猜主逻辑和辅助逻辑之间的区别可以是   抬头看这里(isMaster)   https://github.com/pgjdbc/pgjdbc/blob/f78a639d1ed3c64e80e1fa107691b4af5945cb84/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java   从奴隶中我们确实检查了代码并且它是随机的   shuffle并不支持任何自定义逻辑来挑选任何奴隶。一世   可能是错的,但我记得在源头查找:)

     

问候,维杰

           

来自:Debraj Manna>   发送时间:2018年6月17日星期日上午11:31:32致:pgsql-admin主题:   [外部] JDBC Postgres基于仲裁同步的故障转移   复制

     

您好

     

让我们说我正在使用基于仲裁的同步   复制https://wiki.postgresql.org/wiki/New_in_postgres_10#Quorum_Commit_for_Synchronous_Replication   在synchronous_standby_names中的ANY或FIRST

     

我正试图从奴隶那里读到   这里https://jdbc.postgresql.org/documentation/head/connect.html

     

JDBC:在PostgreSQL:// node1上,节点2,节点3 /计费targetServerType = preferSlave&安培; loadBalanceHosts =真

     

有人能告诉我吗

     
      
  1. 如何选择奴隶?是随机选择的从站还是首选具有零滞后或最小滞后的从站?
  2.   
  3. jdbc url中是否有任何设置只会选择零复制的slave,如果不存在这样的slave,那么read将   被送到主人?
  4.   

答案 1 :(得分:0)

以下内容自2018年7月12日起生效(pgjdbc 42.2.3)

pgjdbc仅连接到一台服务器,因此它“选择要连接的主机”仅一次(建立连接时)。 仅在网络连接失败和/或连接池出现close()的情况下(例如,在某些时候连接验证失败),它才会重新连接。

也就是说,如果辅助服务器的“滞后”随着时间而变化,那么即使在创建连接时它是“最佳”主机,连接也可能指向“陈旧”主机。

如果您确实需要“最佳延迟”类型的逻辑,那么您可能应该在应用程序级别具有多个数据源(每个数据源都指向一个主机),然后获得两个连接,检查延迟并使用适当的连接为您的业务运作。 当然,您可能希望缓存数据源的延迟,以避免每秒多次请求它。

org.postgresql.Driver级别实施“最佳从属”可能并非易事(当前逻辑仅假设单个连接点指向单个服务器,元数据被缓存等)。

也许可以实现DataSource来提供基础数据源之外的“具有最佳延迟的连接”,但是从未请求/实现过。