在長時(shí)間的網(wǎng)站開發(fā)過程中,能作一個百萬ip的網(wǎng)站對我來說真是一個新的挑戰(zhàn),由于本人的水平有限,所以一直就職于一個小公司,在這里也只是抱著重在參與的想法。在以后我所講述到的內(nèi)容知識點(diǎn)上如有不適之處請大家多多批評指教。
在一開始接觸php接觸mysql的時(shí)候就聽不少人說:“mysql就跑跑一天幾十萬ip的小站還可以,要是幾百萬ip就不行了”,原話不記得了,大體就是這個意思。一直也沒有好的機(jī)會去驗(yàn)證這個說法,一是從沒有接手過這么大流量的網(wǎng)站,二是平時(shí)工作也比較忙,懶得去管這些,反正現(xiàn)在用不著,抱著這個想法把這個問題一直留到了最近,才把這個問題搞明白。 就在前幾天公司旗下一網(wǎng)站(由于這是公司的商業(yè)內(nèi)容我就不說是那個網(wǎng)站了,免得有兄弟說是ad)以下簡稱a站,這a站在年后流量猛增從一天的七八十萬猛跑到了好幾百萬的ip,一天下來接近一千萬的pv讓整個服務(wù)器在高壓下超負(fù)荷的工作著,時(shí)不時(shí)的服務(wù)就出現(xiàn)當(dāng)機(jī)。 最首先反映出情況的是數(shù)據(jù)統(tǒng)計(jì),一天下來一個數(shù)據(jù)也沒有統(tǒng)計(jì)上,原來是mysql掛了。 本文就圍繞這個問題來講講我們公司幾個技術(shù)人員的解決方案。 1. mysql服務(wù)器集群 由于是小公司在資金和成本上都有所限制,而且在技術(shù)上也沒有幾個技術(shù)員接觸過,所以這個方法自然就讓大伙否決了。 這里說說我個人的理解!做集群不但添加資費(fèi)的開銷,而且在技術(shù)上也有很大的挑戰(zhàn),對于我們公司目前的情況是不大現(xiàn)實(shí)的。集群無非就是把一臺服務(wù)器的壓力轉(zhuǎn)接到兩臺或是多臺服務(wù)器上,我是這么理解的,也許我理解有誤,還請大家指教。 2. 分而治之 這個方法和集群差不多,不過是把統(tǒng)計(jì)的代碼放在不同的服務(wù)器上跑,由于公司有不少配置低的服務(wù)器跑幾萬到幾十萬ip還是沒有問題的,我們可以把幾百萬流量分成十來個幾十萬的量分而統(tǒng)計(jì)。 優(yōu)點(diǎn):充分的利用了現(xiàn)在的資源,解決了目前的問題。 缺點(diǎn):這樣的方法不是長久之計(jì),遲早還是會出問題的。而且在統(tǒng)計(jì)數(shù)據(jù)的時(shí)候比較麻煩。 3. 統(tǒng)計(jì)代碼的修改 由于之前采用的是在插入數(shù)據(jù)之前加以判斷,這個ip是否存在,來路等的處理,無形中增加了服務(wù)器的壓力,所以大伙把統(tǒng)計(jì)代碼改成來一個就插入數(shù)據(jù)庫,不管三七二十一等以后在處理。 這個方法基本上把當(dāng)天的數(shù)據(jù)保留下來了,可是在處理的時(shí)候由于數(shù)據(jù)量的龐大,來來回回還是把服務(wù)器跑死了,而且在插入的時(shí)候由于當(dāng)時(shí)設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)的時(shí)候留有的索引,也大大的消耗了不少的服務(wù)器資源。 那么把索引去掉到最后處理的時(shí)候又是老慢的,得不償失。 4. 統(tǒng)計(jì)方式的修改 最后這一個方法,效果非常的明顯。那是什么方法呢! 這里就主要介紹這個方法: a、 保留原用的數(shù)據(jù)結(jié)構(gòu)不變,并把所有的數(shù)據(jù)按一定的結(jié)構(gòu)存入文件。 結(jié)構(gòu):可以是xml json,也可以是你自己想的任何有規(guī)律的數(shù)據(jù)排放。 例如: 1 221.2.70.52 http://www.baidu.com windowxp\r\n 格式: 1 error_log(" 內(nèi)容" 3 " /date.dat" ) b、數(shù)據(jù)文件的命名 為什么這里要講文件的命名呢?如果就一味的把數(shù)據(jù)的寫入文件不作任何的處理那么他和直接插入數(shù)據(jù)庫有多大的區(qū)別呢?那么我們所作的一切都是無用功了。 首先是在時(shí)間的利用上:date(‘ymdh’)得到的值是如:2008121112這有什么好入,這樣一來這個數(shù)據(jù)就是一個小時(shí)一個文件必免了文件過大,而且不用去判斷自動生成。 ip的應(yīng)用:由于在很多數(shù)據(jù)上都是一個ip操作的,所以把相同ip的數(shù)據(jù)放在一個文件里在后面的處理就非常方便處理。請看后面的介紹,這里我們?nèi)p成三位為文件名字的一部分。 c、 數(shù)據(jù)的導(dǎo)入處理 通過以上兩位的操作當(dāng)天的數(shù)據(jù)會一個不少的保留下來,接下來怎么處理其實(shí)并不是很重要了。但是這里還是講講我的想法。 入庫前處理: 前面講到把ip三位相同的放一個文件就是為了入庫前到它們進(jìn)行處理,首先可以用最笨的方法把數(shù)據(jù)拆成n個數(shù)據(jù)。在進(jìn)行重復(fù)數(shù)據(jù)的刪除。 如果一個ip瀏覽多頁那么pv在這里就可以得到統(tǒng)計(jì),并把訪問的頁面進(jìn)行處理,組成新的數(shù)據(jù)。 導(dǎo)入方法: 這里要介紹一下數(shù)據(jù)的導(dǎo)入方法 1 $sql=" load data infile ' " .$file." ' into table `test` fields terminated by ' ' lines terminated by ' \r\n' ( |
|