Php 此应用程序堆栈是否会遇到加载问题?

Php 此应用程序堆栈是否会遇到加载问题?,php,apache,logging,nginx,lighttpd,Php,Apache,Logging,Nginx,Lighttpd,我正在设计一个文件下载网络 最终目标是拥有一个API,让您可以直接将文件上载到存储服务器(无网关或其他)。然后,该文件被存储并引用到数据库中 当文件被重新要求时,将从数据库中选择当前保存该文件的服务器,并执行http重定向(或者API提供当前有效的直接URL) 后台作业负责对文件进行所需的复制,以实现持久性/扩展性 后台作业还可以移动文件,以确保服务器在磁盘和带宽使用方面的工作负载均匀 任何时候都没有突袭之类的事情。每个驱动器都作为JBOD挂在服务器上。所有复制都在应用程序级别。如果一台服务器出

我正在设计一个文件下载网络

最终目标是拥有一个API,让您可以直接将文件上载到存储服务器(无网关或其他)。然后,该文件被存储并引用到数据库中

当文件被重新要求时,将从数据库中选择当前保存该文件的服务器,并执行http重定向(或者API提供当前有效的直接URL)

后台作业负责对文件进行所需的复制,以实现持久性/扩展性

后台作业还可以移动文件,以确保服务器在磁盘和带宽使用方面的工作负载均匀

任何时候都没有突袭之类的事情。每个驱动器都作为JBOD挂在服务器上。所有复制都在应用程序级别。如果一台服务器出现故障,它只会在数据库中标记为已断开,后台作业将负责从正常来源进行复制,直到再次达到所需的冗余

系统还需要准确的统计数据,以便进行监控/平衡,并可能在以后进行计费

因此,我考虑了以下设置

  • 该环境是一个经典的Ubuntu、Apache2、PHP、MySql和LAMP堆栈

  • 访问当前存储服务器的url是由API生成的(目前还没有问题,只是一个经典的PHP网站和MySQL数据库)

现在它变得有趣了

  • 存储服务器运行Apache2,PHP脚本捕获请求。验证URL参数(安全令牌哈希)。验证IP、时间戳和文件名,以便授权请求。(不需要数据库连接,只需要知道秘密令牌的PHP脚本)

  • PHP脚本将文件hader设置为使用apache2

  • Apache提供mod_xsendfile传递的文件,并配置为将访问日志管道传输到另一个PHP脚本

  • Apache运行mod_logio,访问日志在中,但附加了%D变量(服务请求所用的时间,以微秒为单位),以计算网络和其他设备中的传输速度

  • 然后,管道访问日志转到一个PHP脚本,该脚本解析url(第一个文件夹是一个“bucked”,就像google storage或amazon s3分配了一个客户机一样。因此客户机是已知的)统计输入/输出流量并增加数据库字段。出于性能原因,我考虑使用每日字段,并将其更新为traffic=traffic+X,如果没有行被更新,则创建它

我必须提到的是,服务器将是低预算的服务器与大规模的战略

可以仔细查看本文档中的预期设置

关键数据是,系统将具有千兆吞吐量(24/7最大值),fiel请求将相当大(因此没有图像或小文件负载,这些图像或负载会通过大量日志行和请求产生高负载)。可能是平均500MB左右

目前计划的安装运行在廉价的消费级主板(asus)、2GB DDR3 RAM和AMD Athlon II X2 220、2x 2.80GHz托盘cpu上

当然,下载管理器和范围请求将是一个问题,但我认为访问的平均大小将至少在50兆左右

因此,我的问题是:

  • 我在这个流程中有什么严重的瓶颈吗?你能发现什么问题吗

  • 我假设mysql\u impacted\u rows()可以直接从上一个请求读取,而不向mysql服务器发出另一个请求,这对吗

  • 您认为具有上述规格的系统可以处理此问题吗?如果没有,我该如何改进?我想第一个瓶颈是CPU,不是吗

  • 你觉得怎么样?你有什么改进的建议吗?也许是完全不同的东西?我考虑过使用Lighttpd和mod_secdownload模块。不幸的是,它不能检查IP地址,我不是那么灵活。它的优点是下载验证不需要启动php进程。但是由于它只运行了很短的时间,不读取和输出数据本身,我认为这是可以的。你…吗?我曾经在旧的一次性电脑上使用lighttpd进行下载,性能非常棒。我也想过使用nginx,但我没有这方面的经验。但是

  • 您认为如何将管道日志输出到直接更新数据库的脚本?我是否应该将请求写入作业队列,并在第二个可以处理延迟的进程中在数据库中更新它们?或者干脆不做,而是在晚上解析日志文件?我的想法是,我希望它尽可能实时,并且除了中央数据库之外,我不会在其他地方积累数据。我也不想跟踪所有服务器上运行的作业。这可能是一个混乱的维持。应该有一个简单的单元测试,生成一个安全链接,对其进行降级,并检查是否一切正常,日志是否已经发生

  • 还有什么建议吗?我很高兴你能提供任何意见

  • 我还计划把这一切都打开。我只是认为需要有一个开源的替代品来替代昂贵的存储服务,比如面向文件下载的AmazonS3

  • 我真的找了很多,但是没有找到像这样的东西。当然,我会重复使用现有的解决方案。更喜欢开源。你知道这样的事吗

MogileFS,--这几乎就是你想要的东西。

我假设mysql受影响的行()可以直接从上一个请求中读取,而不向mysql服务器执行另一个请求,对吗?没有。=\n我真的找了很多,但没有找到像这样的东西。当然,我会重复使用现有的解决方案。更喜欢开源。你知道这样的事吗?你想做的事情看起来很像一个快速共享的共享储物柜