標籤:

一名分散式存儲工程師的技能樹是怎樣的?

或者分散式系統方面還有哪些工作方向?


分散式存儲工程師顯然要關注分散式和存儲這兩個方面

分散式:

  • Lamport大師的論文讀過沒?,什麼是lamport鎖?Paxos如果選舉?
  • CAP原理到底怎麼玩?一致性hash怎麼搞?AmazonDynamoDB那篇著名的論文只是要讀過.
  • 分散式系統裡面Member ship怎麼管理?什麼是gossip protocol?
  • MapReduce好歹知道一下, google的MapReduce論文總得仔細讀讀,要不然連個word count都不會,都不好跟人打招呼.

  • 分散式系統的歷史和現狀多了解?chord, kademlia, hadoop, corosync, ceph, cassandra,

伊利諾斯大學有個分散式在線課程最後會實現一個分散式的k-v資料庫,課程里有lecture,也有作業還有TA幫助你們,給回答問題,強烈推薦

一點兒參考資料:

課程:

https://www.coursera.org/course/cloudcomputing

論文:

http://research.microsoft.com/en-us/um/people/lamport/pubs/paxos-simple.pdf http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.37.767rep=rep1type=pdf

-----

GitHub - kevinxhuang/awesome-distributed-systems: A curated list of awesome distributed systems books, papers, resources and shiny things.

這個總結的也很好.

別忘了,還有存儲

存儲:

  • 基本常用的數據結構總要熟悉吧,btree啊,skiplist,LSM啊
  • 操作系統原理總要懂的一些的,什麼是inode,什麼是page cache, 什麼是elevator演算法,什麼是superblock, bio, 什麼是plug什麼是unplug,這些要是不明白,maillist裡面說什麼都很難理解。推薦Understand Linux Kernel那本書吧.
  • 理解硬碟原理,知道硬碟有多慢,知道寫不同的sector的時候不是原子的,理解transaction
  • 介紹文件系統的書少,但是介紹資料庫的書多,基本原理都差不多,都是btree, lsm, transcation,還有各種allocator的概念亂飛.
  • 現在在單機用的存儲, ext2(這個代碼簡單,也沒有journal), sqlite3, rocksdb
  • 還特別推薦這篇文章How does a relational database work - Coding Geek, 雖然是介紹資料庫的,但是底層的原理都很像,建議一讀。

又一點參考資料:

stanford的資料庫原理課程:

CS 245 Database System Principles :: Main

對應資料庫的text book:

資料庫系統實現 (英文版 第2版),這本書是影印版,也有翻譯的,但還是推薦讀原文,看懂還是不成問題的

一個德語的課程,不過slide都是英文的

https://www.informatik.hu-berlin.de/de/forschung/gebiete/wbi/teaching/archive/ws1213/vl_dbs2

sqlite的rollback mode的實現

Atomic Commit In SQLite

sqlite的WAL的實現

Write-Ahead Logging

理解Linux內核

http://gauss.ececs.uc.edu/Courses/c4022/code/memory/understanding.pdf

語言

  • RocksDB C++

  • Ceph C++
  • Hadoop Java
  • Canssandra Java
  • Redis C
  • InfluxDB Golang

看你做什麼項目了,這些主流語言總得會一樣.

大規模的分散式系統總要部署運維自動化測試什麼的,一些膠水語言不可少,

Bash, Python能大大提高工作效率

需要大數據分析用戶行為?需要大數據預測硬碟什麼時候壞?我用的是Spark做數據分析,這時候還需要Python.

有時候需要寫一個Proxy做流量清理,或者cache一些請求,減少存儲集群本身的壓力,那openresty是好幫手,所以你需要Lua.  或者Golang也是一個好選擇.


分散式存儲相關的系統大概分為幾種(這裡不說分散式計算相關係統):

1. 分散式文件系統,比如HDFS,Ceph。這些專門存大文件。特別是HDFS大公司標配,不多說。

2. 對象存儲,典型的就是Amazon S3,這種系統很多公司自己造給公司內部用,存圖片等小文件,介面一般不會兼容Amazon S3,因為不需要,比如淘寶的TFS,基本思路就是將多個小文件合併成大文件存儲,經典論文FB的HayStack。這種系統一般讀多寫少,不需要修改,很少刪除,一致性也沒那麼強,系統相對好做。基本上HDFS+HBase就能搞定一個這種系統,HBase存元數據,利用HDFS的Append功能將小文件合併成大文件。

