处理将存储超过4 million
条记录per day
的系统
为了减少I / O并提高速度,我将存储从数据库更改为文件。因此数据将更改为json并直接写入文件。
系统是由PHP编写的ppc
系统,它通过iframe在几个站点中显示横幅,并拥有自己的服务器。
每当这个横幅加载到任何网站时,我都会在文件中存储一条信息(之前是对数据库的插入),并更新数据库中两个表中的两个字段。
当访问次数达到每分钟近3000次访问时,iframe加载速度会显着降低,有时会导致iframe中的打印服务器超时。
我正在寻找减少资源使用和提高加载速度以及防止超时的方法。
任何帮助都将受到高度赞赏......
答案 0 :(得分:9)
每分钟提出3k请求,并希望增长,您需要开始使用big data
架构和工具。
以下是一些需要考虑的主要亮点:
CDN
来存储和投放图片。mapReduce
软件存储数据,例如hadoop。distributed
的服务器,而不是一台巨大的服务器。load balancing
服务器。答案 1 :(得分:4)
在应用程序大小的这个特定点上,我将重点关注对基础架构和代码逻辑的两个具体改进。
通过分离这两个问题,您将能够为ppc
服务的客户提供更一致的性能。如果您还没有,使用CDN或以其他方式卸载从服务器提供图像本身的需求可以帮助大大缩短响应时间。
另一个可以带来巨大收益的领域是将横幅代码的服务与将展示数据存储到磁盘的进程分开。有很多方法可以做到这一点,但我有一个成功的解决方案是使用ActiveMQ(http://activemq.apache.org/)或类似的排队系统。排队系统将通过将印象数据存储在内存中并以一致的速率将这些数据点发送到可将该数据存储到数据库或其他存储介质中的消费者(即工作人员)进程,从而帮助平衡您的展示存储负载。这允许将实际存储在磁盘上的印象的工作量与提供广告的过程分开。您还可以设置多个进程来使用排队的作业,从而实现第二个改进领域。
构建可水平扩展的解决方案基本上意味着您可以添加额外的小型服务器,而不是需要增加单个服务器的大小和功能,从而均匀地共享系统需求的工作负载。这有多个优点,其中之一是将更多的小型服务器添加到池中更容易(通常更便宜),而不是将一个大型服务器升级为更大,更强大。它还具有在服务器发生故障时更加强大的优势。
在这种情况下,我认为一个好的解决方案是让一个服务器或进程充当路由器,它只是通过将请求发送到正在执行请求的实际处理的不同服务器来平衡请求。在互联网上有很多关于在PHP中构建路由或负载平衡脚本的良好资源,但基本上您将在一个端点接收请求,然后将该请求发送到另一个服务器以实际实现。如果您构建了准备接收请求的动态服务器列表,那么当您开始看到不可接受的性能时,您可以轻松增加满足请求的服务器数量。如果服务器发生故障,这也可以让您轻松地从列表中删除服务器,然后将任何流量路由到另一台仍然运行的服务器。
如果你还没有,那么最好将lighttpd(http://www.lighttpd.net/)或nginx(https://www.nginx.com/)作为Apache的替代品,它们可以处理大量的内容请求的开销较小。这些特别适合处理路由器服务器上的请求。
为请求设置水平扩展后,为存储服务器设置水平扩展也相当简单。您可以通过根据池中的服务器数量修改ID来轻松完成此操作,以确定将请求发送到何处。
$serverNumber = $adID % $availableServers;
虽然您可以通过优化存储方法和服务器调优来确实看到良好的性能改进,但在大型应用程序中的某些时候,您可能希望能够添加其他服务器来完成工作。我认为通过上述步骤,您可以非常好地扩展应用程序,因为它的大小会增加。
答案 2 :(得分:3)
通过利用现有的Apache访问日志记录充当您的展示跟踪器,您可以节省性能和开发时间,并完全关闭自定义数据库/平面文件读/写代码。
设置一个新的Apache虚拟主机,并将其指向系统webroot目录,您将单独负责提供您的广告生成PHP脚本。在这一个虚拟主机配置中,您可以设置系统访问日志,该日志100%专门用于投放广告; Apache将根据需要在每次访问(印象)和旋转/存档日志时附加到此日志。您可以指向存储日志的位置以及存储到哪种服务器/环境/引用者/用户代理数据。
然后,通过cron或守护进程,您可以运行您想要的任何后端日志分析器,将统计数据收集到数据库中,处理您的数字等,而不会将任何较重的提升与实时Web请求相关联。
我还在Stack Overflow上找到了使用此技术with lighttpd instead of Apache进一步扩展服务器资源的建议。
进一步阅读: