天天看點

實戰低成本伺服器搭建千萬級資料采集系統

有這樣一個采集系統的需求,達成名額:

需要采集30萬關鍵詞的資料 

微網誌必須在一個小時采集到

覆寫四大微網誌(新浪微網誌、騰訊微網誌、網易微網誌、搜狐微網誌)

為了節約客戶成本,硬體為普通伺服器:e5200 雙核 2.5g cpu, 4 g ddr3 1333記憶體,硬碟 500g sata 7200轉硬碟。資料庫為mysql。

在這樣的條件下我們能否實作這個系統目标?當然如果有更好的硬體不是這個文章闡述的内容。現通過采集、存儲來說明一下如何實作:

<a target="_blank"></a>

目标是在一個小時内把30萬關鍵詞對應的資料從四大微網誌采集下來,能夠使用的機器配置就是上面配置的普通伺服器。采集伺服器對硬碟沒有太多要求,屬于cpu密集型運算,需耗費一些記憶體。評估下來硬體資源不是瓶頸,看下擷取資料的接口有什麼問題?

可見即可抓的方式,結合反監控系統子產品模拟人的正常行為操作,搜尋30萬關鍵詞資料,使資源最大化利用。為了保證在一個小時采集到,需要采用分布式多線程模式抓取,并發采集。并發的時候不能從同一個ip或者同一個ip網段出去,保證對方不會監測到我們的爬蟲。

我們最後采用了第三種方式,目前運作狀況為通過30w關鍵詞搜尋得到的所有微網誌加在一起總量1000多w條每天,新浪和騰訊最多,新浪微網誌略勝一籌。

使用了6台普通pc伺服器,就算一台機器7000元,總共4萬元硬體裝置解決采集硬體問題。整體部署圖為:

實戰低成本伺服器搭建千萬級資料采集系統

海量采集系統部署圖

采集下來的資料如何處理?首先存儲采集資料是個密集寫的操作,普通硬碟是否能夠支援,mysql資料庫軟體能否支援,未來量突然增加如何應對?再就是評估存儲空間,每天增量這麼多需要耗費大量的存儲資源,如何存放并且易擴充。

正常來說我們上面配置的伺服器,mysql使用myisam引擎一張表最多20w,使用innodb引擎最多400w,如果超過這個數量,查詢更新速度奇慢。

這裡我們采用一個比較取巧的做法,使用mysql的innodb存儲引擎做了一層緩存庫,這個緩存庫有兩個緩存表,每個表隻存儲少于300w的資料,有一張表多于300w的資料就切換到另一張表插入直到超過300w再切換回去。

切換成功後,把多于300w資料的表truncate掉,記得一定要沒有資料插入的時候再truncate,防止資料丢失。

這裡一定要用truncate,不能使用delete,因為delete需要查詢,要用到索引讀寫,并且delete還會寫資料庫log耗費磁盤io,存儲空間也沒有釋放。truncate和drop是操作資料庫删除資料比較好的做法。

由于有兩個表作為資料插入表,使用資料庫表的自增id并不太合适,需要一個高速的唯一自增id伺服器提供生成分布式id。

另資料庫完全可以關閉寫事務日志 ,提高性能,因為抓取的資料當時丢失再啟動抓取就可以了, 這樣資料庫可以保持在一個比較高性能的情況完成插入操作。

抓取緩存表結果如圖:

實戰低成本伺服器搭建千萬級資料采集系統

抓取緩存表結構圖

插入後的資料需要儲存下來,不能在超過300w後被truncate掉了。

我們需要有個程式在達到300萬時被truncate掉之前把資料同步走,存放到另外一個庫上(我們叫做結果庫,結果庫也是使用innodb引擎)。不過我們每天采集的資料1000多萬,按天遞增,mysql一張表一天就撐爆了,我們這個表不是寫操作密集型,是以結果庫可以存儲多點資料,設定上限500w,但是500萬還是存不下1000萬資料。

我們需要對mysql最終結果分庫分表。将資料先按照時間分機器分庫,再按照資料源分表,比如201301通過hash計算的資料存放在一個機器,201302通過hash計算在另一個機器。到了機器後再按照天或者半天分表,比如表名為 weibo_2013020101 、weibo_2013020112。weibo_2013020101表示2月1日上午一個表,weibo_2013020112表示2月1日下午一個表。光這樣分了還是不夠,1000w/2=500w,經不起壓力擴充。我們還需要把表再拆分,比如weibo_2013020101 拆成 weibo_2013020101_1(新浪微網誌)、weibo_2013020101_2(騰訊微網誌)、weibo_2013020101_3(網易微網誌)、weibo_2013020101_4(搜狐微網誌)。

這樣一張表平均就存放 500w/4 = 125w 條資料,遠遠小于500w上限,還可以應對未來突發的增長。

再從存儲空間來算,就算一條微網誌資料為1k,一天 1000w*1k=10g,硬碟500g最多存放50天的資料,是以我們規劃機器的時候可以挂接多一點硬碟,或者增加機器。

結果庫分表如圖:

實戰低成本伺服器搭建千萬級資料采集系統

分庫分表結構圖

按照這樣的架構,我們使用開源免費軟體、低成本伺服器搭建的千萬級資料采集系統在生産運轉良好。

原文釋出時間為:2013-09-07

本文來自雲栖社群合作夥伴“linux中國”