最佳做法,PHP,每天跟踪数百万次展示

时间:2009-12-08 03:04:16

标签: php mysql logging

我需要做些什么才能实现每秒20k mysql插入(在高峰时段,在较慢的时间内大约1k /秒)?我一直在做一些研究,我已经看到了“INSERT DELAYED”建议,写入平面文件,“fopen(文件,'a')”,然后运行chron作业将“所需”数据转储到mysql等我也听说你需要多个服务器和“负载均衡器”,这是我从未听说过的,做这样的工作。我也一直在关注这些“云服务器”,它们的自动可扩展性,但不确定实际可扩展性。

该应用程序只是一个跟踪器脚本,所以如果我有100个网站每天可以获得300万页面加载,那么每天将有大约3亿个插入。数据将通过一个每15-30分钟运行一次的脚本运行,该脚本将规范化数据并将其插入另一个mysql表中。

大狗怎么做?小狗怎么做的?我再也买不起庞大的服务器,所以任何直观的方式,如果有多种方式可以解决它,你聪明的人可以想到..请让我知道:)。

8 个答案:

答案 0 :(得分:5)

  

大狗怎么做?

多台服务器。负载平衡。

  

小狗怎么做?

多台服务器。负载平衡。

您确实想要保存插件并将它们批量推送到数据库。 20k个单独插入一秒钟就是头顶上的掠夺者,并且每秒插入一个大插入物就可以消除大部分插入物。

答案 1 :(得分:5)

有两种方式:

首先,您将达到需要对数据进行分区或分片以将其拆分到多个服务器的程度。这可以像server1上的A-C,server2上的D-F一样简单,等等。

其次,推迟写入数据库。而是直接使用beanstalkd或memcached写入快速内存存储。让另一个进程收集这些状态并将聚合数据写入数据库。定期将这些记录合并为摘要数据。

答案 2 :(得分:2)

这令人印象深刻。我的大多数数据都来自大量插入。我发现的一件事是批量插入比单个插入更好。此外,表格,索引等的设计与插入速度有很大关系。使用cron和批量插入的问题是边缘情况。 (当它去做插入)。

另外还有flatfiles。通过将插入写入文件,您可以轻松地遇到并发问题。如果您正在写1k +插入s,那么当文件写入有问题时,您将很快遇到许多冲突和丢失。

答案 3 :(得分:1)

这不是您可以单独使用PHP处理的问题。

如果你有2万个请求,一秒钟就会达到你的“低预算”(正如我对你的问题的暗示所理解的那样)服务器,那么它将达到其极限,然后大多数人达到PHP处理器(最终是MySQL)。

如果您有流量跟踪器脚本,则很可能会导致您跟踪的所有网站出现问题。

答案 4 :(得分:1)

PHP不适合大量网络流量恕我直言。但是,数据库可能会在PHP性能之前让您陷入困境 - 特别是使用PHP的连接模型(为每个请求打开一个新连接)。

我有两条建议:

  1. 让SQL Relay看一看:http://sqlrelay.sourceforge.net/
  2. 查看一些PHP加速器:http://en.wikipedia.org/wiki/List_of_PHP_accelerators
  3. SQL Relay有效地允许PHP利用连接池,这将为高容量数据库应用程序提供更好的性能。

    PHP加速器(一般来说)缓存PHP操作码,这节省了每次请求解释PHP代码的开销。

    祝你好运!

答案 5 :(得分:1)

我也建议使用memcaching。

将您的数据写入内存缓存并定期运行作业聚合并执行插入操作。

写入实际文件可能会降低您的性能,因为文件系统访问速度大大低于与能够更有效地处理写入访问的数据库交谈。

答案 6 :(得分:0)

写入文件很棒,但您仍然需要同步文件写入,这会使您回到原点。

建议:

  • MQ系统,虽然有时DB可以更快,
  • 关于MQ的想法:内存中队列。我知道你说的是PHP,但我在Java / Servlets中已经看到了这一点,
  • 根据您正在跟踪的内容,您可以将静态文件部署到CDN(您谈到的云事物)中,并批量聚合访问日志。允许您租借扩展,
  • INSERT DELAYED好主意,但我不知道MySQL的积压/队列大小是什么? (任何人)

答案 7 :(得分:0)

由于您正在跟踪展示次数,如果只尝试保存,例如每5次一次,那该怎么办呢?那么您仍然拥有一个完全“随机”的样本,您只需将百分比应用于更大的数据集。