現在主流開源分散式系統架構都有哪些?
分散式系統是一個非常廣泛的概念,它最終要落實到解決實際問題上,不同的問題有不同的方法和架構。所有的開源軟體都是以某個應用場景出現,而純粹以「分散式」概念進行劃分的比較少見。但如果以演算法劃分,到能分出幾類: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)分散式消息隊列
根據不同的應用的領域,把上述分類細化,常見分散式存儲系統分為:
- 分散式協同系統(分散式日誌複製)
- 分散式任務調度框架
- 流計算框架
- 分散式文件/對象系統
- 分散式NoSQL存儲
- 分散式關係資料庫(OLAP、OLTP);
- 各種消息隊列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,rangeworkload分:很多種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?
※關於分散式程序設計有哪些書籍值得推薦?
※什麼是分散式作戰系統,他有什麼作用?