聚信立:做最好的爬蟲,從底層説起

做基於大數據的風控,首先得有大數據,要有大數據,就需要從互聯網上採集,而互聯網數據採集的程序,大家都稱之為“爬蟲”。其實,互聯網上的爬蟲應該説無處不在,大到人盡皆知的谷歌百度,小到各式各樣的刷票工具,毫不誇張地説,爬蟲之於大數據,就像是一羣搬大象的螞蟻,晝夜忙忙碌碌,推動的是整個互聯網世界的數據流動。
聚信立是最早一批把爬蟲應用到風控領域的企業,作為業內的標杆,聚信立對爬蟲技術的打磨幾乎是到了精益求精的地步。
大家可能都知道,爬蟲開發的技術門檻實際並不很高,開發一個簡單網站的爬蟲,每天自動爬100次,對一個有經驗的程序猿來説只要一天,但是問題來了,如果網站需要登錄呢?如果有100個網站呢?每天要爬100萬次呢?網站每幾天會改版呢?如何提供7*24小時的穩定服務?這樣的問題層出不窮。
因此,一個完整的爬蟲服務通常需要以下幾個子系統:爬蟲系統、數據解析系統、查詢分析系統,可能還有分佈式存儲系統。面對各種互聯網應用,爬蟲實現的方式可能各異,但是一個優秀的爬蟲系統應具備以下幾種特徵:
高性能:儘可能在最短的時間內抓取目標頁面,並完成解析入庫;
易維護:能夠快速的增加目標數據源,並且可以及時的應對反爬措施;
易擴展:能夠根據業務需求、資源使用情況,很容易的對爬蟲服務規模自由擴展。
而風控領域一個生產級別的爬蟲服務,日常管理幾千個並行工作的爬蟲節點是最基礎的要求,那麼,本文拋磚引玉,先跟大家聊聊爬蟲節點集羣的技術選型。
老生常談:KVM vs Docker
做爬蟲節點的集羣,首先的選擇一定是KVM虛擬機,最成熟的解決方案。用一張圖簡單介紹一下虛擬機的原理:
§ 基礎設施(Infrastructure)。它可以是你的個人電腦,數據中心的服務器,或者是雲主機。
§ 宿主操作系統(Host Operating System)。你的個人電腦之上,運行的可能是MacOS,Windows或者某個Linux發行版。
§ 虛擬機管理系統(Hypervisor)。利用Hypervisor,可以在主操作系統之上運行多個不同的從操作系統。類型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。類型2的Hypervisor有VirtualBox和VMWare。
§ 虛擬操作系統(Guest Operating System)。假設你需要運行3個相互隔離的爬蟲節點,則需要使用Hypervisor啓動3個虛擬操作系統,也就是3個虛擬機。

顯然,每個虛擬機自帶獨立的GUEST OS,在保證了虛擬機應用的隔離性的同時,也帶來了大量的資源開銷,無論硬盤、CPU還是內存,這種需求驅動下,Docker容器帶着下一代虛擬機技術的光環出現了。


如圖,與KVM最大的區別是Docker Daemon(守護進程),取代了Hypervisor,它是運行在操作系統之上的後台進程,利用Linux的LXC技術,管理Docker容器。Docker守護進程可以直接與宿主操作系統進行通信,為各個Docker容器分配資源;它還可以將容器與宿主操作系統隔離,並將各個容器互相隔離。
由於每個Docker容器不需要包含一套獨立的Guest OS,與其他容器共享了大部分系統資源,因此性能方面優勢巨大,單機部署上千個節點成為可能,而所有節點,可以通過一個標準的鏡像文件來管理配置,一次配置,在任何地方都可以正常運行。這些特性,對於爬蟲節點集羣來説,是非常有吸引力的。
但是我們也知道,Docker在2013年橫空出世以後,雖然倍受追捧,但始終沒有達到完全替代KVM的程度,畢竟,Docker的設計初衷也不是一個KVM的替代品。從我們在爬蟲集羣的實踐層面看,Docker集羣由於在隔離性方面的先天缺陷,對網絡資源和存儲IO方面有許多瓶頸,比如説同一台物理機各個爬蟲節點之間,如何有效分配CPU和帶寬,從而保證互不爭用?容器與宿主共用內核,存在安全隱患,如何防範容器對宿主的逃逸?凡此種種,使得我們在大規模使用Docker作為爬蟲集羣底層框架上持謹慎態度。
Hyper:真正的下一代虛擬機?
KVM和Docker之後,Hyper是我們近期最關注的虛擬機項目,原因就是它着手從根本上解決Docker的隔離性問題,同時又保持了可與Docker媲美的性能。還是一張圖説明:

簡單的説,同樣在hypervisor的基礎上,hyper的做法是採用guest kernel取代了guest OS,其實就是對OS的一個極致優化,省掉不必要的硬件掃描、設備初始化和引導過程等,使每個hyper容器只需要搭載一個足以承載應用的內核,而非一個完全模擬物理機的操作系統,從而大大降低了VM的開銷。同時,由於每個容器都有各自獨立的內核,並且和宿主操作系統的內核也分離開來,所有Hyper也繼承了KVM那種硬件強制級別的隔離性。

再一次,將Hyper與docker&kvm做下比較,應該説Hyper是一個技術層面有很大突破的項目(中國人做的,點贊),在思路上很好地結合了Docker與KVM各自的優勢。
回到爬蟲,Hyper有如下優點:
1. 節點之間內核獨立,資源隔離性更強,使得系統安全風險降低
2. 可直接部署在物理機上,少了一層虛擬機,降低了運維的複雜度
3. API跟docker類似,方便二次開發集成
4. 啓動跟docker一樣的快速,可實現集羣化應用快速更新
應該説,基於以上特點給了我們使用Hyper作為爬蟲集羣底層非常充分的理由。因此,今年以來,針對Hyper在爬蟲上的應用,我們做了大量的嘗試,也已經積累得了不少第一手的數據和實際的效果。當然,Hyper本身還處在發展階段,無論技術支持、社區和商用化案例都還很缺乏,後續能否得到爆發性的發展,還是值得關注。
以上我們在爬蟲底層節點集羣技術選型上的一點經驗分享,後續我們可以再繼續慢慢説來,爬蟲雖小,要做到最好,也是門大學問。