亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

實(shí)錄分享 | Google Borg 系統(tǒng) 與 Coding Docker 實(shí)踐

wuyangnju / 1515人閱讀

摘要:剛才聽了謝樂冰的演講我覺得很多東西和我們的思路非常像,從我回國到現(xiàn)在大概有一年多的時(shí)間。在看來,一個(gè)業(yè)務(wù)應(yīng)用應(yīng)該是分層的,每一層都是一個(gè)所謂的服務(wù),剛才謝樂冰講的所謂服務(wù)化和異步化,不會(huì)把這些東西從前到頭攪在一起,這樣非常難以擴(kuò)展。

本文是數(shù)人云深圳技術(shù)分享課上Coding CTO 孫宇聰?shù)难葜v實(shí)錄,小數(shù)帶你走近這位詼諧幽默的大牛,領(lǐng)略他深入的見解和豐富的實(shí)踐經(jīng)驗(yàn)。

非常感謝今天有這個(gè)機(jī)會(huì),數(shù)人云的CEO是我前同事王璞,他原來是Google的,我是在Google云計(jì)算部門,我們合作非常緊密。

創(chuàng)業(yè)也是非常好的機(jī)會(huì),Coding是關(guān)注于開發(fā)者、生產(chǎn)力、效率。數(shù)人云會(huì)關(guān)注真正從代碼到研發(fā)、落地,這一系列的事情,這簡直就是絕配。剛才聽了謝樂冰的演講我覺得很多東西和我們的思路非常像,從我回國到現(xiàn)在大概有一年多的時(shí)間。我一直在改造Coding原來的業(yè)務(wù)、架構(gòu),包括新業(yè)務(wù)的架構(gòu)設(shè)計(jì)。對我來講他講的很多東西我們已經(jīng)實(shí)踐過了,只不過采用的方法可能不太一樣,用名詞來說就是殊途同歸,條條大路通羅馬。

今天我從研發(fā)的角度講一講,把一個(gè)所謂的代碼變成無服務(wù)、無狀態(tài)、分布式,我們是怎么想的。我們很遺憾的是跟他不是一同開始,我們沒利用他們的東西,現(xiàn)在我們也非常想能夠把我們這些經(jīng)驗(yàn)和他們的經(jīng)驗(yàn)結(jié)合起來,給大家提供一個(gè)完整的,從開發(fā)一直到最后的體驗(yàn)。

個(gè)人介紹——從Google到Coding

先吹吹牛,介紹一下我自己。我原來在Google,2007年加入的Google,2009年去的Google美國總部。我去了以后參加兩個(gè)大項(xiàng)目,一個(gè)項(xiàng)目是YouTube國內(nèi)不存在的視頻網(wǎng)站,當(dāng)年經(jīng)歷了YouTube爆發(fā)式增長的階段,從無到有的過程,這個(gè)經(jīng)歷是值得一提的。應(yīng)該是2010年左右,當(dāng)時(shí)YouTube每個(gè)月的上傳量已經(jīng)超過1個(gè)PB,這個(gè)數(shù)字目前沒幾個(gè)人達(dá)到。我們建了CDN網(wǎng)絡(luò),當(dāng)時(shí)我們有一萬個(gè)節(jié)點(diǎn),10000臺(tái)機(jī)器,都是部署在每個(gè)SP自己的機(jī)房里,當(dāng)時(shí)的峰值流量就達(dá)到10T,一回國都是2M的小水管,當(dāng)時(shí)流量是10個(gè)TbpS,可能80%的流量都是小貓視頻,大家上YouTube最多的事是看小貓視頻。

后來轉(zhuǎn)到Google cloud platform,當(dāng)時(shí)做的主要是Google所有內(nèi)部百萬臺(tái)服務(wù)器的運(yùn)維服務(wù),要管理機(jī)器從工廠造出來那一刻,接上電源以后,然后安裝、部署,包括運(yùn)行軟件,最后都要銷毀,當(dāng)時(shí)兩個(gè)團(tuán)隊(duì)20人,管全球100多萬臺(tái)機(jī)器,我們不是管機(jī)器的,是讓系統(tǒng)管機(jī)器。

后來國內(nèi)炒的很火的Borg,Omega,Google所有的任務(wù)都是集中在這兩個(gè)任務(wù)分發(fā)系統(tǒng)上,Borg已經(jīng)很牛了,Omega又很牛,但是不幸的是Omega已經(jīng)早就被cancel了。Omega這伙人寫B(tài)org寫煩了,就想重寫一下,這幫人寫了大概兩三年,最后沒能解決什么實(shí)際問題。這個(gè)事情在Google內(nèi)部結(jié)果是不太好的,就被cancel了。更搞笑的是,寫Omega這伙人一看公司不讓我寫了,我改成寫Kubernetes。原班人馬寫Kubernetes,把這個(gè)思想帶過去,重新用go又寫了一遍。市面上的容器化管理平臺(tái)又有幾個(gè),我的看法是Kubernetes現(xiàn)在不是很靠譜,起碼現(xiàn)在不是很靠譜,大家就知道選什么好了。

