現在主流開源分散式系統架構都有哪些?


分散式系統是一個非常廣泛的概念,它最終要落實到解決實際問題上,不同的問題有不同的方法和架構。所有的開源軟體都是以某個應用場景出現,而純粹以「分散式」概念進行劃分的比較少見。

但如果以演算法劃分,到能分出幾類:

1.以Leader選舉為主的一類演算法,比如paxos、viewstamp,就是現在zookeeper、Chuby等工具的主體

2.以分散式事務為主的一類主要是二段提交,這些分散式資料庫管理器及資料庫都支持

3.以若一致性為主的,主要代表是Cassandra的W、R、N可調節的一致性

4.以租賃機製為主的,主要是一些分散式鎖的概念,目前還沒有看到純粹「分散式」鎖的實現

5.以失敗探測為主的,主要是Gossip和phi失敗探測演算法,當然也包括簡單的心跳

6.以弱一致性、因果一致性、順序一致性為主的,開源尚不多,但大都應用在Linkedin、Twitter、Facebook等公司內部

7當然以非同步解耦為主的,還有各類Queue

。。。。


有幾個大的維度來區分:

有狀態、無狀態;著重存儲還是著重計算;long service還是批處理。

一些常見的分散式系統大類:

a)支持持久化存儲的分散式存儲系統;

b)著重計算的分散式計算框架;

c)分散式消息隊列

根據不同的應用的領域,把上述分類細化,常見分散式存儲系統分為:

  1. 分散式協同系統(分散式日誌複製)
  2. 分散式任務調度框架
  3. 流計算框架
  4. 分散式文件/對象系統
  5. 分散式NoSQL存儲
  6. 分散式關係資料庫(OLAP、OLTP);
  7. 各種消息隊列mq
  • 分散式協調系統(日誌複製系統)其實就是paxos演算法及其變體的實現,典型的有zookeeper、etcd;一般來說只存少量的元數據信息,重點在高可用強一直,是很多分散式系統不可或缺的組件;
  • 開源的分散式文件/對象系統比較有名的包括Lustre(HPC)GlusterFS(NAS NFS)、HDFS(hadoop)、ceph(虛機塊存儲)、swift(restful對象存儲),各有不同的領域。
  • NoSQL分散式存儲種類和數量最多,按照Martin Fowler大師的分類,包括Aggregated Oriented NoSQL和圖資料庫NoSql;Aggregated Oriented NoSQL大致分為3類:

1.Key-value NoSQL,例如Redis Riak等;

2.column family NoSQL(wide column store),典型的是Hbase Cassandra;

3.document NoSQL,典型的是mongodb

開源的圖資料庫有Neo4j;

  • 分散式關係資料庫(SQL完全兼容)分析型的有GreenPlum(商業版的OLAP很多,開源的少),事務型開源的有Voltdb;還有一些基於proxy實現關係資料庫集群(很多互聯網公司都有類似mysql fabric的產品),當然這些並非真正意義上的分散式資料庫;
  • 還有一些基於開源的NoSQL分散式存儲基礎上研發的分散式OLTP資料庫(類似spanner),數據模型和事務支持,介於關係資料庫和NoSQL之間,例如Atlasdb(基於cassandra)、cockroachdb(仿照F1)等。分散式OLTP的發展還不是太成熟,還有一個calvin的項目(非2PC)值得關注,基於VLDB2014年的論文;國內一有個TiDB的項目,也比較值得關注。
  • 開源的消息隊列也非常多,應用廣泛程度不亞於nosql存儲。有些對事物支持比較好的消息隊列,例如rabbitmq active mq等;還有很多的kafka,主要做日誌處理。消息隊列的核心關注點就是一個消息at least once, at most once, only once。
  • 分散式計算框架,典型的有基於mapreduce的hadoop,基於內存計算的spark。基於mapreduce的計算框架是基於有限數據集,而面向無限數據集的流計算礦建也比較多,例如storm,Flink,samza等等也不少。
  • 面向機器學習的分散式計算框架tensorflow mxnet caffeine等(需要支持GPU計算框架cuda等),架構特點跟其他計算框架有很大不同,主要建模對象是人工神經網路,需要進行大量的浮點運算和迭代運算,往往會採用一個全局的參數伺服器存放迭代計算的中間結果。

