1. 程式人生 > >MySQL百萬級高併發網站實戰攻略

MySQL百萬級高併發網站實戰攻略

本人小菜鳥一隻,為了自我學習和交流PHP(jquery,linux,lamp,shell,javascript,伺服器)等一系列的知識,小菜鳥建立了一個群。希望光臨本部落格的人可以進來交流。尋求共同發展。搭建平臺。本人部落格也有許多的技術文件,希望可以為你提供一些幫助。

QQ群: 191848169


在一開始接觸PHP接觸MYSQL的時候就聽不少人說:“MySQL就跑跑一天幾十萬IP的小站還可以,要是幾百萬IP就不行了”,原話不記得了,大體就是這個意思。一直也沒有好的機會去驗證這個說法,一是從沒有接手過這麼大流量的網站,二是平時工作也比較忙,懶得去管這些,反正現在用不著,抱著這個想法把這個問題一直留到了最近,才把這個問題搞明白。

  就在前幾天公司旗下一網站(由於這是公司的商業內容我就不說是那個網站了)以下簡稱A站,這A站在年後流量猛增從一天的七八十萬猛跑到了好幾百萬的IP,一天下來接近一千萬的PV讓整個伺服器在高壓下超負荷的工作著,時不時的服務就出現宕機。

  最首先反映出情況的是資料統計,一天下來一個數據也沒有統計上,原來是MySQL停止工作了。

  本文就圍繞這個問題來講講我們公司幾個技術人員的解決方案。

  1. MySQL伺服器叢集

  由於是小公司在資金和成本上都有所限制,而且在技術上也沒有幾個技術員接觸過,所以這個方法自然就讓大夥否決了。

  這裡說說我個人的理解!做叢集不但新增資費的開銷,而且在技術上也有很大的挑戰,對於我們公司目前的情況是不大現實的。叢集無非就是把一臺伺服器的壓力轉接到兩臺或是多臺伺服器上,我是這麼理解的,也許我理解有誤,還請大家指教。

  2. 分而治之

  這個方法和叢集差不多,不過是把統計的程式碼放在不同的伺服器上跑,由於公司有不少配置低的伺服器跑幾萬到幾十萬IP還是沒有問題的,我們可以把幾百萬流量分成十來個幾十萬的量分而統計。

  優點:充分的利用了現在的資源,解決了目前的問題。

  缺點:這樣的方法不是長久之計,遲早還是會出問題的。而且在統計資料的時候比較麻煩。

  3. 統計程式碼的修改

  由於之前採用的是在插入資料之前加以判斷,這個IP是否存在,來路等的處理,無形中增加了伺服器的壓力,所以大夥把統計程式碼改成來一個就插入資料庫,不管三七二十一等以後在處理。

  這個方法基本上把當天的資料保留下來了,可是在處理的時候由於資料量的龐大,來來回回還是把伺服器跑死了,而且在插入的時候由於當時設計資料結構的時候留有的索引,也大大的消耗了不少的伺服器資源。

  那麼把索引去掉到最後處理的時候又是老慢的,得不償失。

  4. 統計方式的修改

  最後這一個方法,效果非常的明顯。那是什麼方法呢!

  這裡就主要介紹這個方法:

  A、 保留原用的資料結構不變,並把所有的資料按一定的結構存入檔案

  結構:可以是xml,json,也可以是你自己想的任何有規律的資料排放。

  例如:

  1 221.2.70.52,http://www.baidu.com,windowxp\r\n

  2 221.2.70.52,http://www.baidu.com,windowxp\r\n

  寫入檔案:fopen,fwrite??no 這裡介紹一個非常好用的技巧,也許大家都知道,但是像我這樣的菜鳥大概都不知道,那就是用error_log,這不是寫錯誤日誌的嗎?對就是他,非常方便。

  格式:

  1 error_log("內容", 3, "/date.dat");

  這裡我就不說他的具體用了,不明白的朋友可以查一下手冊。

  B、資料檔案的命名

  為什麼這裡要講檔案的命名呢?如果就一味的把資料的寫入檔案不作任何的處理那麼他和直接插入資料庫有多大的區別呢?那麼我們所作的一切都是無用功了。

  首先是在時間的利用上:date(‘YmdH’)得到的值是如:2008121112這有什麼好入,這樣一來這個資料就是一個小時一個檔案必免了檔案過大,而且不用去判斷自動生成。

  IP的應用:由於在很多資料上都是一個IP操作的,所以把相同IP的資料放在一個檔案裡在後面的處理就非常方便處理。請看後面的介紹,這裡我們取IP成三位為檔名字的一部分。

  C、資料的匯入處理

  通過以上兩位的操作當天的資料會一個不少的保留下來,接下來怎麼處理其實並不是很重要了。但是這裡還是講講我的想法。

  入庫前處理:

  前面講到把IP三位相同的放一個檔案就是為了入庫前到它們進行處理,首先可以用最笨的方法把資料拆成N個數據。在進行重複資料的刪除。

  如果一個IP瀏覽多頁那麼PV在這裡就可以得到統計,並把訪問的頁面進行處理,組成新的資料。

  匯入方法:

  這裡要介紹一下資料的匯入方法

  1 $sql="LOAD DATA INFILE '".$file."' INTO TABLE `test` FIELDS TERMINATED BY ',

  ' LINES TERMINATED BY '\r\n'(2 3 `time` , `md5`4 5 )";

  就這一個語句,在匯入幾十萬資料的時候可以說是十分快速的,用法我這裡也不過多介紹了,大家有不明白的可以查手冊,所以說解決資料庫的瓶頸的辦法不定要加裝置,也不一定要換資料庫,只要換一個思路就能解決不少問題。