我最近对 VPS 集群产生了兴趣,尝试设置多 VPS 设置似乎是个好主意,我将在下面进行描述。它实际上并不是用于生产用途,而更像是一个实验,旨在提高多服务器系统的相关技能和知识。但是由于我缺乏这方面的知识,我需要一些一般信息。
设置说明
由于我每天都要处理使用 Redis 作为数据存储的 Node.js 应用程序,因此它将作为设置的基础。我所考虑的基本上是至少设置 2 个 VPS。每个服务器都将运行相同的 Node 服务(假设两个服务器上同时运行 5 个不同的服务),并且每个 VPS 都运行一个 Redis 实例,供 Node 服务用于存储数据。此设置的目的是启用两个服务器之间的数据镜像(如果第一个服务器中的 Node 服务 #1 向 Redis 添加了某些内容,则更改也应反映在第二台服务器上)。这也意味着上传的文件等应该在两个服务器上进行镜像(从某种意义上说,数据存储和文件系统中的更改必须反映在另一个服务器上)。
理想情况下,这将启用简单的负载平衡器,在服务器之间共享负载,并且在单个服务器发生故障的情况下,其他服务器将继续运行,从而保持 Node 服务在线。更改需要镜像的速度并不高,即使一分钟的延迟也不会有什么影响。但是,如果用户正在主动更新数据,则必须向他展示他刚刚更改的数据(从某种意义上说,他必须以某种方式被迫与他更新数据的服务器进行通信,因为更改可能尚未镜像到其他服务器上)。
问题
实现负载平衡的合理方法有哪些?我听说过使用一些 DNS 魔法,但并不真正理解它。简单地更新 DNS 记录会太慢,因为它们缓存在多个地方。我还读到过使用一个“主代理”服务器来处理其他服务器之间的平衡。这似乎有点冒险,因为如果主服务器发生故障,一切都将处于离线状态。
如何镜像不同 VPS 上的文件系统部分,以便上传的图像等可以同时出现在两台服务器上。是否有任何广泛使用的软件选项,或者一个简单的脚本可以检测上传,然后在不同的服务器上复制这些文件,这样就可以了吗?
- Redis 是否支持我描述的那种镜像?我只找到了有关主从复制的信息,如果我理解正确的话,这意味着更新是单向的,即主服务器可以更新从服务器,但从服务器不能更新主服务器。
谢谢你!
答案1
仅能帮助解答问题 1。
有几种方法可以实现负载平衡和故障转移(最简单优先)
- DNS 轮询(负载平衡和故障转移)
- 动态 DNS(故障转移)
- 代理(负载平衡和故障转移)
- 本地 IP 故障转移(故障转移)
- BGP Anycast(负载平衡和故障转移)
DNS 负载平衡很简单:假设您有两台(或更多)服务器,IP 分别为 1.1.1.1 和 2.2.2.2。要设置 DNS 负载平衡,您需要为您的主机名创建 DNS 记录,例如 www.example.com:
www.example.com. A 1.1.1.1
A 2.2.2.2
(此外,DNS 服务器应该配置为以循环模式提供该名称,但是它通常是默认的)。
现在,对 www.example.com 的每个 DNS 请求都将以伪随机顺序回复两个地址,因此您的客户端可能会在服务器之间均匀分布。
无需频繁更新记录,一旦设置即可永久使用。它还提供一些故障转移的程度,如果一台主机宕机,浏览器将超时,然后尝试第二台主机,但可能会有相当大的延迟,用户不会喜欢这样。
动态 DNS。除了 1. 之外,可能还有一种情况,即一旦主机发生故障,就会动态更新 DNS 记录并删除对故障主机的引用,但 DNS 系统中的大量缓存会导致我上面提到的一段时间内出现性能下降的情况。使用非常低的 TTL 可以改善这种情况,但客户端操作系统/浏览器内部的缓存仍然不会考虑 TTL,而且一些 ISP 也不会忽略低 TTL。无论如何,底线是 - 这是实现平衡和基本的故障转移。
代理。简单且流行的负载平衡方法。要消除单点故障,您需要将其与其他方法相结合。
IP 故障转移。除了 2. 之外,为了应对代理本身的故障,在“IP 故障转移”设置中使用了两个代理 - 基本思想是有一个 IP 地址通常出现在 host1 上,但一旦出现故障,host2 会检测到它,并且 IP 会出现在 host2 上。查找 linux“心跳”项目。(您也可以在没有代理的情况下对服务器本身进行故障转移,但您不会进行平衡)。通常情况下两台电脑必须位于同一子网(同一数据中心)。
任播。想法是将路由通告到几个物理位置的单个 IP 地址(实际上是单个子网)。您需要自己的 /24 子网,并能够配置 BGP。任播通常用于 DNS 服务器。持久 TCP 连接存在困难,因此更容易适应 UDP 和 DNS,但有时也用于 Web。
这就是基本思想。如你所见,每种方法都有局限性和复杂性。如果还不够复杂,你可以构建上述方法的任何可想象的组合 :)
答案2
- 了解起搏器(www.clusterlabs.org)它可以管理集群资源,实现负载平衡和故障转移(运行和移动服务、ip 等)
- 还有下一个解决方案:
- 对于 2 节点集群,您可以在主动/被动模式下使用 DRBD(http://www.drbd.org/(英文):
- 对于多台服务器,您可以使用集群文件系统(例如 GFS2);
- 如果你有很多文件,并且想要快速同步多个节点,我建议使用同步。
- 我现在不知道 redis 有这样的解决方案。您可以使用 MongoDB 和副本集来实现此目的。