3. 分散式資料庫。對外數據模型是一張表格(底層可以是一個分散式KV)。比如HBase(BigTable),阿里的OceanBase,國外的cockroachdb(GitHub - cockroachdb/cockroach: A Scalable, Survivable, Strongly-Consistent SQL Database,基本上你能看懂理解它的設計文檔,水平就很不錯了)還有前同事的創業項目TIKV(https://github.com/pingcap/tikv 想做資料庫的可以投簡歷)。這些都是強一致性OLTP資料庫,除了HBase,其他兩個都支持分散式事務。分散式事務和多副本強一致性都是比較難做的事情,分散式事務基本都是兩階段提交,實現過程中需要處理協調者/參與者故障問題,這就需要協調者/參與者多副本。同時,為了高可用,容錯,每份數據也要多副本。如何維護副本的一致性又是個大問題。OceanBase使用Multi-Paxos,corckroachdb使用Raft, https://ramcloud.stanford.edu/~ongaro/userstudy/, 目前我看到過的最好的將Multi-Paxos和Raft的資料。Paxos的設計僅僅是考慮對一個值達成一致,Paxos協議本身沒有考慮工程中的應用,故沒有考慮日誌同步。所以有了Multi-Paxos。Raft出現的晚,把工程中的問題考慮在內,其中的限制就是日誌同步要求順序。而Multi-Paxos沒這個要求,相應的實現也更複雜。由於Paxos對一個值達成一致需要兩輪,為了提高性能,引入主,只有主能propose日誌,這樣Paxos第一輪就不需要。這就需要選主演算法,選主演算法有很多,比如基於IP,或者直接基於Paxos都行。然後就是成員變更,即擴容縮容問題。Raft再一次考慮在內。其實這裡關於一致性直接就說了高級的協議,這些高級協議能夠在多點寫的情況下也能保證一致性。相對來說"低級"的做法就類似於NWR,寫成功需要寫majority成功,讀也需要讀majority,它就不能很好的處理多點寫導致的一致性問題,需要應用程序自己選擇,代表Dynamo, 這有設計到Vector Clock等技術。然後考慮到負載等原因,還需要對tablet(range)進行分裂啊遷移啊等操作,這也是一個點,大都依賴外部coordinator來解決,比如ZooKeeper,etcd。最後再說一下時序問題,因為是分散式系統,不同的機器時鐘不可能一樣,或多或少有誤差,這就給資料庫的外部一致性帶來了一些挑戰,實際的工程做法一般都是NTP同步啊,當然Google的Spanner比較牛逼,使用硬體實現的原子鐘,api叫做TrueTime。還有更理論一些的做法就是logical clock,折中一點的就是HLC,一種邏輯時鐘物理時鐘混合的方案。

對新手來說,可以刷MIT的這門課,http://nil.csail.mit.edu/6.824/2016/schedule.html

作業基於Golang,開發效率高,以前都是C++。

中文博客的話可以看 emailed - 博客園 上面提到的很多技術博客中都有講到。


別說虛的了我說點兒實際的吧,最重要的技能就四條。

第一出故障的時候如何甩鍋。

第二出故障鍋又甩不出去的時候如何裝孫子。

第三丟數據的時候如何甩鍋。

第四丟數據鍋又甩不出去的時候如何儘快找到新工作。


說的很好, 關係資料庫的WAL, 事務太重要了.建議看stonebraker的architecture of a database system. 和Jim gray的Transaction. 回頭看dynamo和gfs, 收穫很多. 理解會更加深入. 其實學習完全可以按照這樣的roadmap

1. WAL + RSM

2. RSM(分散式共識): TOB協議, Quorum-based協議, 和Primary-backup協議.

3. partitioning replication + local storage engine.

4. local storage engine: bdb, innodb, leveldb.

5. 磁碟和網路優化技術.

6. 分散式一致性(隔離性).

7. 分散式事務: stm, mvcc, 樂觀鎖.

8. 分散式查詢優化

工程實現超高的編程技巧

1.能夠像haskell那樣impure和pure分離。

2.冪等的設計,讓部分有狀態的模塊成為metal unit, 同時冪等設計和failstop能夠將有效地避免非bf.

3.元編程能力,降低代碼的冗餘和耦合,代碼更適合擴展和組合。

4.超高的系統編程能力。

5.單測,mock測試設計能力。

6.漂亮的日誌輸出。

7.會做pperf

8.會使用docker加速自己的開發效率。

周邊涉及

1.精通MySQL sharding,不知道它的痛,就不知道為啥要堅定不一地搞分散式關係資料庫。

2.精通大數據的bi解決方案,不知道它的痛,就不知道為啥要好全新的分散式列式資料庫。

3.區塊鏈,分散式計算引擎也了解一點。


現在大多數上來關注點就直接是分散式,忘記目標是存儲,分散式是形態和手段

交互界面、存儲介質、存儲邏輯、傳輸介質

這個要從存儲的介質說起,如果沒有去插拔過硬碟,看過interface和protocol很難有感性的認識:

SSD、SATA、SAS、磁帶等原理

IO能力、可靠性(誤碼率)、擦寫次數、介質持久性

存儲提供服務姿勢:

block、FS、Object 等等

分散式:

空間分配、空間回收、定址等演算法、一致性協議、CAP的權衡,這個資料很多了

可靠性與成本:

Raid、EC、副本等等

效率:

cache、分層、IO-path

操作系統、硬體特性、傳輸介質

重要的是搞清楚需求,要解決現實問題,分散式天生帶來複雜度,過早考慮高大上會比較疼


我覺得技能樹這種東西沒啥用,要列可以列很多,但是實際上也不見得每個都要懂,並且如果是做分散式系統的,自然在工作中就需要懂該會的東西了,如果沒做,只是想入門,那麼各種雜七雜八的就更沒必要提前接觸了。另外深度比廣度肯定更重要一些,尤其是做分散式系統的一般也都在一個大公司,都是很多人做很多個系統你只負責其中一個,能把你負責的那塊搞的很深入很牛逼就可以了。甚至很多時候一個人都不見得懂一個系統的所有部分。

所以對於已經做分散式的人,我覺得把本職工作做精做細,經常了解業界最新的架構/演算法/理論就可以。對於還沒有做但對這個感興趣的人,簡單了解一下常見的分散式系統的原理很重要,至少得保證你能有機會拿到做分散式系統的offer或者可以在公司內轉組轉項目,當然這說的是社招。校招的話,很多時候面試都是演算法數據結構等基礎,而且最重要的是能有機會分配到這樣的部門,因為很多公司校招的時候是不分部門的進來再分,很可能就被分到別的部門了。


我來簡單回答下,雖然從事這塊已經五年,但覺得自己才剛剛入門,如有不專業的地方,請多多包涵。

分散式系統分類:

1. 基於分散式一致性hash的緩存分散式存儲

2. 基於二階段遞交或多數一致的事務類或選舉類系統

3. map reduce類的的分散式計算如hadoop,spark

4. 分散式資源調度類系統如yarn,mesos

其中1,2一般比較實時,3,4一般非在線使用。

理論基礎:

1. 分散式系統的幾個重要概念,如,C A P,分散式事務的二階段遞交,paxo s演算法或改進版本需要了解以及有較為深入的理解。

2. 非分散式資料庫的了解,包括btree,以及基本單機事務的實現方式等。

3. 對操作系統的了解,如磁碟讀取方式,操作系統nio等

4. 對某個語言的鎖處理了解,多線程實現模型,運行效率了解。

5. 安全性的問題,這個問題我的了解不太深入。

如何入門:

1. 通過搭建分散式redis,分散式mongo這類存在分散式解決方案的系統,建立一種大概概念。

2. 寫MapReduce並觀察hadoop或spark等的運行過程。

3. zookeeper 來了解一致性選舉協議。

如何深入:

想想為何mongo沒法作為線上解決方案。

看懂dynamo的論文,理解分散式事務三個一致性的層次。

搭建一套利用開源組件分析收集並定時執行分析的日誌類監控集群。


列表估計會有很多人貼出來,我比較喜歡走方法論,就說下自己的。以下不只針對於分散式存儲。

領域層面,從兩塊了解:

1)分散式