回國以后,我們主要干了Coding這個(gè)事,主要是做了所謂的眾包平臺(tái),可以讓需求方在上面找到程序員做事,程序員也可以接到私活,有點(diǎn)像軟件行業(yè)的房屋中介。

Coding基于終端業(yè)務(wù)是碼市,用張老板的話說讓自由人自由連接,需求方找到程序員,程序員找到需求方。我們開發(fā)針對很多程序員的生產(chǎn)力工具,我回國以后最大的感受,國內(nèi)的程序員是太敬業(yè)了,比國外敬業(yè)多,我們早上10點(diǎn)多公司,下午3點(diǎn)多就回家了,國內(nèi)的程序員什么時(shí)候干過這個(gè)事,996,10、10、7,都干過的。很多時(shí)候老板招程序員是來干活,他一是不關(guān)心你用什么工具干活,二是不關(guān)心你怎么干的,效率高不高。我們是給程序員提供好的工具,提高生產(chǎn)力,解放生產(chǎn)力,讓成程序員效率提高。

基于這個(gè)我們做了項(xiàng)目管理、代碼倉庫、在線開發(fā)的WebIDE、演示平臺(tái)。很多東西目前還是秘密,但是我們也秘密研發(fā)中,今年下半年很多東西要上線。

Google Borg——Millions Job Every Day

今天主題主要是講Borg和Coding的實(shí)踐。Google的Borg系統(tǒng)是什么東西?Google Borg系統(tǒng)是整個(gè)公司的任務(wù)分發(fā)系統(tǒng),你在Google里面寫程序必須在Borg這個(gè)平臺(tái)上運(yùn)行,怎么做到的?你買不到機(jī)器,公司不給你批錢買機(jī)器,必須從Borg買資源。當(dāng)一個(gè)東西成為一個(gè)公司標(biāo)準(zhǔn)的時(shí)候就好辦了,否則你永遠(yuǎn)是買一臺(tái)機(jī)器瞎配一下,永遠(yuǎn)所做不到所謂的PaaS,或平臺(tái)化。

Google的數(shù)據(jù)中心,或者說它的架構(gòu)層面是什么樣的?它也非常簡單,Google有幾個(gè)名詞可以解釋一下,首先是Google的機(jī)器,每一臺(tái)都是沒有外殼的機(jī)器,因?yàn)橥鈿oogle來說一點(diǎn)用沒有,因?yàn)樗箅S時(shí)可以操作。所有這些機(jī)器組成一排,很多排的機(jī)器組成所謂的集群,兩三個(gè)集群組成所謂的數(shù)據(jù)中心,數(shù)據(jù)中心放在一起就組成一個(gè)園區(qū)。

為什么說這件事?Google的一大理念是分層或分區(qū),相當(dāng)于從上到下都是一個(gè)經(jīng)過頂層設(shè)計(jì)的狀態(tài),不會(huì)是說有的公司是從前到后都攪在一起,你要說我做一個(gè)業(yè)務(wù),業(yè)務(wù)從買機(jī)器到布線,到供電,都是連在一起的,全都是一個(gè)部門搞的,這樣搞出來的東西可能效率稍微高一點(diǎn)點(diǎn),但是復(fù)雜度高非常難以擴(kuò)展。Google分層的理念和容器化的理念一樣,容器化本身是要分層,只有分層才能降低復(fù)雜度,每一層都給每一層提供不同的接口。這個(gè)是每一排機(jī)器是連到一個(gè)供電設(shè)備上,每一個(gè)集群,每一個(gè)Cluster是一個(gè)完整的Borg Cluster,好幾個(gè)數(shù)據(jù)中心有好幾個(gè)Borg Cluster。給應(yīng)用開發(fā)者提供了一個(gè)穩(wěn)定、抽象的平臺(tái),你不用擔(dān)心我具體找哪臺(tái)機(jī)器,而是把任務(wù)運(yùn)行到哪個(gè)集群中,然后自動(dòng)在集群中給你分配資源,這是Google的生產(chǎn)環(huán)境是這樣的組織過程。

當(dāng)Google一個(gè)請求來的時(shí)候,Google都涉及到哪些東西,一直到最后的服務(wù)層涉及到什么條件和環(huán)節(jié)。Google有所謂的B2、B4,可以理解為一個(gè)是公有網(wǎng)絡(luò),一個(gè)是私有網(wǎng)絡(luò)。B2是和各大運(yùn)營商接的網(wǎng)絡(luò),B4是數(shù)據(jù)中心的骨干網(wǎng)。數(shù)據(jù)包從ISP,或從用戶直接到達(dá)Google數(shù)據(jù)中心以后一定會(huì)進(jìn)入Borg Cluster,所有任務(wù)都在Borg Cluster這個(gè)集群里。Borg里運(yùn)行了GFE,GFE它相當(dāng)于一個(gè)前端,有GSLB是負(fù)載均衡系統(tǒng),告訴用戶你應(yīng)該訪問哪些機(jī)器,或者是怎么樣,這個(gè)請求到達(dá)應(yīng)用程序的后端,存儲(chǔ)層讀數(shù)據(jù),最后反饋給用戶。

