云時代的終結
我們正面臨云時代的終結,這是一個很大膽的論調,甚至有一些瘋狂,但請耐心看完下面的內容。
傳統的認知認為服務器應用的未來在云端。亞馬遜、谷歌和微軟在他們的云產品中加入越來越多的工具,讓運行服務器軟件變得越來越容易,以致于人們覺得將代碼托管在AWS、GCP或Azure上會是最好的選擇——因為這樣做方便、便宜、容易進行自動化、彈性伸縮……既然如此,為什么我還會預言云時代的終結呢?
云無法滿足長期的伸縮性需求。在云端構建一個可伸縮、可靠、高可用的Web應用程序其實是很困難的。就算你做到了,那也是以耗費大量金錢和精力為前提。如果你的業務開展得非常成功,最終還是會受到云和Web本身能力的限制:計算機的計算速度和存儲容量比網路帶寬本身增長得更快。或許這對大多數公司(Netflix和Amazon除外)來說并不是個大問題,但很快就會成為問題。通過網絡傳輸的數據在急速增長,視頻的分辨率在提升,需要傳輸的數據量越來越大,而且很快就會有VR數據集在網絡上傳來傳去。
這個問題與Web結構本身有直接的關系。獲取內容的客戶端遠比提供內容的服務器多。比如,有人在Slack上張貼了一張有趣的小貓圖片,和我坐在同一個地方的其他20個人都對這張圖片感興趣,所以我們每個人都從服務器上把圖片下載下來,那么服務器就需要發送20次圖片。
如果將服務器移動到云端,那么靠近用戶的網絡需要處理無法預測的吞吐量。除此之外,還需要海量硬盤來保存這些數據,以及使用很多的CPU將數據推送給每一個用戶。隨著流服務的增長,這種情況會更加嚴峻。
這些活動需要大量的能源和冷卻機制,讓整個系統變得低效、昂貴,甚至給自然環境帶來污染。
集中式的結構讓系統變得脆弱。集中式的數據存儲和程序在可用性和性能方面存在不足。如果Amazon的數據中心發生洪災、被小行星撞毀或遭遇龍卷風該怎么辦?或者輕微一點,比如發生了短暫的電力故障?機器上保存的數據就無法被訪問,甚至永久丟失。
我們一般會把數據保存在多個地方來降低這種問題發生所造成的危害,但那樣就需要更多的數據中心。或許使用多個數據中心會極大降低事故風險,但那些非常重要的數據仍然可能丟失,比如婚禮視頻、孩子成長的照片或者像Wikipedia這類非常重要的公共信息資源。這些資源全部保存在云端——非死book、Google Drive、iCloud或Dropbox等。如果這些服務哪天失去資金支持,那么這些數據該怎么辦?即使這種情況不會發生,要訪問這些數據仍然有諸多限制,比如你要通過他們的服務才能訪問到這些數據,即使你把它們分享給你的朋友們,他們也仍然需要通過這些服務來訪問這些數據。
云服務提供了信任機制,但并不保證絕對安全。你的朋友只能信任經由受信任的中間人發送給他們的數據,這在大多數情況下是沒有問題的,但網站和網絡是由國家注冊的合法實體進行運營的,政府完全有權力迫使他們做一些出格的事情。大多數時候,這樣做會是一件好事,因為可以借此幫助解決犯罪問題或者移除網絡上的不合法內容,但如果這種權力被濫用了就會走向另一面。
就在幾周前,西班牙政府通過手中的權力停止了加泰羅尼亞地區的一次獨立公民投票活動,他們封鎖了與投票相關的網站。在中國,通過封鎖麻煩網站和秘密修改用戶內容這種行為是很常見的。即使在自由言論不成問題的西方國家,也仍然需要努力讓互聯網變得更加自由和開放,保證用戶看到的內容就是作者要發布的。
這讓我們感到坐立不安。高度集中的互聯網最可怕的地方在于私人數據的堆積。大公司為我們提供了各種服務,同時坐擁大量的用戶數據,他們通過這些數據預測你將會購買什么商品、將會把手中的選票投給誰、可能什么時候會買房子,甚至預測你想要幾個孩子。
或許你會覺得這沒什么問題,畢竟你是相信他們才愿意把信息透露給他們,但你要擔心并不是他們,而是另有其人。今年早些時候,信用報告機構Equifax經歷了有史以來最大的一次數據外泄事故,泄露了1億4千萬客戶的信息。如果我們能夠再小心一些或許可以避免這類問題的發生,但很顯然,數據泄露是無法完全避免的,而且一旦發生了就無比危險。唯一可以防止這類情況發生的辦法就是在一開始就不要如此大規模地收集數據。
那么,什么將取代云?
基于CS模式(如基于HTTP協議的客戶端與服務器端交互)的互聯網和依賴集中式認證實體的安全機制(比如TLS)很容易出現一些難以解決的問題,所以我們需要找到一種更好的模式,在這個模式里,沒有人會把你的個人數據保存起來,大媒體文件通過整個網絡進行傳播,形成一個完全點對點和無服務器的系統(這里說的“無服務器”不是指云端的無服務器架構,而是指真的沒有服務器存在)。
通過廣泛了解這方面的新興技術,我確信點對點技術就是我們的方向。點對點Web技術旨在通過一些協議和策略替換掉已有的Web構件塊,解決上述的大部分問題。點對點技術的目標是形成一個完全分布式、持久、冗余的數據存儲,網絡中的每一個客戶端都保存了數據的部分副本。
如果你之前聽說過BitTorrent技術,那么也應該很熟悉下面的內容。網絡用戶通過將大文件拆分成小文件(每個小文件都有一個唯一ID)進行分享,不需要集中式認證實體。如果要下載一個文件,只需要提供文件的散列值。BitTorrent客戶端會找到持有該文件片段的對等節點,并將文件片段下載下來,直到找到所有的文件片段。
那么我們該如何找到對等節點?BitTorrent使用了一種叫作Kademlia的協議,網絡里的每個節點都有一個唯一ID,與數據塊ID的長度一樣。每個數據塊被保存在一個節點上,這個節點的ID與數據塊ID最為接近。數據塊ID并不是隨機生成的,而是使用了數據塊內容的散列值,相當于數據塊內容的指紋,所以數據塊可以通過散列值進行尋址,并可以通過重新計算和比較散列值來驗證數據塊內容。因為數據塊內容是唯一的,所以就不會下載到與原先內容不一樣的數據。
更有意思的是,通過將散列值內嵌到另一個數據塊里,就可以實現數據塊鏈接。如果鏈接的數據塊被篡改,它的ID也會發生變化,那么鏈接就會失效。而如果內嵌的鏈接被篡改,那么包含鏈接的數據塊ID也會發生變化。
通過這種內嵌ID鏈接的機制可以生成數據塊鏈,甚至是更復雜的結構,比如有向無環圖,簡稱DAG。這種鏈接也被稱為Merkle鏈接,以發明者Ralph Merkle的名字命名。Git倉庫就是一個Merkle DAG的例子,Git將提交歷史和所有的目錄及文件保存成數據塊,并分布成一個很大的Merkle DAG。
這又引出了另一個有關分布式存儲可尋址內容的屬性:它們是不可變的。數據塊內容是不可變的,修改過的版本會單獨保存,不同修訂版但內容沒有發生變化的數據塊會被重用,因為它們擁有相同的ID。這就意味著,在這個系統里,不會出現重復的文件。所以,在這個新的Web系統里,同樣的小貓圖片只會存在一個副本。
借助Kademlia協議、Merkle數據塊鏈和Merkle DAG,我們可以構建出結構化的文件模型和修訂時間線,并在大規模的對等網絡里共享數據。現在已經有一些協議在使用這三項技術構建分布式的存儲,比如IPFS。
命名和共享方面的問題
上述的幾項技術已經可以解決之前所列的問題:我們擁有了分布式、高冗余的存儲,在必要的時候可以追蹤到文件的歷史修訂版本。這幾乎解決了可用性、容量、性能和內容驗證方面的問題。它也解決了帶寬問題——數據在對等節點之間傳輸,不存在瓶頸。
我們還需要一個可伸縮的計算資源,不過這實現起來不會太難:人們使用的筆記本和手機比大部分應用所需要的計算能力要強大得多,所以計算能力是完全可以水平伸縮的。只要我們能夠讓所有設備參與計算,就可以解決可伸縮計算資源問題。
現在,我可以直接從坐在我旁邊的同事那里獲取小貓圖片,而不是從Slack服務器上下載。但如果要上傳一張小貓圖片,就需要更新Slack通道,這個看似無傷大雅的事情卻是最為困難的部分。
最困難的部分:更新內容
隨時間變化的實體其實是人類大腦對外在世界穩定秩序的一種反映。我們也可以把這種實體看成是一種標識,隨著時間的推移,它會帶上一系列不同的值(這些值是靜態、不可變的)。在為計算機進行信息建模時,這是一種更為自然的方式。如果我告訴你一些事情,就像潑出去的水,無法收回。美國總統是誰這個事實是不會隨時間發生改變的,它們只會被具有相同標識的另一個事實所替換。在Git系統里,一個ref(branch或tag)可以在不同時間指向不同的提交,使用一個新的提交替換當前指向的位置。Slack的一個通道也就是一個標識,它的值就是一個隨時間增長的消息列表。
真正的麻煩在于,通道里還有其他人。他們都想往通道里發送消息,有時候還同時發送。
集中式系統里會有一個單獨的中心實體來保證這些更新事件按照串行的方式進行。而在一個分布式系統里,所有參與方都是公平的,所以需要一種機制來保證可以在“歷史”問題上達成某種共識。
對于分布式系統來說,達成共識是最為困難的部分。這個問題不僅僅影響到并發更新操作,也影響到那些需要在適當位置進行更新的操作,比如那些隨時間發生變化的“事實來源”。這個問題不僅對于數據庫來說很難實現,也會影響到其他關鍵服務,比如DNS。通過非集中式的方式來注冊ID意味著所有的參與方需要達成共識,比如一個名稱代表什么意思,否則兩個不同的用戶可能會看到具有相同名稱但內容不同的文件。基于內容的尋址方式在機器層面解決了這個問題,但對于人類來說,問題依然存在。
一些已有的策略可以用于處理分布式共識問題。比如,通過“quorum”機制選出一個“首領”,讓它來做出決策(如Paxos和Raft協議),接下來所有的變更都需要通過這個首領。這實際上也是一種集中式的系統,只不過它可以容忍中心實體的崩潰或網絡中斷。
另一種是基于工作證明(proof-of-work)的系統,比如比特幣區塊鏈,它們通過讓對等節點解決謎題來達成共識。謎題難度很高,但檢驗步驟非常簡單,而且還提供了一些額外的規則用于解決沖突。一些分布式區塊鏈使用基于權益證明(proof-of-stake)的共識來減少解決謎題所耗費的能源。對權益證明感興趣的讀者可以參考由BitFury發布的這篇 論文 。
還有一種方式是圍繞CRDT(無沖突復制數據類型)而展開,在某些情況下完全不存在共識問題。最簡單的例子就是計數器,如果所有的更新操作都是要“加一”,只要我們能夠保證每個更新操作只執行一次,那么次序就不重要了,而且結果總是一樣的。
對于這個問題似乎并不存在一個很清晰的答案,或許根本就不存在這樣的答案,不過還是有很多聰明人在努力工作,他們提出了很多有意思的解決方案。我們只需要從中做出權衡,具體要根據規模而定,并在可用性和一致性方面做出一點妥協。大部分應用會選擇可用性和最終一致性。
公共文件里的隱私
隱私問題是一個很明顯需要去解決的問題。在將內容保存到分布式系統的同時又如何能夠做到不讓所有的東西都公開呢?如果能夠做到隱藏私密內容,那么基于內容尋址將會是一個很好的解決方案。我們有三個層次的隱私:公開、隱藏和私密。對于第三個層次來說,似乎可以通過加密來實現——對保存的內容進行加密并通過“帶外(out of band)”(比如NFC、掃描QR碼)進行共享。
完全依賴加密似乎存在一定的風險(駭客無時不刻在尋找漏洞),但其實也沒有那么糟。事實上,在實際應用當中還是很安全的。公司和政府通常會把敏感數據保存起來,讓公眾無法訪問到。相反,只有一些內部的人員可以訪問這些數據,如果你可以訪問存儲數據的系統,就可以看到這些數據。
但如果我們使用一種公開的方式來保存私密數據,我們就需要強制使用高強度加密來保護數據,這對于需要訪問這些數據的人來說不會是一個好消息。這有點類似開源與安全相關的軟件,每個人都可以看到內部的工作原理,并找出問題所在,但了解安全機制并不會幫你更好地破解系統。
這種訪問控制機制所造成的問題在于,如果你授權某些人訪問某些數據,那么他們就會永久持有這些數據的當前副本。你當然可以修改加密秘鑰,但問題是顯而易見的:只要授權他人訪問數據,他們就可以擁有這些數據的私有拷貝。
這一領域所面臨的挑戰在于,如何建立一個系統用于驗證標識和在會隨時間發生變化的一組人當中共享私有數據,比如一個私有Git倉庫的協作者們。這完全可以通過組合私鑰加密和旋轉秘鑰來實現,但這樣會給用戶帶來不好的體驗。
從云到霧
云的終結將是一個激動人心的時刻,盡管存在巨大的挑戰。首先,在技術方面,我們需要在點對點網絡方面做出大量的改進。基于內容尋址的存儲機制為內容本身提供了驗證功能,保存的內容是永久的(只要還有人對它們感興趣),而且在速度方面應該也會有很大改進。
在未來的某一時刻,數據中心可能會成為如煙往事。用戶的設備變得越來越強大,計算和存儲到處可見,因為它們就在用戶的手中。
對于業務來說,這種改變將會體現在成本的縮減上,并省去了構建可靠數字產品的煩惱。業務不再專注于如何減少宕機時間,而是把精力放在如何增加客戶價值上。我們仍然需要一些云端服務器,但它們已經變成了對等節點。我們仍然會看到異構應用,有一些是面向客戶的對等節點,也有一些是后端對等節點,它們基于不同的加密層級實現訪問控制。
對于企業和用戶來說,另一個好處體現在對用戶數據的處理方式上。因為不再需要集中保存大量的用戶信息,就不會有大量數據泄露的風險。軟件開發社區的領導者們長久以來都在爭辯說,用戶將數據通過互聯網傳送給業務方的應用程序,這種設計是有缺陷的,相反,我們應該將應用程序發送給用戶,讓它們運行在用戶的私有數據上。這種模式看起來更為安全,因為業務方就無法收集到用戶的信息。
但仍然會存在混合型的方案,一些不透明的服務掌握著私有數據。
這類架構用于進行大規模計算或提供軟件服務,更接近于最初設想的以開放信息交換為準則的互聯網,任何人都可以向他人發布內容,并通過網絡用戶達成共識來控制內容的發布和訪問,而不是讓擁有服務器的私有實體來控制。
來自:http://www.infoq.com/cn/articles/the-end-of-the-cloud-is-coming