【问题标题】:Is it possible to have replicated JVMs so that i can simply flip over from primary jvm to secondary in case primary jvm goes down是否可以复制 JVM,以便我可以简单地从主 jvm 切换到辅助 jvm,以防主 jvm 出现故障
【发布时间】:2012-01-28 10:15:07
【问题描述】:

是否可以复制完整的 JVM,并且在故障转移的情况下只需将负载转移到复制的 JVM?

如果是,那我们该怎么做呢?

【问题讨论】:

  • JVM 的故障转移,听起来太复杂了:),但希望其他人知道。

标签: java jvm replication failover


【解决方案1】:

理论上是的,但主要问题是您的应用程序会慢得多(比如 100 到 1000 倍),这就是让大多数人无法进行完整复制的原因。

相反,您需要生成重要信息的数据流,例如所有输入或输出消息(或两者)并将其发送到第二台机器并根据现有数据重新构建状态。

顺便说一句:当您失去与服务器的 TCP 连接时,必须关闭这些连接并重新连接。这些不是透明的故障转移。 UDP 通过没有连接来避免这个问题,但更难可靠地使用。解决这个问题的一种方法是在客户端和服务器之间有一个简单的代理/负载平衡服务器。因为它很简单,所以不太可能失败,并且它隐藏了与服务器的重新连接。不管你有一个数据中心故障,它也会消失。

【讨论】:

  • 是的,这正是我们现在正在做的事情。缓存场中的提交次数最少,并在发生故障转移时从缓存中读取。
【解决方案2】:

如果您的应用程序是 Web 应用程序,请阅读“集群”和“负载平衡”。大多数应用服务器都支持集群。

您还可以查看 JGroups,它提供了 JVM 间通信。

【讨论】:

  • 感谢您的回复。是的,实际上我们使用 jetty 作为应用服务器,使用 jgroup 进行集群。我们还使用 infinispan 进行缓存。但是更改所有数据结构以使用 infinispan 将花费更多时间,所以这就是为什么我在想如果我可以复制整个 jvm,因为在开始时负载不会那么高。我将尝试探索 jgroups 来弄清楚。
  • @Ranger CPU 可以以 6 GB/s 或超过 60 Gb/s 的速率更新内存。如果您尝试以 1 GB/秒甚至 10 Gb/秒的速度复制该链接,您可能会发现您总是落后,或者您的服务器速度显着降低,因此第二个站点永远不会落后太多。回滚不完整的更新也非常复杂。
  • @Peter 是的,当然,性能会下降,但在接下来的 2-3 个月内,我们可以忍受性能下降并安装更多机器。是的,事务管理是一项非常重要的工作,在缓存的情况下需要花费大量时间。因此,主要目标是减少故障转移的开发时间。任何建议:)
  • 将所有输入从主站点复制到辅助站点。如果您以相同的方式对这些输入进行排序,则辅助站点应与主站点处于相同状态(站点之间的延迟除外)
  • 集群和负载均衡是一回事吗?
【解决方案3】:

这不是在 JVM 级别完成的事情,但是有很多产品在处理消息时处理这个问题。通常这是企业服务总线的一个特性。谷歌一下,你会得到一些想法。

【讨论】:

  • 感谢您的快速回复。我使用 jgroups 进行消息传递,使用 infinispan 进行缓存,但是将所有数据结构更改为使用 infinispan 需要花费大量时间,这就是为什么我开始计划使用整个 JVM 复制的原因。只是出于好奇,我们可以通过硬件复制来复制整台机器吗?
  • 查看虚拟机以复制整台机器。有很多技术可以做到这一点。尽管您还需要 ESB 或其他技术的支持,以使消息流向正确的位置(在 Java 领域)。我认为 Gigaspaces 是一家商业公司,拥有一些可能在这里有用的技术。
猜你喜欢
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 2018-06-25
相关资源
最近更新 更多