我们目前通过单个 Apache 服务器交付大型 (1GB+) 文件,但我们的 Apache 服务器非常受磁盘 IO 限制,我们需要扩展。
我的第一个想法是简单地复制这个 Apache 服务器,但是我们的文件库太大而无法简单地水平扩展 Apache 服务器 N 倍。
所以我的下一个想法是在后端有两个 Apache(高可用性),每个都有我们整个库的单独副本。然后在前面有“N”个反向代理,其中“N”随着我们交付需求的增长而增长。每个反向代理的 RAM 都很重,并且每 GB 具有尽可能多的主轴。后端 Apache 服务器更“归档”并且主轴到 GB 的比例较低。
这是一个好的架构吗?有没有更好的处理方法?
这不是一个糟糕的架构(squid是一种流行的反向代理),但是如果您期望指数增长,内容交付网络可能是一个更好的解决方案 - 您只需为您需要的内容付费,带宽会立即扩展(您不必扩展更多服务器),流传输被定位到尽可能靠近客户端的服务器,确保它们获得最大的传输速度。但是,我从未尝试过使用 1GB 的文件,而且成本可能过高。
在这种情况下,Torrent 技术可以被视为 p2p CDN,因此其中一些提供商可能适合作为您的内容的种子种子,从而降低您的总带宽成本并(可能)提高速度,尽管这取决于您的 leechers。
如果您当前没有这样做,则可能值得研究通过 bittorrent 选择性地传送文件以将一些负载从您的服务器上推到 P2P 网络上。
我的问题是你怎么知道你是 IO 开始的?奇怪的是,您的磁盘无法跟上通过 HTTP 的下载(假设这里是这种情况,而不是 HTTPS)。
正如其他人所指出的,如果您拥有庞大的用户群,那么 CDN 解决方案似乎是适用的。我们使用 Akami 进行负载分配。这里的假设是您通过 PI(公共 Internet)提供这些文件,而某些内部托管解决方案仅在 100Mb 或 1000Mb 交换网络上提供。
您是否有可能将下载缓慢视为磁盘 IO 问题,而实际上它可能是 Internet 带宽问题?(再次,假设这是一个面向 PI 的站点)。
增加磁盘 IO 的方法有很多——可以使用 SAN 或 RAID;两者都提供了某种程度的缓存。我想不出任何 Internet 连接的容量会超过以 2Gb/s/hba 运行的单个 SAN HBA 或双 SAN HBA(组合)或通过 RAID 的本地存储以及通过 PCI-E 总线连接的缓存支持。
我们是在将 Gig-E 连接的客户端连接到同一连接的服务器吗?
您在这里尝试扩展的是您的 IO。
使用像 squid 或 varnish 这样的缓存代理是一种填充缓存以增加主轴的方法,而无需复制存档中的低/未使用文件。CDN 设备也会为您执行此操作。这些文件是媒体吗?CDN 设备也可以为您进行流式传输。
用户是否经常遇到文件下载失败并重新尝试下载?高重试率会大大增加你的 IO 需求。
您是否可以控制文件的获取方式?下载管理器可以在单独的块中获取每个文件,从而随着时间的推移将请求拆分到多个 apache 上(尽管它们也可以并行下载,使您的互联网管道饱和)。
作为“经验”参考,我只曾在将所有数据放置到 NAS(特别是 netapp)并使用带有 NFS 的 apache 来传递文件的环境中(尽管有许多较小的文件,而不是 1GB 的文件)。我们还使用 CDN 作为缓存代理来传输视频。
我见过的一种可能的架构使用 nginx 作为前端,它由多个 Varnish 实例支持。还考虑在该拱门上添加第二级初级清漆(即从主清漆中拉出清漆)。
除此之外,您应该考虑使用其他人提到的 CDN。根据您所服务的内容(媒体?),有一些专门的 CDN 更侧重于交付大文件,例如 BitGravity。
您的数据存放在哪些存储系统上?并且可以分区吗?
在物理上不同的 SAN 上拥有后端服务器,每个服务器都有一个数据子集,服务于反向代理前端机器会物理地吐出你的数据,但仍然让它们在逻辑上从外部得到相同的寻址。
Nginx在内存消耗和静态文件服务方面非常出色,因为它可以使用sendfile()卸载到内核。Lighttpd也应该看看,但我听说它不太稳定(关于内存消耗)但没有使用它。
前端服务器可以通过路径或模式拆分后端服务器上的请求(Nginx 具有强大的正则表达式支持。),如果您有需要,甚至可以重定向到不同的数据中心。DNS 循环也可能有用。
我已经成功地使用 Nginx 反向代理作为缓慢同步数据集之间的故障保护。它将测试该文件,如果它不存在,它将通过 http 询问后端服务器。稍后它将同步到前端机器并正常工作。
确保无论您做什么,您都可以全面监控统计数据。内存、io 等待、带宽、延迟、平均请求时间等。不监控你所做的任何事情都是在黑暗中拍摄。
我们所做的是使用MogileFS来冗余地存储我们的文件(通过将每个文件放在多个服务器上来实现冗余和可扩展性),但让用户访问通过 CDN 来提高速度和......嗯,更多的可扩展性。
我们使用较小的 CDN,PantherExpress——他们的定价很好,功能集也很棒。当我们四处逛逛时,Limelight Networks 和 EdgeCast 也给了我们很好的报价。
我喜欢 PantherExpress 为您提供有关其功能的良好技术文档,并且您可以以一个价格获得他们拥有的所有功能,而不是为此付出一点额外的钱,并为此付出更多的额外金钱。