實(shí)用云計(jì)算環(huán)境簡述
如今it領(lǐng)域沒聽說過云計(jì)算的絕對是out了,雖然大家都知道云計(jì)算,雖然很多高校很多專業(yè)都開設(shè)了云計(jì)算專業(yè),雖然很多人都在討論云計(jì)算,雖然也有少數(shù)人走在了應(yīng)用云計(jì)算的前列,然而,可悲的是,大多數(shù)人對云計(jì)算的認(rèn)識僅限于amazon、google、microsoft、ibm有能力架設(shè)云計(jì)算環(huán)境,其他公司都靠邊,甚至唯他們的云計(jì)算才叫云計(jì)算,別的企業(yè)根本不可能做云計(jì)算,各級政府部門最搞笑了,動(dòng)不動(dòng)花多少錢引進(jìn)某某云計(jì)算環(huán)境,填補(bǔ)某某空白,多少cpu多少機(jī)器每秒多少萬億次計(jì)算,最終是不是一堆浪費(fèi)電力的擺設(shè)也沒有人知道,也沒人去過問。
略感欣慰的是,很多企業(yè)都在務(wù)實(shí)地部署自己的云計(jì)算環(huán)境,大如騰訊、淘寶、百度、小如我們這樣剛成立的小公司,其實(shí)要部署一個(gè)私有云計(jì)算環(huán)境并沒有那么難,以我個(gè)人的經(jīng)驗(yàn)來看,如果有一個(gè)精干的小團(tuán)隊(duì),幾個(gè)人一個(gè)月部署一個(gè)私有云計(jì)算環(huán)境是完全可能可行的。在我看來,所謂云計(jì)算就是分布式存儲(chǔ)+分布式計(jì)算,不局限于底下os是win還是*nix,也不局限于是局域網(wǎng)環(huán)境還是廣域網(wǎng)環(huán)境,也不管上面跑的是c++的程序還是javascript的程序,下面簡單介紹下我設(shè)計(jì)的一個(gè)即時(shí)查詢價(jià)格的云計(jì)算體系:
我一直在win下開發(fā),win用得非常熟練,所以我把云計(jì)算環(huán)境部署在windows之上,當(dāng)然也考慮到windows的機(jī)器眾多,tasknode可輕易找到非常多的目標(biāo)機(jī)器,我部署的云計(jì)算環(huán)境主要分兩類節(jié)點(diǎn),jobserver和tasknode,jobserver主管任務(wù)切割、任務(wù)調(diào)度,tasknode是計(jì)算節(jié)點(diǎn)。另外還有一些節(jié)點(diǎn),jobowner可連接jobserver并提交任務(wù),并可查詢該任務(wù)的執(zhí)行情況,admin可連接jobserver查詢jobserver的狀態(tài)。

其實(shí)這些上篇博客已經(jīng)寫過,我再講的詳細(xì)一點(diǎn),看具體的執(zhí)行情況,首先jobowner給jobserver提交package,這個(gè)package是一個(gè)zip文件,包含一組文件,jobowner提交package之后jobserver會(huì)根據(jù)約定的規(guī)則管理package,并在jobserver展開該package,如下:
Jobowner連到jobserver之后,發(fā)出如下的命令到jobserver
0x49 0x0 0x0 0x0 0x2 0x0 0xb 0x0 127.0.0.1 0x0 ppsget.dll 0x0
{type:[0,1,2,3,4],rmax:5,wb:"pc",text:"諾基亞 e63"} 0x0
上面是用我設(shè)計(jì)的一種混合顯示格式顯示的包數(shù)據(jù),可以看到里面帶上了ppsget.dll,這就是指定包內(nèi)部名,其實(shí)還可以這樣ppsget.dll:getpage,如此一個(gè)dll就可支持多個(gè)IJobTask輸出,getpage只是獲得其中一個(gè)IJobTask接口(關(guān)于IJobTask接口參考上一篇云計(jì)算實(shí)踐2的文章)。具體命令是json格式,主要是為了方便信息傳輸和解析。Jobserver接收到該命令之后,調(diào)用ppsget.dll的IJobTask接口中的split函數(shù),將該任務(wù)分解,之后調(diào)度Tasknode執(zhí)行,tasknode收到jobserver發(fā)過來的任務(wù)之后,檢查包名稱,如果缺少就會(huì)主動(dòng)向jobserver要求發(fā)送相應(yīng)的包,并進(jìn)行部署,待部署完成之后從包獲取指定的IJobTask接口,執(zhí)行該接口的map函數(shù),將結(jié)果按照約定的格式發(fā)給jobserver,最后由jobserver調(diào)用IJobTask中的reduce函數(shù)進(jìn)行打包,最后將結(jié)果發(fā)給jobowner并記錄相關(guān)Log。
上圖中還可看到一個(gè)HashCrackCloud.dll,這是另一個(gè)云計(jì)算環(huán)境下破解md5密碼的dll,這個(gè)上篇文章也寫了一下,這里就不詳述了。
為使得tasknode可適應(yīng)各種機(jī)器環(huán)境,我把tasknode設(shè)計(jì)為一個(gè)dll,該dll內(nèi)部自己管理消息及任務(wù)執(zhí)行,該dll可被加載到各種容器進(jìn)程(如gui進(jìn)程、console進(jìn)程、service進(jìn)程)等執(zhí)行,看下我的tasknode和它的容器進(jìn)程:

這也算是我的得意設(shè)計(jì)吧,這樣設(shè)計(jì)的tasknode在windows系統(tǒng)下的確具有很高的靈活性。
這樣的tasknode甚至可直接加載在jobserver進(jìn)程,也可被任意win系列機(jī)器的任意進(jìn)程加載參與運(yùn)算,用主動(dòng)加載或被動(dòng)加載都很方便,極大的方便了云計(jì)算環(huán)境的部署,反正具體執(zhí)行的任務(wù)都由package完成,tasknode只要按照約定的規(guī)則部署 package即可,所以這種云計(jì)算環(huán)境是非常輕量級又非常靈活的,開發(fā)一個(gè)新的任務(wù)只要做一個(gè)新的IJobTask即可,目前我這套體系除了沒有考慮太多安全性之外,這個(gè)云計(jì)算環(huán)境的實(shí)施還是非常容易的,實(shí)際上我們這個(gè)價(jià)格查詢的后臺云計(jì)算環(huán)境只用了不到2周的時(shí)間就開發(fā)完成。
再看下jobserver記錄的每個(gè)job的log:

從log中可很容易的分析出一個(gè)job每個(gè)task的執(zhí)行情況,并可根據(jù)這些數(shù)據(jù)進(jìn)行相應(yīng)的優(yōu)化處理。
之所以把jobserver和tasknode以及package都寫出來,主要是為了表達(dá)一個(gè)看法,要實(shí)現(xiàn)一個(gè)簡單的云計(jì)算環(huán)境其實(shí)并不難,有經(jīng)驗(yàn)的團(tuán)隊(duì)很容易就能做出來,參考下google的map/reduce論文,按照自己的需要簡化實(shí)現(xiàn),真理在實(shí)踐中,如果只是仰望google、amazon,那就真的是在云中霧里,另一個(gè)想要表達(dá)的就是云的形式是多種多樣的,并不一定amazone、google的云計(jì)算環(huán)境才是標(biāo)準(zhǔn)的,對實(shí)用派來說,形式都是次要的,實(shí)用才是關(guān)鍵的。