H2 数据库集群恢复

Posted

技术标签:

【中文标题】H2 数据库集群恢复【英文标题】:H2 Database Cluster Recovery 【发布时间】:2013-05-09 15:01:38 【问题描述】:

我有一个在 Apache Tomcat 上运行并使用 H2 数据库的 SpringMVC 应用程序。 该基础架构包含两个运行自己的 Tomcat 服务器的应用程序服务器(我们将它们命名为 A 和 B)。我还有一个 H2 数据库集群。

在一个系统 (A) 上,我运行了以下命令

java org.h2.tools.Server -tcp -tcpPort 9101 -tcpAllowOthers -baseDir server1

在另一边 (B) 我跑了

java org.h2.tools.Server -tcp -tcpPort 9101 -tcpAllowOthers -baseDir server2

我在机器 A 上启动了集群

java org.h2.tools.CreateCluster
-urlSource jdbc:h2:tcp://IpAddrOfA:9101/~/test
-urlTarget jdbc:h2:tcp://IpAddrOfB:9101/~/test
-user sa
-serverList IpAddrOfA:9101,IpAddrOfB:9101

当任何一台服务器宕机时,已经提到,必须删除失败的数据库,重新启动服务器并重新运行 CreateCluster。

我有以下问题?

    如果两台服务器都关闭,我如何确定要使用哪个数据库 删除,以便我可以重新启动该服务器并重新运行集群? CreateCluster 包含一个 urlSource 和 urlTarget。我需要成为 具体到给它们与之前给出的相同的值或我 可以在没有任何副作用的情况下互换它们吗? 我需要从两台机器上运行 CreateCluster 命令吗? 如果是这样,我需要交换 urlSource 和 urlTarget 吗? 有没有办法知道这两个、一个或没有一个服务器是 跑步 ?我希望如果两者都返回两个 IpAddress 它们已启动,如果只有一个已启动,则为一个 IpAddress 否则没有 下来了。

【问题讨论】:

【参考方案1】:

    如果两台服务器都关闭了,我如何确定要删除哪个数据库

    集群的想法是第二个数据库为系统增加冗余。假设一台服务器每 100 天发生一次故障(硬盘故障、电源故障等)。那是 99% 的可用性。这对您来说可能不够好,这就是您可能希望使用具有两台服务器的集群的原因。这样,即使其中一台服务器每 100 天发生一次故障,两者同时发生故障的几率也非常非常低。理想情况下,失败的风险是完全独立的。这意味着两者同时失败的风险是万分之一(100 乘以 100),为您提供 99.99% 的可用性。两台服务器都宕机的风险正是集群功能应该防止的。

    CreateCluster 包含一个 urlSource 和 urlTarget。我是否需要具体说明为它们赋予与以前相同的值

    这取决于您要使用哪一个作为源以及哪一个作为目标。将源中的数据库复制到目标。源是您要复制到目标的数据库。

    我需要从两台机器上运行 CreateCluster 命令吗?

    没有。

    有没有办法知道这两个服务器是否都在运行?

    您可以尝试打开与它们的 TCP/IP 连接,以检查侦听器是否正在运行。我通常做的是在命令行上运行telnet <server> <port>

【讨论】:

以上是关于H2 数据库集群恢复的主要内容,如果未能解决你的问题,请参考以下文章

在集群模式下添加子表的行时 H2 参照完整性违规

集群中 h2 和 MySQL 的休眠 id 生成器 AUTO_INCREMENT

zk集群数据迁移和恢复

改进多节点集群上的 h2o DRF 运行时

关于H2数据库中CreateCluster工具的问题

从 R 中启动多个 h2o 集群