在Google看來,一個(gè)業(yè)務(wù)應(yīng)用應(yīng)該是分層的,每一層都是一個(gè)所謂的服務(wù),剛才謝樂冰講的所謂服務(wù)化和異步化,不會(huì)把這些東西從前到頭攪在一起,這樣非常難以擴(kuò)展。把整個(gè)的所有流程切片以后,每一層都可以橫向擴(kuò)展,處理很多應(yīng)用,效率也非常高。這就是Google做分布式,就是靠一層層切分,每一層都有不同的團(tuán)隊(duì)負(fù)責(zé),這層和那層有明確的接口,接口是異步的,非常清晰的,所以才能大規(guī)模擴(kuò)張。

今天講的重點(diǎn)是Google的Borg是干什么用的,Borg內(nèi)部架構(gòu)是什么樣?首先里面有幾個(gè)比較大的東西,第一個(gè)東西就是所謂的Borg master,有五個(gè)方框,因?yàn)閷?shí)際就是跑在5臺(tái)機(jī)器上的。Borg master是基于所謂的Paxos協(xié)議,把一個(gè)狀態(tài)可以安全地復(fù)制到5個(gè)機(jī)器上,只要5個(gè)機(jī)器有3個(gè)正常工作,這個(gè)集群就能正常工作,這就是Borg master,把集群的所謂狀態(tài),什么東西運(yùn)行在什么地方,一個(gè)任務(wù)運(yùn)行幾份,運(yùn)行在哪,什么狀態(tài),都記在Borg master上。Borg Master有對應(yīng)的Borglet,就是Borg slave,運(yùn)行在集群的小節(jié)點(diǎn)上執(zhí)行任務(wù)的東西, Borg master負(fù)責(zé)發(fā)指令,Borg slave負(fù)責(zé)執(zhí)行。Google這個(gè)模型運(yùn)行十年多,每一個(gè)集群大概有10000臺(tái)機(jī)器,這個(gè)模型是經(jīng)過驗(yàn)證的,每一個(gè)集群里開始是10000,后來漲到30000-50000臺(tái)機(jī)器,這個(gè)規(guī)模是非??捎^的。

還有Scheduler,選擇每個(gè)機(jī)器去運(yùn)行,這個(gè)細(xì)節(jié)就不說了。和用戶的接口,Borg有個(gè)所謂的config,config就是你寫了一下我現(xiàn)在有一個(gè)東西要運(yùn)行,這個(gè)東西有什么運(yùn)行條件,通過工具推到Borg Master上,Borg Master給你安排一個(gè)機(jī)器,如果這個(gè)機(jī)器突然間掛了,就可以把任務(wù)遷到別的機(jī)器上運(yùn)行。Borg Cluster的模式,給上層的應(yīng)用提供了一個(gè)接口,你只要告訴我你運(yùn)行什么,我不關(guān)心你具體運(yùn)行在哪。大家可以看Google特別吹牛的文章,我們每個(gè)月有20億的任務(wù)在運(yùn)行,實(shí)際上有很多任務(wù)是運(yùn)行1秒就崩潰,然后又重新運(yùn)行,里面數(shù)據(jù)有點(diǎn)浮高。但是這個(gè)模型是Google經(jīng)過實(shí)踐得出的,因?yàn)殚_發(fā)者真的不關(guān)心具體的機(jī)器是哪個(gè),只關(guān)心我需要2G內(nèi)存,一個(gè)CPU,塞到機(jī)器上跑就可以了,不關(guān)心機(jī)器上還運(yùn)不運(yùn)行其他的東西。

理都懂,城會(huì)玩,臣妾做不到——土制一些吧

Borg模型比較難,Borg Master也是Google內(nèi)部工具。我回國以后遇到最大的問題,這些東西都玩不了,就得土制。因?yàn)槟銢]有一個(gè)完整的解決方案做這個(gè)事,我們自己得把這個(gè)東西搭起來。搭起來得需要一些東西,分為三大塊,第一大塊是所謂的Run time,這解決容器化的運(yùn)行時(shí)環(huán)境。二是在Run time運(yùn)行就得涉及到鏡像,或鏡像分發(fā)的機(jī)制,有一個(gè)東西要運(yùn)行,可以把它運(yùn)行到某一個(gè)機(jī)器上。最后是有Orchestration,就是編排系統(tǒng),即有一個(gè)人,一個(gè)程序,決定這個(gè)東西運(yùn)行在什么地方,然后是下載鏡像,然后去執(zhí)行。在2015年初的時(shí)候發(fā)現(xiàn),目前符合這個(gè)模式的東西就是Docker,我們先試試Docker什么樣。

2015年上半年,基本上大上半年的時(shí)間,我們搞了所謂的Docker化,最開始我們內(nèi)部使用的都是一個(gè)所謂單機(jī)部署,每個(gè)人都要自己拷貝這樣的文件,然后執(zhí)行命令。我們后來搞了一個(gè)Docker化,Docker化的結(jié)果是,所有的代碼打包成了Docker Image。Docker生產(chǎn)環(huán)境有自己的私有Registry,用Docker container運(yùn)行代碼。最后還寫了生產(chǎn)環(huán)境的容器編排系統(tǒng),這個(gè)做得很爛,沒有數(shù)人云做得好,但是勉強(qiáng)解決了我們手動(dòng)執(zhí)行的一些問題。搞完這個(gè)東西以后,我們發(fā)現(xiàn)Docker到處是坑。

