刚开始接触PHP和MYSQL的时候,听到很多人说:“MySQL可以跑一个小网站一天几十万个IP,我可以”tdoitanymore”,我不记得原话了,但大概是这个意思。我一直没有很好的机会来验证这个说法。一是我从来没有接手过流量这么大的网站。还有一个就是平时工作比较忙,懒得去管。反正我现在不需要。直到最近我才弄明白这一点。就在前几天,公司旗下的一个网站(因为这是公司的业务内容,就不说是那个网站了)以下简称A站,这个A站的访问量从70万飙升到80万每天上百万的IP,每天近千万的PV,让整个服务器在高压下不堪重负,时不时出现服务崩溃的情况。首先反映情况的是数据统计。没有一天的统计数据。原来MySQL停止工作了。本文将围绕这个问题谈谈我公司几位技术人员的解决方案。1、由于MySQL服务器集群是一家小公司,资金成本有限,技术上接触过的技术人员也很少,这种方式自然被大家否决了。在这里说说我个人的理解吧!建立集群不仅增加了关税成本,而且对技术提出了很大的挑战,这对于我们公司目前的情况来说是不现实的。集群无非是将一台服务器的压力转移到两台或多台服务器上。我是这样理解的。也许我错了。请指教。2、分而治之的方法类似于聚类,只是统计代码运行在不同的服务器上。由于公司服务器多,配置低,跑个几万到几十万个IP是没有问题的。几千个流量分成十个或者几十万个量点统计。优点:充分利用现有资源,解决现有问题。缺点:这种方法不是长久之计,迟早还是会出问题。而且统计数据的时候比较麻烦。3.统计码的修改用于插入数据前判断IP是否存在,来源等,无形中增加了服务器的压力,所以大家把统计码改成一个插入到数据库。不管三七二十一之类的,以后再处理。这种方式基本上保留了当天的数据,但是由于处理的时候数据量巨大,服务器还在来回跑死,而且在插入的时候,由于当时设计数据结构时留下的索引,它还消耗了大量的服务器资源。然后直到最后处理才去掉索引太慢了,得不偿失。4.统计方法的修改最后一种方法效果非常明显。那是什么方法!下面是该方法的主要介绍:A.保持原有的数据结构不变,将所有的数据按照一定的结构存储在一个文件结构中:可以是xml,json,也可以是你想要的任何有规律的数据发射。例如:1221.2.70.52,http://www.baidu.com,windowxp\r\n2221.2.70.52,http://www.baidu.com,windowxp\r\n写入文件:fopen,fwrite??no这里介绍一个非常有用的技巧,可能大家都知道,但是像我这样的菜鸟估计不知道,那就是使用error_log,这不就是写错误日志的吗?是的,很方便。格式:1error_log("内容",3,"/date.dat");这里就不说它的具体使用了,不懂的朋友可以查看手册。B.数据文件的命名这里为什么要讲文件的命名呢?如果我们只是一味的将数据写入文件,不做任何处理,那和直接插入数据库有什么区别呢?那么我们所做的一切都是无用的。首先,在时间的使用上:date('YmdH')得到的值如:2008121112有什么好说的,这样数据每小时一个文件,避免文件太大,还有不需要判断自动生成。IP的应用:由于很多数据都是由一个IP操作的,所以将同一个IP的数据放在一个文件中,方便以后处理。请看后面的介绍,这里我们把IP分成三位作为文件名的一部分。C.数据导入处理通过以上两个操作,当天的很多数据都会被保存下来,如何处理并不是很重要。但这是我的想法。入库前处理:前面说了,将相同的三个IP放在一个文件中的目的是在入库前进行处理。首先,可以用最笨的方法,把数据拆分成N份数据。正在进行重复数据删除。如果一个IP浏览了多个页面,那么PV可以在这里统计,对访问过的页面进行处理,形成新的数据。导入方式:这里介绍一下数据导入方式1$sql="LOADDATAINFILE'".$file."'INTOTABLE`test`FIELDSTERMINATEDBY','LINESTERMINATEDBY'\r\n'(23 `时间`,`md5`45 )";光是这条语句在导入几十万条数据的时候可以说是非常快了。这里就不介绍太多的用法了。懂的可以去查手册,所以解决数据库瓶颈不一定需要增加设备,也不一定需要换数据库,只要换个思路就可以解决很多问题。【小编推荐】MySQL鲜为人知的特殊技能MySQL数据库UPDATE更新语句细化PHP数据从Oracle迁移到MySQL数据实例
