我有一个相当繁忙的媒体网站,其中的 MP3 音频文件由会员上传并从 2 台 Windows 服务器流式传输/下载,这两台服务器目前处于负载平衡状态……两台服务器只是彼此镜像并保持同步。
我们目前所做的就是每次当前驱动器满了时添加新的 2TB HDD,然后用户将数据上传到新驱动器...我们有足够的托架容纳 24 个磁盘。
我们在最近添加的 HDD 上遇到了 I/O 瓶颈,因为所有新媒体都被添加到这个驱动器中,而这也是最受欢迎的驱动器...这可以通过将数据分散到每个磁盘上来克服,但是当我们空间不足并添加新的空白驱动器时,情况就会变得复杂。
我镜像文件的原因是为了获得 1:1 备份,以防 1 台服务器出现故障时进行故障转移,并且我可以轻松地使用 2 台机器对我的站点进行负载平衡。
之前有人推荐使用 NAS/SAN,但不幸的是我无法使用。
对于我的情况你会有什么建议...有什么方法可以改善我的设置?
前几天我读到了关于分布式文件系统的文章,听起来可能很合适,但它们似乎都是只适用于 Linux...现在转换到 Linux 至少可以说是一个挑战,因为我经验很少。
如果我遗漏了任何可以帮助您回答的内容,请告诉我。
谢谢你,保罗
答案1
数据负载平衡问题。这很有趣。以下是我处理大量数据的一些经验,即使我们通常将这些数据分散在多台服务器上。
听起来你还没有将存储与显示分离。你需要这样做。设计一个面向存储的接口(它可以作为单独的服务器、NFS 共享或类似文件呈现)。我个人强烈支持拥有一个仅提供数据的“媒体”服务器。这样你就可以转向 NAS 模型,随着你的成长,它将为你省去大量的麻烦。
一旦将媒体与应用程序分离,您就可以开始寻找如何处理大量数据的解决方案。
有大量的商业 SAN 产品。它们通常可以在大量磁盘上实现负载平衡,并能很好地处理添加/删除存储。它们也非常昂贵,而且听起来你已经有硬件了。
在 Linux 方面,有标准软件可以毫无问题地处理如此大量的数据。LVM 和 EXT4 可以处理非常大的文件系统(但要注意 FSCK 时间)。如果我要构建它,我可能会使用 LVM、EXT4 并使用 Apache 提供数据。这种组合还可以让您根据需要将存储量扩大到最大。
但这只是一般策略。现在,开始解决你遇到的具体问题。如果不知道实施细节,这有点困难,但我可以提供一些建议:
听起来你没有正确地平衡你的 IO 负载。我假设你可以跟踪哪个磁盘为你提供数据。在这种情况下,你应该创建一个“重新平衡”脚本。当你向系统添加新磁盘时,这个脚本会从所有旧磁盘获取数据并填满新磁盘。然后,你可以将传入的文件分布到所有磁盘上,从而更好地平衡 IO 负载。这假设你在不同的磁盘上有不同的文件系统,而不仅仅是创建一个巨大的 JBOD,这通常不是一个好主意。
第二步是开始分析。制作一个小型应用程序来记录每个文件请求。如果您发现某个特定磁盘的访问量超过其应有的份额,则可以在该磁盘和使用率最低的磁盘之间交换数据。这种负载平衡最好作为一项常规工作来完成,可能是每小时或每天。
此外,请确保您拥有大型 IO 缓存。通常情况下,当您提供太多不同的文件以至于缓存不堪重负时,就会降低您拥有的应用程序的 IO 性能,从而导致磁盘开始崩溃。最大化磁盘控制器上的缓存,并向系统投入尽可能多的内存。Windows 很乐意使用备用 RAM 作为读取缓存。如今,在服务器上塞入超过 128G 的 RAM 并不难,甚至不是特别昂贵。这是一个相当大的缓存,即使您的热文件集是 1TB。
考虑到您处理的数据量,我建议您不要使用 RAID 解决方案。重建大型 RAID 阵列往往是一次痛苦的经历。
答案2
一个基本问题 - 您正在使用 RAID 阵列,而不是简单地镜像您要添加的两个驱动器?
在存储箱上使用类似 RAID10 的东西将允许您扩大阵列(通过添加驱动器,然后告诉 RAID 控制器或软件 RAID 子系统使用额外的磁盘)。
然而,建议迁移到分离存储模型。仅从扩展角度来看,您的数据集会不断增长,这是一个问题。如果您不归档并删除旧数据,您的数据集将永远增长。
例如,当您将现有机器中的所有托架都填满时,您会怎么做?;-)
使用 Windows,我个人会避开他们使用的分布式文件系统。使用最简单的解决方案。幸运的是,Windows 2008r2 附带 iSCSI 支持 - 因此您可以相当轻松地构建自己的 SAN(http://technet.microsoft.com/en-us/library/cc726015.aspx)。
更好的是,构建一个 Linux 机器作为 iSCSI 目标,然后从 Windows 机器指向它。