小姐身子丫鬟命——Docker Engine (Runtime)

然后我來講講填了哪些坑。Docker daemon,也就是運(yùn)行時(shí),當(dāng)時(shí)大家覺得很厲害,一開始都說你用容器必須用Docker,后來發(fā)現(xiàn)Docker daemon不是唯一的一個(gè)啟動(dòng)容器的途徑,跟以前搞的都是一回事。Docker daemon會(huì)遇到一個(gè)問題,任何人用Docker第一天都發(fā)現(xiàn),Docker 里面沒有init,daemon也沒有reap子進(jìn)程,如果程序fork很多進(jìn)程,會(huì)在系統(tǒng)中出現(xiàn)很多僵尸進(jìn)程,最終導(dǎo)致 docker daemon 出現(xiàn)問題,國內(nèi)目前也沒有把這個(gè)問題解決。每次跑一個(gè)Docker程序的時(shí)候都要擔(dān)心,我們會(huì)擔(dān)心這個(gè)Docker有沒有處理好僵尸進(jìn)程的問題。二是Docker后面的存儲(chǔ)系統(tǒng)沒有一個(gè)靠譜的,用AUFS,很多垃圾文件不清理,我從事軟件開發(fā)這么多年從來沒有過,很少見,大部分都是已經(jīng)打包好的程序,不會(huì)占用很多磁盤iNode。最新版OverlayFS產(chǎn)生一些死鎖還有崩潰,BTRfs也是。當(dāng)時(shí)我們對人生產(chǎn)生了懷疑,為什么我們要自找這么多事,我們原來跑得好好的,為什么搞到Docker上來,遇到了一些新問題。我們甚至把Docker daemon改成Open SSH,但Docker daemon和Open SSH其實(shí)是一回事,就是提供遠(yuǎn)程命令執(zhí)行的工具。你也可以理解為一個(gè)木馬,發(fā)一個(gè)指令就跑一個(gè)程序,而且跑的還有問題,我們不如直接SSH連接上運(yùn)行這個(gè)程序,都比這個(gè)靠譜,當(dāng)時(shí)很難受。后來Docker daemon本質(zhì)上是一個(gè)所謂的系統(tǒng)工具,它不停地掃描系統(tǒng)中的文件路徑,進(jìn)入這個(gè)狀態(tài)。它有兩個(gè)問題,一是原子性操作的問題,你Docker刪除一堆事,要?jiǎng)h目錄,調(diào)一堆系統(tǒng)API,任何一個(gè)地方出現(xiàn)問題都會(huì)造成垃圾,造成系統(tǒng)死鎖。Docker daemon一重啟,別的肯定也會(huì)要重啟,對我的個(gè)人聲譽(yù)在團(tuán)隊(duì)里造成很大的影響。

Docker daemon有很多問題,Docker是當(dāng)時(shí)可選的東西,給我們帶來好處,但是隨之而來的也有一些問題。Docker團(tuán)隊(duì)自己也意識(shí)到有問題,后來美國的神仙打一下架,覺得我們同意搞一個(gè)所謂的OCI,它成立了一個(gè)標(biāo)準(zhǔn),就產(chǎn)生了一個(gè)Runc的東西,Runc就是一個(gè)具體執(zhí)行container的東西,Docker一聽說這個(gè)東西就趕緊把代碼捐出來,給了Runc,好處是他對代碼很熟悉,趕緊搞了一個(gè)containerD,是grpc warpper,通過grpc訪問的一個(gè)服務(wù),最后用戶還保證Docker不變。對Docker來說OCI像毒藥,逼著他吃,但是吃完也對他本身造成威脅。對最終用戶是好事,如果我們發(fā)現(xiàn)Docker不靠譜,就直接用containerd交流,如果containerd也不靠譜,就繞過去讓他和Runc交流,你不再綁在一個(gè)Docker。跟虛擬化是一樣的,以前大家覺得虛擬化就是Vmware,必須得用Vmware的一套東西才能看得見?,F(xiàn)在分層,先有KVM,然后有QEMU和containerD差不多,再上面有Openstack。和Google的東西一樣,把邏輯分層,不再是一團(tuán),從上到下捅到底,每一層都被替換,靈活性更高、性能也會(huì)更好。

雞肋的Docker Image——一個(gè)不那么圓的輪子