分散式存儲系統有一個常見的CAP理論,從CAP的角度,則可以劃分為CP和AP系統。Dynamo可以配置為偏向CAP裡面的AP系統,提升Availability,適當犧牲consistence,只要做到eventual consistence即可滿足,允許短暫時間的數據失真,但是該系統必須是隨時允許用戶提交寫請求,例如Dynamo應用於amozon的購物車服務。

CAP在學術界已經算相對傳統的理論,最新研究的熱點理論是FIT不可能三角:Fairness,Isolation和Throughput,三者只能滿足兩條犧牲一條(http://cs-www.cs.yale.edu/homes/dna/papers/fit.pdf)。voltdb屬於犧牲fairness,spanner則是犧牲吞吐量。大部分NoSQL存儲均屬於犧牲隔離性滿足公平和性能,而一個嚴格的分散式OATP系統,則需要滿足隔離性。

還有一個常見的說法叫BASE(basically available soft state and eventually consistence),總結了NoSQL存儲的一些特點:不保證絕對高可用,極端情況下允許返回失敗;集群內部存儲數據的狀態也會存在變化(例如過期老化,副本修復等);最終一致性可定要滿足;

總而言之,針對不同的應用場景,不同的數據模型,不維度的tradeoff,各大互聯網公司的碼農了造了很多分散式存儲的輪子。總起來的思想都是,需要持久化存儲的數據狀態,交給一個分散式存儲系統來做,應用開發者,除了關注業務邏輯之外,需要在不同的分散式存儲中選擇一個適合自己的輪子,特別是數據一致性、持久性和性能之間的trade off。


功能分: olap, oltp, 分散式日誌,share-nothing, numa, MapReduce, DAG.

數據分:表格,對象,文件,關係。

架構分: 類bigtable, 類dynamo

日誌複製分: primary-backup,gossip,quorum.同步,半同步,非同步。

數據切分分:hash,range

workload分:很多種

membership分:自己選主,主控節點選主,dlm選主。

CAP折衷分:強一致性犧牲可用性,最終一致性更高的可用性。


我的 gmail 裡面現在還有一封草稿,是發給 erlang-china 社區的。內容是我一直想不明白,為什麼 hadoop 成了主流的分散式計算架構,而不是 Erlang/OTP。後來覺得這種比較貼太多了,所以沒有發出去。

我認為 Erlang/OTP 系統是最優秀的分散式架構。它的每個特性----變數不變、輕量線程、IPC/RPC 機制、閉包、代碼熱升級、監控樹模型、world等等等等----都是為了分布與並發準備的。用 Erlang 做分散式架構實在太輕鬆了,開發效率是 C++ 開發的近十倍

國內很多項目也紛紛讓 Erlang 上馬,但基本上都秘而不宣。Erlang 社區也曾經一度活躍,到現在,已經沉寂了快兩年了。我也很期待像某人解釋的那樣,興起必然伴隨著跌宕起伏,金子遲早會發光的。


高性能rpc服務框架,zookeeper服務註冊和發現,配置中心這幾個是重點,其他的比如MQ和緩存服務


粗略一看二郎的語法,頓時奔潰了

能流行起來的東西,往往是因為他簡單易用


我們曾經做過一個網站,之前用微軟4.0開發的,數據量達到7萬*35萬後,查詢統計功能就完全死掉了,沒法用,後來更換了erpcore快速開發框架,利用緩存技術重新開發,這個問題基本就解決了,這個比較適合像學校這種要求自有伺服器,小的技術團隊開發的web軟體架構


參與人數越多的大系統,使用同構技術帶來日後維護的難度風險越高,所以現在開源分散式系統基本都是基於公開協議的 MQ 或 RPC 進行組織的。Erlang 作為一個無所不包的平台,用在一個公司 / 團隊內部實現系統是可以的,放在外面,優勢不如「找不到合適的人」的劣勢明顯。


關注


嗯,erlang確實被忽略了!現在多核超線程是該產生點變革性的東東了


scala+akka


dubbo


erlang不流行可能與其編程思想有關,其獨特編程思想,讓那些有思維定式的人很難理解。所以,真正掌握的人不多,能掌握的都是高手,高手大多比較謙虛,經歷豐富高手一般都非常謙虛。所以,社區不熱。


推薦閱讀:

Paxos(Multi-Paxos)在工程實現中需要注意哪些問題?
如何理解Nvidia英偉達的Multi-GPU多卡通信框架NCCL?
關於分散式程序設計有哪些書籍值得推薦?
什麼是分散式作戰系統,他有什麼作用?

TAG:分散式計算 | Hadoop | 分散式系統 |