張斌 楊彥松 廖雨寒
一、背景
隨著互聯網的高速發展,網絡上的數據量呈現爆發式的增長。單節點運行的爬蟲系統,在性能等各方面都無法滿足現有的業務需求。因此網絡爬蟲基于多節點的分布式協同運行方案成為解決爬蟲性能瓶頸的不二之選。而作為分布式系統的存儲中間件,key-value數據庫(redis和pika)在數據結構的支持,高吞吐的性能,接口的易用性等方面都是不錯的選擇。
二、Redis和Pika
Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value高性能存儲系統。它支持存儲多種類型的value,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)等。這些數據類型都支持push/pop、add/remove、取交集、并集、差集及更豐富的操作,而且這些操作都是原子性的。與傳統的內存數據庫一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
Pika是一個開源的可持久化的大容量類redis存儲系統。兼容redis的string、hash、list、zset、set等絕大部分的數據接口,不用修改代碼即可平滑從redis遷移到pika。主要解決redis由于存儲數據量巨大而導致內存不足的內存容量瓶頸,并且可以像redis一樣,通過slaveof命令進行主從備份,支持全同步和部分同步,pika還可以用在twemproxy或者codis中來實現靜態數據分片
本文針對兩種存儲系統,在分布式爬蟲系統中的應用,進行對比,以供參考。
三、兩種數據庫對比
1)Redis:高性能的key-value存儲解決方案。
優勢:
1.高性能:作為內存數據庫,redis擁有超高的吞吐性能;
2.多樣化的數據存儲結構:redis支持string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)等;
劣勢:
1.大數據量存儲承載能力有限,存儲成本高;
2.單線程運行方式易阻塞,相對比較脆弱。
2)Pika:利用磁盤存儲來解決redis的內存容量瓶頸。
優勢:
1.使用Redis協議,兼容redis絕大多數命令,為兩種數據庫共存提供基礎;
2.使用磁盤存儲,解決redis大數據量存儲瓶頸;
3.使用多線程模式,相對比較健壯。
劣勢:
1.受磁盤限制,整體性能相對較差,吞吐量是瓶頸,當吞吐量過高時會出現數據丟失的情況;
2.缺少成熟的集群多節點擴展方案;
3.不支持分庫,對于多業務邏輯分類的場景不太友好。
四、分布式爬蟲系統
目前爬蟲系統進行頁面抓取的主要流程:調度器(Scheduler)接收到request并放入隊列進行排序、去重、轉發等操作,下載器(Downloader)從隊列獲取到待下載的request,從網絡獲取到頁面數據后,提供給爬蟲(spider)進行分析處理。爬蟲從數據中提取新的request給調度器,同時將結構化數據(item)交給數據管道(item pipeline)進行存儲分發等操作。具體流程參考scrapy框架結構圖如下:
要實現分布式爬蟲,首先需對調度器進行修改,用網絡存儲中間件替換本地隊列,通過網絡存儲中間件對request進行多節點分發,同時還需要用中間件存儲request指紋從而實現去重。
五、鍵值型數據庫在分布式爬蟲系統中的應用
要實現上述功能改造,redis這類的高性能key-value數據庫就目前來說是最佳的適用方案。首先redis的高性能能夠保證大量節點進行request的讀取,同時redis支持多種數據結構及其接口,能夠很方便的實現各種隊列的業務邏輯。其中可以用list實現FifoQueue和LifoQueue,用zset實現PriorityQueue,用set實現RFPDupeFilter。同時還可以使用list或者pub/sub來實現多任務調度和分發,不需要再另外引入kafka、MQ這類的消息隊列來做多任務管理,從而減小整個爬蟲系統的架構體積;雖然redis能充分滿足整個爬蟲系統的分布式需求,可是在某些場景下,redis會出現瓶頸;其中存儲容量則是最主要的瓶頸。
在爬取過程中,一個request序列化之后大約占用1KB左右的存儲空間,1GB內存則只能處理大約100萬個request。因為訪問控制之類的原因,爬取一個擁有千萬級頁面的網站,redis就需要大約10GB左右的內存。一臺64G內存的服務器也僅僅只能支持5-7個大型爬取任務的同時執行。
因此引入pika這種以磁盤為主要存儲的類redis數據庫。pika在保留了redis多樣化數據結構的同時,極大的擴展了數據存儲容量,從而解決request的容量瓶頸。
可是pika的無集群模式,同樣對pika的性能產生很大的制約。在不使用SSD硬盤的情況下,只是單獨使用pika會出現大量的慢查詢,導致部分數據丟失的情況。因為沒有集群模式來實現多實例負載均衡,所以pika的性能擴展成本將比redis高不少。
最終在多任務分布式爬蟲系統中,需要用redis和pika兩種中間件來支持整個爬蟲系統的運行。其中redis負責request指紋和任務調度之類高吞吐量的業務,pika則負責request分發這種需要高存儲容量的業務。
六、結束語
以上對Redis和Pika兩種key-value存儲方案在分布式爬蟲系統中的應用做了描述,這兩種方案在實際生產環境中相輔相成,互相配合,才能支撐起一個功能健壯,性能強大的成熟的多任務分布式爬蟲系統。
審核編輯:符乾江
-
應用軟件
+關注
關注
0文章
50瀏覽量
9074 -
Redis
+關注
關注
0文章
371瀏覽量
10846
發布評論請先 登錄
相關推薦
評論