而后我們又發(fā)現(xiàn)Docker Image本身也不怎么樣,最后大家的評論是非常雞肋。Docker Image就是一個(gè)壓縮包,如果你想把一個(gè)東西傳給另一個(gè)人打一個(gè)包壓縮一下發(fā)過去,是一樣的,Image又能分層,又能節(jié)省傳輸,這個(gè)東西都是扯淡,因?yàn)槲覀儍?nèi)網(wǎng)一秒好幾百M(fèi),省出10M的磁盤空間對我們來說是省幾毫秒。Docker Image來自于DockerFile,Dockerfile有一些表面問題,首先是不會(huì)寫,這個(gè)東西是他自己發(fā)明的,對于開發(fā)者來說,這個(gè)東西對你是有學(xué)習(xí)障礙的東西。你學(xué)習(xí)過程中蕩滌了你的靈魂,又開始懷疑人生。所以用Docker就經(jīng)常懷疑人生,你覺得以前學(xué)的東西都不好使了,用了一段時(shí)間以后發(fā)現(xiàn)這些都是騙人的,你要干的事還是一樣。Docker的核心問題,或者是Image核心問題一是編譯代碼,二是打包成鏡像發(fā)出去。怎么編譯,怎么打包,這兩件事是完全分開的,不應(yīng)該攙在一起。你下次寫Docker Image的時(shí)候,發(fā)現(xiàn)寫DockerFile,既做編譯,又做打包,恭喜你,你已經(jīng)成功地給自己挖很多坑,運(yùn)行的時(shí)候發(fā)現(xiàn)打包一次需要好幾小時(shí),下載一堆東西,最后打包的鏡像好幾十G,這些事情我們都干過。我們第一個(gè)鏡像是打包完3G多,當(dāng)時(shí)我們震驚了,這么辛苦寫了這么多的代碼嗎,運(yùn)行程序就達(dá)到3G。

Coding 實(shí)踐1:Build&Package&Run

最后我們理解了,你要做好一個(gè)事情,Build和Package要分家,先Build好代碼,再把編譯的結(jié)果賽到Image運(yùn)行,Build要靈活,要針對你的所有系統(tǒng)來做,你的代碼是什么樣就應(yīng)該怎么Build,你要寫Java,最后產(chǎn)生一個(gè)結(jié)果是Java包,如果不是就說明你的代碼寫得有問題,你應(yīng)該在這個(gè)問題上解決,最后就產(chǎn)生Java包,Package就是把Java和Java包放在一起運(yùn)行。

Coding最后的Dockerfile就三行,第一行是from某個(gè)基礎(chǔ)鏡像,一個(gè)Java運(yùn)行時(shí),第二行是add某個(gè)Java包,第三是CMD運(yùn)行。DockerFile基本上我們處于雞肋狀態(tài),用它還可以利用它去推代碼,這部分功能還是有點(diǎn)用的。但是真正用DockerFile,我們不會(huì)用它做復(fù)雜邏輯。

把Build和Package分開,我們用的所有編程語言都已經(jīng)把編譯工具搞好,所有的編譯工具都能產(chǎn)生一個(gè)多帶帶的包。我們嘗試用DockerFile同時(shí)解決build和package這兩個(gè)問題,真是沒事找事。你用Docker的時(shí)候發(fā)現(xiàn)我干了一堆事,看起來很牛,但是實(shí)際效果并不好。作為程序員得審視這個(gè)問題,就是能不能產(chǎn)生價(jià)值,如果不產(chǎn)生價(jià)值你是在給Docker打工,盲目跟從Docker,他說這么干就這么干,他如果改了你這些東西就浪費(fèi)了。如果你抓住本質(zhì),Docker怎么改對你就沒有影響。

Package的構(gòu)成我們還是用的Docker image的方式,寫了三行,一是Java的運(yùn)行時(shí)環(huán)境,二是Java包,三是怎么運(yùn)行Java,這是所謂的Package。后來發(fā)現(xiàn)三行太多,應(yīng)該寫兩行,他讓我們寫一行就寫一行。為什么第三行不用寫,Java程序執(zhí)行起來都一樣,都是Java -jar這些東西,你要加一些參數(shù)。不會(huì)寫到Image里會(huì)發(fā)現(xiàn),Java調(diào)一下內(nèi)存要重新打包嗎?太不合理了。最后CMD就不寫了,Docker直接執(zhí)行,在配置文件里執(zhí)行?;旧纤械姆?wù),要么是三行,要么是兩行。

Coding實(shí)踐2:去其糟粕,取其精華

在使用的過程中我們發(fā)現(xiàn),Docker有很多花里胡哨的東西,結(jié)果卻是什么也沒用,我們用的是非常簡單的,就把Docker當(dāng)成容器。為什么呢?第一點(diǎn)你看到大部分文章講Docker作為公有云平臺(tái)我們應(yīng)該如何使用Docker,這是國內(nèi)公司的通病。搞Docker的部門大部分是公司的運(yùn)維部門,國內(nèi)的運(yùn)維部門沒有權(quán)限改代碼,只能改自己的平臺(tái),作為公司的平臺(tái)部門得提供各種SDN的服務(wù),研發(fā)人員根本不需要這東西,如果你沒有SDN,就是主機(jī),就是host網(wǎng)絡(luò)模式,給你分配一個(gè)端口,保證你的端口是可用的,這個(gè)就行了,以前Borg就是這樣,Google搞了十年,每個(gè)開發(fā)的人都知道,我們啟動(dòng)的時(shí)候得找一下本地端口什么樣,要么可以配置,要么可以自動(dòng)尋找一個(gè)可用端口。Docker來了說你不用干這個(gè)事,我給你一個(gè)IP,給你一個(gè)80,你永遠(yuǎn)可以訪問這個(gè)。但是他沒有做到,做了很多后面的東西,SDN,各種打包,性能很差,這個(gè)事一般他不告訴你,當(dāng)你上了賊船以后,為什么我們的程序性能這么差。他說困難是暫時(shí)的,面包會(huì)有的,未來兩年這個(gè)性能就提高了。我說未來兩年我們程序都不用了,早就換了,這個(gè)明顯是不合理的。