2)存儲

技術功底層面,從三個維度去理解學習:

1)體系(基礎理論、演算法、架構等)

著眼系統觀的問題,準備構建自己的知識能力體系。信息來源:書籍,課程,他人總結

2)工程

著眼上手和落地,快速摸索常規打法,了解各廠商水平,確定自己各階段的重點方向。信息來源:實際項目,各廠商,開源

3)前沿與未來

學習應用,還是創新引領。信息來源:論文,會議,交流

最後,價值層面,非技術/非基礎技術等不同層次與視角理解並探索實際應用場景中的問題。


上面的回答似乎都沒有把區塊鏈技術考慮進去,也就是說沒有考慮去中心化的存儲解決方案,全部提的是中心化的解決方案。如果要結合區塊鏈技術來做存儲的話,你需要了解以下知識:

1. p2p網路

2. 共識演算法,一致性演算法可以說是條件更弱的共識演算法,是不考慮拜占庭將軍問題的共識演算法

3. 交易與腳本:錢包api,腳本語言(比如以太坊的solidity)

以上是高層的知識,以下是更底層的組成技術:

1. 加密演算法以及相關的數學基礎知識,加密包括:對稱加密、非對稱加密,橢圓曲線加密等

2. 嵌入式資料庫:最常見的就是leveldb、rocksdb

3. 基礎的數據結構、演算法:如merkle tree, skiplist, LSM等

至於其他的輔助技術包括:docker, electron, android, ios等等

有興趣的同學可以到這來看看:http://qkldx.net


我是一個做存儲測試的,做了差不多有塊3年了吧,到目前為止除了「大話存儲」外很少能發現針對於存儲行業從事者的書、網站和論壇。個人目前也是想看一些書提升一下自己,但是不知道從何入手。有沒有高手可以指點一二。不僅限於分散式,比如傳統的FC SAN也可以


《分散式系統:概念與設計》

《大話存儲》

以上兩本書的目錄即為基礎技能樹。

回答完畢。


其實利用好的話可以節省60%的的費用,我之前就看過這樣的文章,下方有網址
http://click.aliyun.com/m/22122/


嘖嘖嘖,樓上寫的真好

企鵝雲存儲團隊招各種大牛,錢多,事情也多。 深圳沒霧霾,來吧!


推薦閱讀:

如何的才能更好的學習MIT6.824分散式系統課程?
請問哪位大神比較過spring cloud和dubbo,各自的優缺點是什麼?
「分散式」「集群」「雲計算」三者是什麼區別呢?
請問有沒有分散式系統、並行計算的優秀網站,期刊,論壇,課程,以及函數庫?

TAG:分散式系統 |