检测和恢复故障的 H2 集群节点
Detecting and recovering failed H2 cluster nodes
在阅读了 H2 开发人员指南后,我仍然不明白如何找出哪个集群节点 was/were 发生故障以及在发生临时网络故障时需要恢复哪个数据库。
让我们考虑以下场景:
- H2集群以N个活动节点启动(H2实际上可以支持N>2,即多于2个集群节点吗?)
- (大量数据库更新、读取...)
- 与一个(或多个)集群节点的网络连接中断,节点对集群的其余部分不可见
- (大量数据库更新、读取...)
- 网络 link 之前断开连接的节点已恢复
- 发现集群节点可能丢失(据我所知
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'
如果集群中的一个节点出现故障,则开始响应空字符串)
在这一点之后,不清楚如何找出哪些节点出现故障?
显然,我可以做一些基本的检查,比如比较数据库大小,但它不可靠。
找出集群中缺少哪个节点的推荐程序是什么,尤其是。如果上面的查询以空字符串响应?
另一个问题 - 为什么 urlTarget 不支持多个参数?
如果集群中的多个节点发生故障并且我想恢复多个节点,我应该如何使用 CreateCluster 工具?
另外,如果我不得不停止集群并且我不想实际恢复任何节点,我不明白 CreateCluster 是如何工作的?我不清楚的是,如果我实际上不需要复制数据库,我需要将什么传递给 CreateCluster 工具。
部分正确SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'
,在标准模式下查询时return将是一个空字符串。
不过,您也可以使用 Connection.getClientInfo()
获取服务器列表,但这是一个两步过程。转述自 h2database.com:
由 getClientInfo()
编辑的属性列表 return 包括一个 numServers
属性 return 连接列表中的服务器数量. getClientInfo()
还具有属性 server0..serverN,其中 N 是服务器数量 - 1。因此,要从列表中获取第二台服务器,请使用 getClientInfo('server1')。
Note: The serverX property only returns IP addresses and ports and not
hostnames.
在你说简单复制之前,是的,这是默认操作,但你可以在集群 H2 中做你的问题范围之外的更高级的事情。
这是你所说内容的引述:
Clustering can only be used in the server mode (the embedded mode does not support clustering). The cluster can be re-created using the CreateCluster tool without stopping the remaining server. Applications that are still connected are automatically disconnected, however when appending ;AUTO_RECONNECT=TRUE, they will recover from that.
所以是的,如果集群停止,auto_reconnect 未启用,并且您坚持使用基本查询,您将被卡住并且很难找到信息。虽然大多数人会告诉您通读 API 和/或手册,但他们不必通读这本手册,所以,我表示同情。
我发现跟踪错误代码更有用,因为当您看到故障是如何计划的... here you go.
在阅读了 H2 开发人员指南后,我仍然不明白如何找出哪个集群节点 was/were 发生故障以及在发生临时网络故障时需要恢复哪个数据库。
让我们考虑以下场景:
- H2集群以N个活动节点启动(H2实际上可以支持N>2,即多于2个集群节点吗?)
- (大量数据库更新、读取...)
- 与一个(或多个)集群节点的网络连接中断,节点对集群的其余部分不可见
- (大量数据库更新、读取...)
- 网络 link 之前断开连接的节点已恢复
- 发现集群节点可能丢失(据我所知
SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'
如果集群中的一个节点出现故障,则开始响应空字符串)
在这一点之后,不清楚如何找出哪些节点出现故障? 显然,我可以做一些基本的检查,比如比较数据库大小,但它不可靠。
找出集群中缺少哪个节点的推荐程序是什么,尤其是。如果上面的查询以空字符串响应?
另一个问题 - 为什么 urlTarget 不支持多个参数? 如果集群中的多个节点发生故障并且我想恢复多个节点,我应该如何使用 CreateCluster 工具?
另外,如果我不得不停止集群并且我不想实际恢复任何节点,我不明白 CreateCluster 是如何工作的?我不清楚的是,如果我实际上不需要复制数据库,我需要将什么传递给 CreateCluster 工具。
部分正确SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'
,在标准模式下查询时return将是一个空字符串。
不过,您也可以使用 Connection.getClientInfo()
获取服务器列表,但这是一个两步过程。转述自 h2database.com:
由 getClientInfo()
编辑的属性列表 return 包括一个 numServers
属性 return 连接列表中的服务器数量. getClientInfo()
还具有属性 server0..serverN,其中 N 是服务器数量 - 1。因此,要从列表中获取第二台服务器,请使用 getClientInfo('server1')。
Note: The serverX property only returns IP addresses and ports and not hostnames.
在你说简单复制之前,是的,这是默认操作,但你可以在集群 H2 中做你的问题范围之外的更高级的事情。
这是你所说内容的引述:
Clustering can only be used in the server mode (the embedded mode does not support clustering). The cluster can be re-created using the CreateCluster tool without stopping the remaining server. Applications that are still connected are automatically disconnected, however when appending ;AUTO_RECONNECT=TRUE, they will recover from that.
所以是的,如果集群停止,auto_reconnect 未启用,并且您坚持使用基本查询,您将被卡住并且很难找到信息。虽然大多数人会告诉您通读 API 和/或手册,但他们不必通读这本手册,所以,我表示同情。
我发现跟踪错误代码更有用,因为当您看到故障是如何计划的... here you go.