經(jīng)常有人問我你們用Docker這么多,怎么解決共享存儲(chǔ)的問題。我說我們沒有共享存儲(chǔ),以前是什么樣還是什么樣。很多程序,共享存儲(chǔ)一是要改代碼,或者說有一個(gè)很牛的,我們能夠申請一個(gè)文件系統(tǒng),自動(dòng)掛載上面。后來我們發(fā)現(xiàn)這個(gè)東西沒有一個(gè)有用的,對我們來說沒有區(qū)別。我們的編程模型還是針對本地服務(wù),我們在編程的時(shí)候已經(jīng)考慮到如果本地文件不存在怎么辦,遷移數(shù)據(jù)怎么辦,我們都有現(xiàn)成的解決方案,為什么要換,我們還是用Host模型。數(shù)據(jù)就是寫在機(jī)器上,如果你要遷移這臺(tái)機(jī)器,如果這個(gè)東西有狀態(tài),你就應(yīng)該處理這個(gè)狀態(tài),而不是運(yùn)維部門幫你解決處理狀態(tài)的問題,這是公司里效率最低的方式,它得跟運(yùn)維部門協(xié)調(diào),我們要遷移了,運(yùn)維部門說我?guī)湍惆褦?shù)據(jù)拷過去,這個(gè)是不行的。

Docker有一個(gè)更大的坑,我把這個(gè)東西都轉(zhuǎn)成Docker運(yùn)行,你一看時(shí)區(qū)都是GMT時(shí)區(qū),有種到了愛爾蘭的感覺,所有的log時(shí)間對不上了。Docker沒告訴你,主機(jī)里的locale,你的編碼設(shè)置、時(shí)區(qū)設(shè)置,每個(gè)用戶passwd都是用的默認(rèn)的設(shè)置。這給我們造成很大困擾。每一個(gè)打包的人得關(guān)心到底是什么樣,到底怎么正確設(shè)置時(shí)區(qū),密碼這些東西。后來我們直接就mount,跟主機(jī)一樣,如果今天這個(gè)程序運(yùn)行在中國的一臺(tái)主機(jī)上,他就應(yīng)該用這臺(tái)主機(jī)的模式。我們用容器,很多時(shí)候變成我們真的只關(guān)心,第一是運(yùn)行時(shí)的版本,第二是代碼的版本,只有這兩個(gè)東西是會(huì)變的,其他東西都是跟著主機(jī)一起走,這個(gè)模型是最簡單,最有利于推廣云計(jì)劃、分布式計(jì)算的。

不管你做不做容器都應(yīng)該往幾個(gè)方向努力,一是所謂的對生產(chǎn)環(huán)境的管理模式。寵物式管理和放牛式管理,寵物式管理是你搞一臺(tái)機(jī)器,給這個(gè)機(jī)器起好聽的名,很多公司有專門的機(jī)器叫數(shù)據(jù)庫,這個(gè)機(jī)器有特殊的人調(diào)試。突然有一天這個(gè)機(jī)器掛了,你得把這個(gè)機(jī)器修好,這是寵物式管理,你得把這個(gè)東西修好,不修好整個(gè)業(yè)務(wù)就停了,數(shù)據(jù)庫是最典型的。除了數(shù)據(jù)庫外我們采用的所有管理方式都是放牛式管理,你放一百頭牛,有一只牛吃完口吐白沫倒下了,你的第一反應(yīng)不是你的牛吃病了,一定是咔,然后再拿一頭新牛過來,如果做到這一點(diǎn)很多事就很簡單。你隨時(shí)保證資源,保證有一百頭牛在跑就行了。

二是在國內(nèi)公有云平臺(tái)上,最依賴的還是靜態(tài)手動(dòng)資源配置。因?yàn)槲覀兇蟛糠謽I(yè)務(wù)都是所謂的daemon job,服務(wù)型任務(wù),你的東西一啟動(dòng)它就要一直運(yùn)行,占用一定的數(shù)量的內(nèi)存,一定數(shù)量的CPU,就持續(xù)提供服務(wù)。所以這個(gè)東西要遷移對你沒有任何好處,可能能夠提高你資源利用率,如果你搞一臺(tái)新機(jī)器把這個(gè)東西分過去。但是同樣的,你在這也是用CPU,那也是用CPU,對你來說花錢一樣花。所以很多時(shí)候動(dòng)態(tài)調(diào)配在daemon job是沒意義的,除非不停地有機(jī)器掛,公有云虛擬化了,已經(jīng)減少了很多這方面的問題。我們最關(guān)心的是留出足夠的富裕量,搞出冗余,不受任何一個(gè)多帶帶虛擬機(jī)的影響。動(dòng)態(tài)調(diào)配對我們意義不大,動(dòng)態(tài)調(diào)配唯一有用的地方是你有批處理、周期性任務(wù),他運(yùn)行時(shí)間比較短,你又不關(guān)心在什么地方運(yùn)行,這是容器平臺(tái)截然不同的兩個(gè)的使用場景,這兩個(gè)應(yīng)用場景可能有不同的方案解決。

