![使用会话对正在运行的服务器进程进行负载平衡](https://linux22.com/image/640780/%E4%BD%BF%E7%94%A8%E4%BC%9A%E8%AF%9D%E5%AF%B9%E6%AD%A3%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%9B%E7%A8%8B%E8%BF%9B%E8%A1%8C%E8%B4%9F%E8%BD%BD%E5%B9%B3%E8%A1%A1.png)
我正在开发一个服务器应用程序,它接受传入连接并与客户端应用程序一起工作。客户希望有两台机器工作:如果一台机器离线,第二台机器将备份它。机器的管理员(我几乎不与他打交道)想出了负载平衡解决方案:将有两台相同的服务器机器,每台机器独立运行服务器进程,还将有一台负载平衡器机器,它将在两台工作机器之间分散传入连接。
我必须在此指出,我对这个主题不是很熟悉。我认为,负载平衡对于网站来说是有意义的(这也是我的服务器所属设置的一部分),但我的服务器不是基于请求的:它在其堆内存中维护会话和相关数据,并与客户端(始终保持连接)交换会话和状态特定的数据。因此,如果一台机器发生故障并且平衡器将客户端切换到另一台机器,那么另一台机器将无法继续与该客户端合作,而不会丢失运行时数据。
但管理员告诉我,可以在机器之间进行同步,这样在两台不同的机器上运行的两个进程将以某种方式拥有相同的数据,而无需我实施任何操作。这似乎是一项令人着迷的技术,我想熟悉它,但我找不到哪些软件包可以做到这一点,甚至不知道该技术的名称。我多次遇到对 Linux HA 的引用,但我不确定这就是我要找的。
该操作系统基于 Linux,但我对一般概念更感兴趣,而不是自己安装某些东西,因此任何系统的软件包或手册都会引起我的兴趣。
答案1
这里没有“灵丹妙药”。您需要以这样一种方式设计您的应用程序,即在本地保存的应用程序状态不会在其他地方同步。
考虑使用诸如 memcached 或 redis(托管在其自己的服务器上)之类的东西来维护会话状态,以代替使用本地堆内存。
至于“管理员”所说的同步,我见过的唯一与之接近的就是 VMware 的容错 (FT) 模式。通过此模式,整个虚拟机的热从属设备将保存在单独的物理机箱中。但是,此设置有很多限制,并且它不是负载平衡解决方案,因为虚拟机的副本中只有一个在任何时候处于“活动”状态。
答案2
如果您正在寻找现成的解决方案,则应考虑使用 Amazon Web Services (AWS)。他们的 Elastic Beanstalk 环境是一种很好的方式,可以在可配置的负载平衡器后面的多台机器上同时部署代码(http://aws.amazon.com/elasticbeanstalk/)。
否则,研究具有多个上游服务器的 NGINX 或 Apache。
答案3
管理员或您都无法 100% 理解这个问题和想法。
有两种解决方案:“高可用性”和“负载平衡”
这两种解决方案本质上是不同的!
如果将两个应用服务器置于负载平衡解决方案之后,您仍会有一个应用服务器故障点,即负载平衡器。
如果您需要“高可用性”解决方案,则需要操作两台机器,其中一台机器待命,以防另一台机器出现问题。
对于 HA,您可以使用基本的 Pacemaker,它允许一台服务器根据各种选项确定另一台服务器是启动还是关闭。
您应该了解 STONITH,它可以让您选择在几种情况下防止一台服务器干扰另一台服务器。
请看:起搏器
还不要忘记,还有一个选项是使用网状结构中的多个负载均衡器和多个应用程序服务器来一起完成所有操作。