因此,几个月前我的老板向我提出了“我们需要在相当短的时间内扩展到 X 个客户”之类的场景,如果说有什么的话,这在某种程度上是一个工程挑战,但当然,更多的客户意味着更多的收入。
因此,现在我们有一个类似于下面的设置。冗余负载均衡器,提供来自两个 Web 服务器(通过内存缓存共享会话)的数据,以及两个后端完全冗余的文件服务器。每个文件服务器都有整个 shabang、跨驱动器的 RAID6 阵列、热空间驱动器、双 raid 控制器、双 nic、多路径等等。
我觉得这个设计很可靠,没有单点故障,因此具有高可用性。通过将负载分摊到多个 Web 服务器来实现高性能,高可扩展性意味着我们应该能够不断水平添加越来越多的机器,以扩展到越来越多的客户端。主要瓶颈是每个文件服务器可以容纳多少存储空间,以及为每个客户端分配多少空间。这部分的扩展速度将比系统的其他部分更快。之所以选择文件服务器/客户端“池”路线,是因为它可以水平扩展,而且比说“好吧,我们需要购买更大的 SAN”更便宜。
所以,这一切都很容易,越来越多的在线存储意味着越来越多的 NFS 安装。这就是我的第二次猜测发挥作用的地方。我想确保在实施任何措施之前已经解决了此设计中的所有潜在问题。只要妥善监控这个难题的每个部分,我认为它是可控的,但我想先听听其他人的意见,也许从以前走过这条路的人那里听听。
我知道有几个必须注意的关键问题。
- 热点在文件服务器上,或者特定的机器比其他机器工作得更努力。
- 带宽和后端交换. 由于 Web 服务器和 NFS 设备之间会有大量通信,因此需要配备具有高交换结构容量的高质量交换机。
未知问题...
- 在 Web 服务器上挂载 NFS, 如果每个 Web 服务器同时打开 2... 5... 10... 100 个 NFS 挂载,会不会有什么问题?有没有办法让这个更简单或更友好?也许是某种 NFS 代理?(这会造成内部瓶颈,这让我很不爽)。我考虑过分布式文件系统,然后让 Web 服务器挂载它,但是似乎非专有、符合 POSIX 标准、无需停机即可扩展、内部冗余的文件系统要么太不成熟,不适合生产工作,要么价格过高,要么真的很擅长躲避 Google。
请让我知道你们的想法,如果您看到任何建议和优化,我将不胜感激。
((由于这是一个开放式问题,没有一个特定的“正确答案”,所以问题是一个社区 Wiki))
答案1
在您遇到的 90% 的托管情况下,您的网络服务器数量将远远多于存储服务器,这会极大地改变您的网络设计。您将成对运行存储服务器,因为许多主/主文件服务器仅支持镜像复制。如果您有 10g 主干网,大型 NFS 服务器可能会处理十几个网络服务器。您的连接线将是虚拟连接,因为您将在一个 vlan 上运行网络局域网,在另一个 vlan 上运行存储局域网,为网络局域网使用千兆以太网,为存储局域网使用 10g,具体取决于预算。您提到双主存储服务器,然后提到 NFS 安装,这有点排他。它们真的运行无共享吗?还是双头/双机架/单 fcal 设置?
在双主模式下运行负载均衡器,以减少切换时间并提高潜在吞吐量。不要使用超过 40% 的容量,以便在发生故障时有足够的备用容量。
您还需要考虑 MySQL/PostgreSQL/Cassandra/etc 集群——它们并不特别喜欢 NFS 挂载。
Lefthand Networks 有一款分布式文件系统产品。GlusterFS 已经比较成熟,可以根据您的工作量来工作。MogileFS/Hadoop 是另一种选择。此外,还可以看看 Ceph、GFS 和 OCFS。
至于挂载数量,您将为每个 Web 服务器挂载一次或两次 NFS 服务器。数十次挂载并非闻所未闻,但您可能最终会隔离 Web 集群以消除数百次挂载。Hadoop 可以作为分布式网络中的单一全局文件系统呈现给您的网络。
答案2
就像 karmawhore 所说的那样,文件服务器比 Web 服务器多听起来是一种非常不标准的设置。您能再解释一下用法吗?
从您的 Visio 绘图和描述中,我无法找出文件方面的无单点故障点在哪里。在我看来,每个 NFS 服务器都有自己的文件子集?
您可能应该考虑构建“胖”(即规格非常高)的文件服务器,这些服务器具有大量 RAM,并在其上使用某种集群或镜像文件系统,从 2 个 NFS 服务器开始,然后以 2 为增量进行扩展。也许http://www.drbd.org/可以为你工作吗?
例子:
NFSA_1 <--> NFSA_2 NFSB_1 <--> NFSB_2
答案3
为了解释为什么上述设计中的文件服务器比 Web 服务器更多,Grufftech(我与他合作)所说的系统是一种面向消费者和企业的在线备份服务(备份台式计算机和服务器)。
答案4
您如何在存储节点之间复制数据?我假设您让 Apache 从存储节点上的同一目录提供 Web 内容……
我们正在努力建立类似的东西,但我对找到一种在存储节点之间无滞后复制数据的方法感到相当沮丧。
有想法吗?