淘寶分布式并行計(jì)算四合一框架Fourinone
Fourinone同時(shí)提供完整的分布式緩存支持,包括中小型緩存以及大型集群緩存,他使用不同于map/reduce的全新設(shè)計(jì)模式解決問題,模仿現(xiàn)實(shí)中生產(chǎn)加工鏈?zhǔn)郊硬⑿刑幚淼?ldquo;包工頭/農(nóng)民工/手工倉(cāng)庫(kù)/職業(yè)所”方式設(shè)計(jì)分布式計(jì)算,他還可以當(dāng)做簡(jiǎn)單的mq使用。Fourinone整體短小精悍,就一個(gè)jar包沒有任何依賴,很方便嵌入式開發(fā)使用。本文將詳細(xì)介紹Fourinone的使用背景、原理和功能等
淘寶Fourinone(中文名字“四不像”)是一個(gè)四合一分布式計(jì)算框架,在寫這個(gè)框架之前,我對(duì)分布式計(jì)算進(jìn)行了長(zhǎng)時(shí)間的思考,也看了老外寫的其他開源框架,當(dāng)我們把復(fù)雜的hadoop當(dāng)作一門學(xué)科學(xué)習(xí)時(shí),似乎忘記了我們想解決問題的初衷:我們僅僅是想寫個(gè)程序把幾臺(tái)甚至更多的機(jī)器一起用起來(lái)計(jì)算,把更多的cpu和內(nèi)存利用上,來(lái)解決我們數(shù)量大和計(jì)算復(fù)雜的問題,當(dāng)然這個(gè)過程中要考慮到分布式的協(xié)同和故障處理。如果僅僅是為了實(shí)現(xiàn)這個(gè)簡(jiǎn)單的初衷,為什么一切會(huì)那么復(fù)雜,我覺的自己可以寫一個(gè)更簡(jiǎn)單的東西,它不需要過度設(shè)計(jì),只需要看上去更酷一點(diǎn),更小巧一點(diǎn),功能更強(qiáng)一點(diǎn)。于是我將自己對(duì)分布式的理解融入到這個(gè)框架中,考慮到底層實(shí)現(xiàn)技術(shù)的相似性,我將Hadoop,Zookeeper,MQ,分布式緩存四大主要的分布式計(jì)算功能合為一個(gè)框架內(nèi),對(duì)復(fù)雜的分布式計(jì)算應(yīng)用進(jìn)行了大量簡(jiǎn)化和歸納。
首先,對(duì)分布式協(xié)同方面,它實(shí)現(xiàn)了Zookeeper所有的功能,并且做了很多改進(jìn),包括簡(jiǎn)化Zookeeper的樹型結(jié)構(gòu),用domain/node兩層結(jié)構(gòu)取代,簡(jiǎn)化Watch回調(diào)多線程等待編程模型,用更直觀的容易保證業(yè)務(wù)邏輯完整性的內(nèi)容變化事件以及狀態(tài)輪循取代,Zookeeper只能存儲(chǔ)信息不大于1M的內(nèi)容,F(xiàn)ourInOne超過1M的內(nèi)容會(huì)以內(nèi)存隱射文件存儲(chǔ),增強(qiáng)了它的存儲(chǔ)功能,簡(jiǎn)化了Zookeeper的ACL權(quán)限功能,用更為程序員熟悉rw風(fēng)格取代,簡(jiǎn)化了Zookeeper的臨時(shí)節(jié)點(diǎn)和序列節(jié)點(diǎn)等類型,取代為在創(chuàng)建節(jié)點(diǎn)時(shí)是否指定保持心跳,心跳斷掉時(shí)節(jié)點(diǎn)會(huì)自動(dòng)刪除。FourInOne是高可用的,沒有單點(diǎn)問題,可以有任意多個(gè)復(fù)本,它的復(fù)制不是定時(shí)而是基于內(nèi)容變更復(fù)制,有更高的性能,F(xiàn)ourInOne實(shí)現(xiàn)了領(lǐng)導(dǎo)者選舉算法(但不是Paxos),在領(lǐng)導(dǎo)者服務(wù)器宕機(jī)情況下,會(huì)自動(dòng)不延時(shí)的將請(qǐng)求切換到備份服務(wù)器上,選舉出新的領(lǐng)導(dǎo)者進(jìn)行服務(wù),這個(gè)過程中,心跳節(jié)點(diǎn)仍然能保持健壯的穩(wěn)定性,迅速跟新的領(lǐng)導(dǎo)者保持心跳連接?;贔ourInOne可以輕松實(shí)現(xiàn)分布式配置信息,集群管理,故障節(jié)點(diǎn)檢測(cè),分布式鎖,以及淘寶configserver等等協(xié)同功能。
其次, FourInOne可以提供完整的分布式緩存功能。如果對(duì)一個(gè)中小型的互聯(lián)網(wǎng)或者企業(yè)應(yīng)用,僅僅利用domain/node進(jìn)行k/v的存儲(chǔ)即可,因?yàn)閐omain/node都是內(nèi)存操作而且讀寫鎖分離,同時(shí)擁有復(fù)制備份,完全滿足緩存的高性能與可靠性。對(duì)于大型互聯(lián)網(wǎng)應(yīng)用,高峰訪問量上百萬(wàn)的并發(fā)讀寫吞吐量,會(huì)超出單臺(tái)服務(wù)器的承受力,F(xiàn)ourInOne提供了fa?ade的解決方案去解決大集群的分布式緩存,利用硬件負(fù)載均衡路由到一組fa?ade服務(wù)器上,fa?ade可以自動(dòng)為緩存內(nèi)容生成key,并根據(jù)key準(zhǔn)確找到散落在背后的緩存集群的具體哪臺(tái)服務(wù)器,當(dāng)緩存服務(wù)器的容量到達(dá)限制時(shí),可以自由擴(kuò)容,不需要成倍擴(kuò)容,因?yàn)閒a?ade的算法會(huì)登記服務(wù)器擴(kuò)容時(shí)間版本,并將key智能的跟這個(gè)時(shí)間匹配,這樣在擴(kuò)容后還能準(zhǔn)確找到之前分配到的服務(wù)器。另外,基于FourInOne可以輕松實(shí)現(xiàn)web應(yīng)用的session功能,只需要將生成的key寫入客戶端cookie即可。
FourInOne對(duì)于分布式大數(shù)據(jù)量并行計(jì)算的解決方案不同于復(fù)雜的hadoop,它不像hadoop的中間計(jì)算結(jié)果依賴于hdfs,它使用不同于map/reduce的全新設(shè)計(jì)模式解決問題。FourInOne有“包工頭”,“農(nóng)民工”,“手工倉(cāng)庫(kù)”的幾個(gè)核心概念。“農(nóng)民工”為一個(gè)計(jì)算節(jié)點(diǎn),可以部署在多個(gè)機(jī)器,它由開發(fā)者自由實(shí)現(xiàn),計(jì)算時(shí),“農(nóng)民工”到“手工倉(cāng)庫(kù)”獲取輸入資源,再將計(jì)算結(jié)果放回“手工倉(cāng)庫(kù)”返回給“包工頭”。“包工頭”負(fù)責(zé)承包一個(gè)復(fù)雜項(xiàng)目的一部分,可以理解為一個(gè)分配任務(wù)和調(diào)度程序,它由開發(fā)者自己實(shí)現(xiàn),開發(fā)者可以自由控制調(diào)度過程,比如按照“農(nóng)民工”的數(shù)量將源數(shù)據(jù)切分成多少份,然后遠(yuǎn)程分配給“農(nóng)民工”節(jié)點(diǎn)進(jìn)行計(jì)算處理,它處理完的中間結(jié)果數(shù)據(jù)不限制保存在hdfs里,而可以自由控制保存在分布式緩存、數(shù)據(jù)庫(kù)、分布式文件里。如果需要結(jié)果數(shù)據(jù)的合并,可以新建立一個(gè)“包工頭”的任務(wù)分配進(jìn)行完成。多個(gè)“包工頭”之間進(jìn)行責(zé)任鏈?zhǔn)教幚怼?偟膩?lái)說(shuō),是將大數(shù)據(jù)的復(fù)雜分布式計(jì)算,設(shè)計(jì)為一個(gè)鏈?zhǔn)降亩?ldquo;包工頭”環(huán)節(jié)去處理,每個(gè)環(huán)節(jié)包括利用多臺(tái)“農(nóng)民工”機(jī)器進(jìn)行并行計(jì)算,無(wú)論是拆分計(jì)算任務(wù)還是合并結(jié)果,都可以設(shè)計(jì)為一個(gè)單獨(dú)的“包工頭”環(huán)節(jié)。這樣做的好處是,開發(fā)者有更大能力去深入控制并行計(jì)算的過程,去保持使用并行計(jì)算實(shí)現(xiàn)業(yè)務(wù)邏輯的完整性,而且對(duì)各種不同類型的并行計(jì)算場(chǎng)景也能靈活處理,不會(huì)因?yàn)槟承┨厥鈭?chǎng)景被map/reduce的框架限制住思維,并且鏈?zhǔn)降拿總€(gè)環(huán)節(jié)也方便進(jìn)行監(jiān)控過程。
FourInOne也可以當(dāng)成簡(jiǎn)單的mq來(lái)使用,將domain視為mq隊(duì)列,每個(gè)node為一個(gè)隊(duì)列消息,監(jiān)控domain的變化事件來(lái)獲取隊(duì)列消息。也可以將domain視為訂閱主題,將每個(gè)訂閱者注冊(cè)到domain的node上,發(fā)布者將消息逐一更新每個(gè)node,訂閱者監(jiān)控每個(gè)屬于自己的node的變化事件獲取訂閱消息,收到后刪除內(nèi)容等待下一個(gè)消息。但是FourInOne不實(shí)現(xiàn)JMS的規(guī)范,不提供JMS的消息確認(rèn)和消息過濾等特殊功能,不過開發(fā)者可以基于FourInOne自己去擴(kuò)充這些功能,包括mq集群,利用一個(gè)獨(dú)立的domain/node建立隊(duì)列或者主題的key隱射,再仿照上面分布式緩存的智能根據(jù)key定位服務(wù)器的做法實(shí)現(xiàn)集群管理。
FourInOne整體代碼不到100k,跟Hadoop, Zookeeper, Memcache, ActiveMq等開源產(chǎn)品代碼上沒有任何相似性,不需要任何依賴,引用一個(gè)jar包就可以嵌入式使用,良好支持window環(huán)境,可以在一臺(tái)機(jī)器上模擬分布式環(huán)境,更方便開發(fā)。
開發(fā)包里自帶了一系列傻瓜上手demo,包括分布式計(jì)算、統(tǒng)一配置管理、集群管理、分布式鎖、分布式緩存、MQ等方面幫助掌握f(shuō)ourinone的全部功能
下載地址:
http://www.skycn.com/soft/68321.html。
博客地址(內(nèi)有跟hadoop的對(duì)比和基準(zhǔn)測(cè)試):
http://3503265.blog.51cto.com/
【編輯推薦】