Coding 實(shí)踐3:工具化、代碼化、半自動(dòng)化

最后得出的結(jié)論,算我提出的一個(gè)口號(hào),怎么樣能夠減輕你運(yùn)維的壓力,或提高你開發(fā)的效率。你是要把所有做的事情,所有需要人力參與的事情工具化、代碼化、半自動(dòng)化,完全自動(dòng)化這個(gè)事很難,涉及到你要通過實(shí)踐積累,把各種各樣的邊緣情況考慮到?,F(xiàn)在對我們來說,80%的是半自動(dòng)化,執(zhí)行的時(shí)候不出錯(cuò),很快地執(zhí)行。這是我們所謂開發(fā)編排系統(tǒng)的主要目標(biāo)。在一個(gè)公司里什么任務(wù)運(yùn)行在什么機(jī)器上,很多時(shí)候存在開發(fā)人員的腦袋里,比如數(shù)據(jù)庫的IP是什么,你如果能想起來,這就說明你們公司的代碼化不夠。代碼化把人才知道的東西都寫到機(jī)器里,對我來說不關(guān)心數(shù)據(jù)庫的IP是什么,我只要知道它的域名找到對應(yīng)的機(jī)器連接就行了。

對我們的生產(chǎn)環(huán)境,第一什么東西跑在什么機(jī)器上,怎么連接。二是搞出常用的屬性管理,比如名字是什么,端口是什么,有什么特點(diǎn)。三是我們仿照Google搞了一個(gè)Jobs/Tasks的抽象層,Google里面最大的抽象層,你一個(gè)任務(wù)可以有多個(gè)副本在運(yùn)行,這個(gè)任務(wù)今天跑5個(gè)副本,明天跑100個(gè),這個(gè)集群可以直接搞定,我們把這個(gè)概念抄過來,相當(dāng)于每一個(gè)任務(wù)都有2-3個(gè)Tasks。最后把數(shù)據(jù)寫進(jìn)代碼化的配置文件里時(shí),你發(fā)現(xiàn)集群可以復(fù)制,你在這個(gè)集群上可以跑,在那個(gè)集群上只要調(diào)調(diào)資源的對應(yīng)關(guān)系,具體跑在什么地方,你就會(huì)發(fā)現(xiàn)這個(gè)就是所謂的可復(fù)制集群,你本地也可以跑一套,在生產(chǎn)環(huán)境、配置文件都可以跑一套。這是最關(guān)鍵的點(diǎn),不管你怎么干,你最后都要干一個(gè)類似的事,就是把生產(chǎn)環(huán)境代碼化。

接下來,基于剛才的知識(shí)搞了一個(gè)小工具,這些工具是提供原子性的操作。up是啟動(dòng),down是干掉,rollingupdate是一個(gè)個(gè)更新,保證每個(gè)更新完了可以啟動(dòng)進(jìn)行下一個(gè)更新,對研發(fā)來說就需要這個(gè)東西,他們都理解。你說我有一個(gè)網(wǎng)易UI頁面,你點(diǎn)鼠標(biāo),他很不理解,他不知道產(chǎn)生什么事情。任何一個(gè)集群管理系統(tǒng),就是要設(shè)置所謂的接口,你要提供一些原子化、半自動(dòng)操作,去協(xié)助開發(fā)者達(dá)到他想要干的事,這是所謂的編排系統(tǒng)最應(yīng)該提供的東西。

后來我們應(yīng)該有一個(gè)所謂的diff,運(yùn)行過程中怎么有配置的改變,改變要看一下先改什么,然后再真正應(yīng)用這些改變。后來又搞了網(wǎng)頁系統(tǒng),可以用網(wǎng)頁看,以前連網(wǎng)頁都沒有,后來覺得還是不太方便。在網(wǎng)頁系統(tǒng),以前連網(wǎng)頁都沒有,上可以直接看log,甚至遠(yuǎn)程登在某個(gè)容器進(jìn)行操作。這是最小的功能機(jī),最有用的。

Coding實(shí)踐總結(jié)

最后總結(jié)一下,第一點(diǎn),想要把容器化、或想要把分布式系統(tǒng)做好,你要定死接口,放手實(shí)現(xiàn),對你來說只需要三個(gè)接口,build、package、run,能滿足效果,能運(yùn)行就行了,每個(gè)項(xiàng)目都有不同的需求,不可能強(qiáng)求它完全一致。

第二個(gè),生產(chǎn)環(huán)境容器化。很多業(yè)務(wù)有本地依賴,不能挪動(dòng)。但是最好的情況,第一,你一定要做到軟件把它包起來,你軟件用到的所有資源、所有的文件都是集中在container這個(gè)里面的,不會(huì)用到別人的東西,中間不會(huì)產(chǎn)生交集,這是包起來第一步。這一步很難,很多應(yīng)用配置文件都寫在系統(tǒng)的不同地方,這個(gè)機(jī)器上可以跑,那個(gè)機(jī)器跑不起來,只有包起來才能挪動(dòng),別的東西能正常訪問,這是最重要的。如果這兩個(gè)東西都做成以后,這個(gè)東西做成可復(fù)制,可以延伸、可以擴(kuò)展、可以復(fù)制,這就是容器化做好了。

