检测并恢复发生故障的H2集群节点

时间:2016-06-24 04:58:55

标签: h2 high-availability

在浏览了H2开发人员指南后,我仍然不明白如何在发生临时网络故障时找出哪些群集节点失败以及哪些数据库需要恢复。

让我们考虑以下情况:

  • H2群集以N个活动节点开始(实际上H2确实支持N> 2,即超过2个群集节点?)
  • (很多数据库更新,读取......)
  • 与一个(或多个)群集节点的网络连接关闭,节点对群集的其余部分不可见
  • (许多数据库更新,读取......)
  • 恢复先前已断开连接的节点的网络链接
  • 发现集群节点可能已丢失(据我所知,SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'如果集群中的一个节点发生故障,则会以空字符串开始响应)

在此之后,目前还不清楚如何找出哪些节点出现故障? 显然,我可以做一些基本的检查,如比较DB大小,但它是不可靠的。

  1. 建议的程序是找出群集中缺少的节点,尤其是如果上面的查询以空字符串响应?

  2. 另一个问题 - 为什么urlTarget不支持多个参数? 如果群集中的多个节点出现故障并且我想恢复多个节点,我应该如何使用CreateCluster工具?

  3. 如果我不得不停止群集并且我不想实际恢复任何节点,我也不明白CreateCluster是如何工作的?如果我实际上不需要复制数据库,那么我不清楚需要传递给CreateCluster工具的内容。

1 个答案:

答案 0 :(得分:1)

部分正确SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER',在标准模式下查询时将返回空字符串。

但是,您也可以使用Connection.getClientInfo()获取服务器列表,但这是一个两步过程。转自h2database.com

getClientInfo()返回的属性列表包含numServers属性,该属性返回连接列表中的服务器数。 getClientInfo()还有属性server0..serverN,其中N是服务器的数量 - 1.因此,要从列表中获取第二台服务器,请使用getClientInfo(' server1')。

  

注意:serverX属性仅返回IP地址和端口,而不是   主机名。

在您说简单复制之前,是的,这是默认操作,但您可以在群集H2中执行超出问题范围的更多高级操作。

以下是您所谈论的内容的引用:

  

群集只能在服务器模式下使用(嵌入模式不支持群集)。可以使用CreateCluster工具重新创建群集,而无需停止剩余的服务器。仍然连接的应用程序会自动断开连接,但在附加时; AUTO_RECONNECT = TRUE,它们将从中恢复。

所以是的,如果集群停止,auto_reconnect没有启用,并且你坚持使用基本查询,那么你就会陷入困境并且很难找到信息。虽然大多数人会告诉你仔细查看API和手册,但他们还没有必要仔细研究这个,我的同情心。

我发现跟踪错误代码更有用,因为当您看到失败的计划方式时,您会真正了解自己可以做些什么...... here you go