這里很重要的問題,兩階段的提交肯定是強意志的,不管是M/S還是MM都是Eventual的,這里就會出現一個問題,像經典的購物車的問題,它就有可能出現數據丟失、數據不一致的情況出現。很多做傳統(tǒng)數據庫的專家,他們去挑戰(zhàn)Amazon的老大,它們是最早做Eventual,在學術界提出Eventual最終一致性,就去挑戰(zhàn)這個,最終一致性到最后的結果就是最終不一致。當然大家可以互相爭論,這里確實有一些學術問題值得討論,包括微軟把一堆分布式數據專家請到微軟研究院。但是你看他做出來的Azure效率高,性能也沒它好,盡管沒聽說它數據丟失,但整體上來說并不見得比Amazon做得更好。理論上可能很成功,實際操作過程上不一定會做得很好。大家有機會可以把這個東西記住,有很多有價值的東西。我們設計了一套系統(tǒng)基本上是在Paxos這個領域。
底下有很多細節(jié)的東西不說了。比如說Peer-to-peer,這是在Cluster里要設計三個并列點的時候,從個人的角度來講,不希望是Master/Slave模式——它支持的是Eventual。在處理這個數據里面的時候,我們希望是既有Eventual,同時也有強一致性。所以在這里,我們就采用了Peer-to-peer的模式,而沒有采用Master/Slave模式。
Meta-data,這個挑戰(zhàn)更大,是結構化的數據。結構化數據最好的方式是放在關系數據庫里面,這是最簡潔,非常成熟,很穩(wěn)定等等,但是關系數據庫不能很好地Scale Out,它在分布式的環(huán)境下面做得不太好,它要么就是效率非常的低,要么就是只有單獨的一臺機器,所以這里面有很多矛盾,我們采用特殊的方法對它處理。我們剛才提到每秒鐘100萬個影像,每個影像是有元數據描述的,意味著每秒存100萬影像的同時必須每秒存100萬條元數據存到我的數據庫里面,目前沒有已知的數據庫可以cost-effectively處理這個事。
你那里面分出來,可能能分出三類數據。一類是放到關系型數據庫里面。一類是對象類的數據,包括你的圖片、網頁、文本、PDF文件等等。還有一類就是,你把這個里面的數據和這個里面文本的部分提取出來變成索引的,就是現在大家比較熟悉的,跟搜索引擎相關的一些東西。這三類數據,你們未來建構里面肯定都會碰到,所有我們碰到的挑戰(zhàn)你們也可能會碰到,取決于看你底下選擇什么樣子的平臺來實現。對象這邊,我們采用的是Openstack Swift,來做Object Store,但是光用這個還不夠,我們還對小文件進行了特殊的優(yōu)化,你們可能也會碰到同樣的事情,你可能不需要去管Swift底下做了什么,或者你用Amazon、華為的對象服務器都可以,你要求它給你的指標都可以了,不做研究,也沒有必要走到下面。
小文件的Optimizer,這是一個技術,我們物理盤構建的結構,當年IBM做硬件盤的時候用了很多成熟的技術,有很多創(chuàng)新在里面,過去很多年我們還在這個硬盤上生活著,我們現在構造的大多數數據都在這硬盤上面,隨著數據量越來越大它有一個限制,只有一個讀頭,這個讀頭每秒鐘最多能處理100個讀或者是寫,這是它基本的限制,由于數據量增加限制越來越多性能就直線下降,要解決的問題是用特殊的方式做成平的,這樣你的盤在三年生命周期當中是保持一致的,我們做的這樣一個東西。
當要用關系數據做這件事情的時候,金融的數據,尤其是股票交易的數據過來,一定要保證它參照的,換句話說它必須是Atomic,不能讓它變成Eventual,Base在這個數據上面是不合適的。那些其他的數據是可以用Base來做的,但是在這個底層存儲上必須要做到Atomic,這種情況底下要保證至少存三份,才能保證足夠的冗余來處理這件事。這邊可能也要用到Object Store,這是我們當時做的東西。
這是Facebook的例子,Facebook來用HBase做Messaging,然后它發(fā)現單機是不行的,一旦單點失敗了Facebook用戶和用戶之間、用戶和系統(tǒng)之間的交互就會失效,于是做成了雙機版,雙活的版,到目前我還沒有聽說進到Hadoop里面去,它底下的對象是Haystack,Haystack有一篇很著名的論文,你們可以讀一下,里面做了很多優(yōu)化。
谷歌的Spanner。谷歌是很有意思的一家公司,已經金蟬脫殼了,換了一個名字。它在數據的層面,十幾年前它跟大家說SQL死了,大家應該用NoSQL,于是一大批人跟著它走,三年前它說SQL還是很有用的,于是大家就不知道怎么辦了,十年前跟著你跑,跑了半天又繞回來,不是在忽悠我們吧?本質上SQL還是有用的,它做的F1&Spanner本質上就是實現全球的SQL,它把它叫第一個全球化的SQL,這個稍許夸大了一點,從使用上來講是第一個使用的,別的有一些內部的秘密沒有公開。它里面很重要的一個東西,它的數據是通過Paxos來維護它的高一致性的,Paxos是很著名的算法,大家有機會可以專門討論。它的Paxos是在全球的大數據中應用,我們知道,數據一致性里面,分數據管理里面很重要的難題,根本上我們是用一個時間,以這個時間緯度作為數據到來的先后順序決定數據的一致性,換句話說,當你有N個數據分析的時候,每個數據時鐘有些微差異的時候,當你達到毫秒級、微秒級、納秒級的時候,你的時鐘和時鐘之間的同步就變得異常重要,精度也變得異常重要,谷歌做這個的時候,每個數據中心上面要支一根天線接到GPS衛(wèi)星,用GPS衛(wèi)星時間來衡量先后,這是分布式問題的一個本質。谷歌未來會走成什么樣子,這個不清楚,目前它們內部在使用這個事情。