針對DEVOPS實(shí)現(xiàn)代碼化、工具化,最后實(shí)現(xiàn)自動(dòng)化就行了。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/26589.html

相關(guān)文章

  • 云計(jì)算 Cloud Native | 數(shù)人云CEO王璞@KVM分享實(shí)錄

    摘要:分享實(shí)錄云計(jì)算技術(shù)源于互聯(lián)網(wǎng)公司,現(xiàn)在云計(jì)算已經(jīng)是下一代企業(yè)級的發(fā)展趨勢。如何做云計(jì)算一直是云計(jì)算技術(shù)的領(lǐng)導(dǎo)者。互聯(lián)網(wǎng)公司的快速發(fā)展,已經(jīng)印證了云計(jì)算技術(shù)和云原生應(yīng)用相比傳統(tǒng)構(gòu)架的巨大優(yōu)勢。 今天小數(shù)又給大家?guī)硪黄韶洕M滿的分享——來自KVM社區(qū)線上群分享的實(shí)錄,分享嘉賓是數(shù)人云CEO王璞,題目是《云計(jì)算與 Cloud Native》。這是數(shù)人云在KVM社區(qū)群分享的第一彈,之后還有數(shù)...

    _Zhao 評論0 收藏0
  • 才云科技CTO鄧德源:不可不知的谷歌集群管理經(jīng)驗(yàn)

    摘要:曾為美國谷歌集群管理組核心成員,主要參與開發(fā)集群管理系統(tǒng)。保證系統(tǒng)升級軟硬件錯(cuò)誤等均能及時(shí)被發(fā)現(xiàn)并處理,谷歌集群能小時(shí)不間斷工作。關(guān)于集群管理經(jīng)驗(yàn),首先一定要專注于持久的運(yùn)維自動(dòng)化工具開發(fā)。 本文僅用于學(xué)習(xí)和交流目的,不得用于商業(yè)目的。非商業(yè)轉(zhuǎn)載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/art... 訪談嘉賓: 鄧德源, 才云科技CT...

    callmewhy 評論0 收藏0
  • 才云科技CTO鄧德源:不可不知的谷歌集群管理經(jīng)驗(yàn)

    摘要:曾為美國谷歌集群管理組核心成員,主要參與開發(fā)集群管理系統(tǒng)。保證系統(tǒng)升級軟硬件錯(cuò)誤等均能及時(shí)被發(fā)現(xiàn)并處理,谷歌集群能小時(shí)不間斷工作。關(guān)于集群管理經(jīng)驗(yàn),首先一定要專注于持久的運(yùn)維自動(dòng)化工具開發(fā)。 本文僅用于學(xué)習(xí)和交流目的,不得用于商業(yè)目的。非商業(yè)轉(zhuǎn)載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/art... 訪談嘉賓: 鄧德源, 才云科技CT...

    Pines_Cheng 評論0 收藏0
  • 回顧Java 發(fā)展,看 Docker Mesos | 數(shù)人云COO謝樂冰@KVM分享實(shí)錄

    摘要:馬拉松會(huì)匹配每個(gè)和提供的資源,然后通過將任務(wù)下發(fā)下去。對外暴露的就是負(fù)載均衡的某個(gè)服務(wù),后面自動(dòng)將流量轉(zhuǎn)發(fā)到某個(gè)容器的端口上。還有一直辦法是用內(nèi)網(wǎng)的,這個(gè)會(huì)維護(hù)現(xiàn)有的容器列表端口,并且返回任意一個(gè)的端口,頁實(shí)現(xiàn)了負(fù)載均衡和服務(wù)發(fā)現(xiàn)功能。 演講嘉賓 數(shù)人云COO 謝樂冰 在德國工作十年,回國后加入惠普電信運(yùn)營商部門,擁有多年項(xiàng)目經(jīng)驗(yàn)和創(chuàng)業(yè)公司工作經(jīng)驗(yàn)。在數(shù)人云負(fù)責(zé)產(chǎn)品售前和運(yùn)營,專注行...

    canger 評論0 收藏0
  • 數(shù)人云|當(dāng)K8S遇上微服務(wù)-京東金融PaaS平臺(tái)思考實(shí)踐

    摘要:平臺(tái)上的微服務(wù)架構(gòu)應(yīng)用再來看一下我眼中的基于當(dāng)前最流行的微服務(wù)架構(gòu)的設(shè)計(jì)是什么樣的,即我們平臺(tái)上要運(yùn)行的典型應(yīng)用是什么樣的。 showImg(https://segmentfault.com/img/remote/1460000010900878); 8月19日的數(shù)人云Container Meetup上,張龍老師做了《基于Kubernetes的PaaS平臺(tái)的設(shè)計(jì)和思考》的精彩分享,分別...

    Imfan 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<