1. 程式人生 > >帶著問題學習分散式系統

帶著問題學習分散式系統

  很長一段時間,對分散式系統都比較感興趣,也聽說過、瞭解過其中一些相關的知識點,但都比較零碎。一直想系統的學習一下,但是一拖再拖,寫下本文,也是希望能督促自己。

寫在前面

  聽過很多道理,卻依然過不好這一生。

  看過很多關於學習的技巧、方法,卻沒應用到自己的學習中。

  隨著年紀變大,記憶力越來越差,整塊的時間也越來越少,於是,越來越希望能夠更高效的學習。學習是一種習慣也是一種能力,這種能力在上學期間養成是最好的,畢竟那個時候絕大部分時間都在學習。但很遺憾,我沒有養成適合自己的、好的學習習慣。工作之後,除了在日常工作中用到的知識技術,很難通過自學掌握新的知識(偏向於專業知識,即技術)。而網際網路行業的分支、知識點又是如此之多,於是會出現這樣的情況,遇到一個新的知識,覺得很厲害很感興趣,看兩天,但很快就忘記了。另外,對於一些比較龐雜的技術,又無從下手,也很難堅持下去。

  根本的問題在於學習不繫統,沒有把一個個的知識點連線起來,本來這些新的知識就很少在工作中實踐,如果又是一個個的資訊孤島,很快就會被遺忘。另一個問題,沒有良好的規劃,今天看看這裡,明天看看哪裡,糾結於細枝末節,忘了從整體上把握。

  幸好,差不多半年前開始意識到了這個問題,開始看書,看別人的部落格,開始思考如何充分利用好有限的時間。自己也實踐了一些想法,比如寫部落格,堅持寫部落格。也有很多沒做好,比如如何學習掌握一門新技術。關於這一點,其實看了許多文章,也有很多印象深刻,覺得很有道理;也有一些好書,比如《study more,learn less》。紙上得來終覺淺,絕知此事要躬行,別人的辦法再好也需要親身實踐才知道是否對自己適用。

  需要學習的技術很多,要自學新知識也不是一件容易的事,選擇一個自己比較感興趣的會是一個比較好的開端,於是,打算學一學分散式系統。

  帶著問題,有目的的學習,先了解整體架構,在深入感興趣的細節,這是我的計劃。

  首先得有問題,如果每日重複相同的工作,也不主動去學習,很難發現新的問題。不怕自己無知,就怕不知道自己無知,只有不斷的學習,才會發現更多未知的知識領域!

帶著問題出發

  分散式要解決什麼問題呢?解決持久化資料太大,單個節點的硬碟無法儲存的問題;解決運算量太大,單個節點的記憶體、CPU無法處理的問題。解決這些問題,有兩種思路:scale up,scale out。前者就是提升單個節點的能力,更大的磁碟,更快的CPU,定製的軟硬體,然而這意味著更高的價格,而且再怎麼scaleup 也是有上限的。後者就是把儲存、計算任務分擔到普通的機器上,通過動態增加節點來應對資料量的增長,但缺點是多個節點的管理、任務的排程比較麻煩,這也是分散式系統研究和解決的問題。只有當資料量達到單機無法儲存、處理的情況下才考慮分散式,不然都是自找麻煩。

  狀態的維護比計算要難很多,所謂狀態就是需要持久化的資料。因此主要考慮分散式儲存,況且即使是分散式計算,為了節省頻寬需要儘量保證data locality,也是需要分散式儲存。   現在有一堆資料,可能是結構化或者半結構化,需要將資料分片(segment、fragment、shard),形成一個個的資料子集,儲存到一組物理節點上,物理節點之間通過網路通訊。那麼需要考慮兩個問題:   第一:資料如何劃分;    第二:資料的可靠性、可用性問題

資料分片

  資料分片是指將資料子集儘可能均衡的劃分到各個物理節點上。那麼會有哪些挑戰呢?

  (1)如果某個物理節點宕機,如何將該物理節點負責的資料儘快的轉移到其他物理節點;

  (2)如果新增了物理節點,怎麼從其他節點遷移資料到新節點;

  (3)對於可修改的資料(即不是隻能追加的資料),比如資料庫資料,如果某節點資料量變大,怎麼將部分資料遷移到其他負載較小的節點,及達到動態均衡的效果。

  (4)元資料的管理問題:當資料分佈在各個節點,那麼當用戶使用的時候需要知道具體的資料在哪一個節點上。因此,系統需要維護資料的元資料:即每一個數據所在的位置、狀態等資訊。當用戶需要具體的資料時,先查詢元資料,然後再去具體的節點上查詢。當資料在節點之間遷移的時候,也需要更新元資料。元資料的管理節點這裡稱之為meta server。元資料的管理也帶來了新的挑戰:     (4.1)如何抽取資料的特徵(特徵是分片的依據,也是使用者查詢資料時的key),或者支援使用者自定義資料特徵;

    (4.2)如何保證meta server的高效能和高可用,是單點還是複製集

  (5)分片的粒度,即資料子集的大小,也是資料遷移的基本單位。粒度過粗,不利於資料均衡;粒度過細,管理、遷移成本又會比較大。

  自問自答(2017 06 28):

資料冗餘

  前面提到,分散式系統中的節點都是普通的節點,因此有一定的概率會出現物理故障,比如斷電、網路不可用,這些故障導致資料的暫時不可用;另外一些故障更嚴重,會導致資料的丟失,比如磁碟損壞。即使單個節點的故障是小概率,當叢集中的節點數目很多是,故障就成為了一個大概率事件。因此,保證資料的高可用和可靠性是分散式系統必須解決的問題。

  為了避免單點故障,可行的辦法就是資料冗餘(複製集),即將同一份資料放在不同的物理節點,甚至是不同的資料中心。如果資料是一次寫,多次讀那很好辦,隨便從哪個副本讀取都行。但對於很多分散式儲存系統,比如資料庫,資料是持續變化的,有讀有寫。那麼複製集會帶來什麼樣的挑戰呢,需要如何權衡呢,假設有三個副本:

  (1)三個副本的地位,大家都是平等的還是有主(primary、master)有次(secondary、slave),如果是平等的,那麼每個節點都可以接收寫操作;如果不平等,可以一個節點負責所有的寫操作,所有節點都提供讀操作,

  (2)在平等的情況下,怎麼保證寫入操作不衝突,保證各個節點的資料是一致的,怎麼保證能讀取到最新的資料

  (3)不平等的情況下     (3.1)寫節點怎麼將變更的資料同步到其他節點,同步還是非同步;     (3.2)非寫節點能否提供讀資料,如果能夠允許,會不會讀取到過時的資料。     (3.3)主節點是怎麼產生的,當主節點宕機的時候,怎麼選擇出新的主節點。是有統一的複製集管理中心(記錄誰主誰次,各自的狀態),還是複製集自己選舉出一個主節點?

  (4)不管複製集內部的節點是平等的,還是有集中式節點的,只要有多個數據副本,就需要考慮資料的一致性可用性問題。按照CAP理論,只能同時滿足一致性 可用性 分割槽容錯性之間的二者,不同的分散式系統需要權衡。

   自問自答(2017 08 30)

其他

  分散式系統有自己的術語或者概念。在當前的這個時間點,我對其中的一些有了解,或者使用過;另外一些只是聽說過,不甚瞭解;當然,還有更多的是不知道的,是需要在後續的學習中去發現、去掌握的。
  分片 副本 一致性雜湊 冪等 CAP paxos raft NWR lease 兩階段提交協議 三階段提交協議 拜占庭問題

  目前收集到的學習資料如下:

  劉傑的《分散式系統原理介紹》

  CMU課程:http://www.cs.cmu.edu/~dga/15-440/S14/syllabus.html

  前面兩個是基礎整體介紹,最後一個是MIT的課程,網上評價很高,也有很多人在學習。

總結:

  對於一門新技術,不要上來就開幹,思考新技術解決了什麼問題、已有的技術能否替代、適用場景與缺陷。對於自己(程式設計師),想想為什麼要學、是深度還是廣度知識、該技術在自己的技能樹中的位置。

  對於學習,需要長期目標與短期目標相結合。長期目標很重要,但需要分解成一個個小目標,否則很容易在停頓、重拾之間打轉,也很容易分心到其他雜事,也就堅持不下去了。

相關推薦

問題學習分散式系統之資料分片

  在前文中,提出了分散式系統(尤其是分散式儲存系統)需要解決的兩個最主要的問題,即資料分片和資料冗餘,下面這個圖片(來源)形象生動的解釋了其概念和區別:      其中資料即A、B屬於資料分片,原始資料被拆分成兩個正交子集分佈在兩個節點上。而資料集C屬於資料冗餘,同一份完整的資料在兩個節點都有儲存。當然

問題學習分散式系統之中心化複製集

  假若我說有三個節點(計算機)要維護同一分資料,如果你對分散式系統並不瞭解,那麼你可能會有什麼問題呢,我想可能有兩個最基本的問題:   為什麼同一份資料要儲存多分?   這些節點資料要一致吧,否則同時從多個節點讀的時候資料不一樣?   第一個問題,為什麼要同一分資料要儲存多分,是因為分散式系統

問題學習分散式系統

  很長一段時間,對分散式系統都比較感興趣,也聽說過、瞭解過其中一些相關的知識點,但都比較零碎。一直想系統的學習一下,但是一拖再拖,寫下本文,也是希望能督促自己。 寫在前面   聽過很多道理,卻依然過不好這一生。   看過很多關於學習的技巧、方法,卻沒應用到自己的學習中。   隨著年紀變大,記

學習分散式系統,這些術語你瞭解嗎?

對於剛進入區塊鏈行業的小白同學來說,一切都顯得比較陌生,很多概念性質的東西理解起來也比較吃力,本文和大家分享的是區塊鏈分散式系統中常見的一些專業分類,一起來看看吧,希望對大家有所幫助。 1. Failure models 失效模型 機器故障:當機器(節點)出現故障時,共識協議就用於解決機器

什麼是分散式系統,如何學習分散式系統

目錄 正文   雖然本人在前面也寫過好幾篇分散式系統相關的文章,主要包括CAP理論、分散式儲存與分散式事務,但對於分散式系統,並沒有一個跟清晰的概念。分散式系統涉及到很多的技術、理論與協議,很多人也說,分散式系統是“入門容易,深入難”,我之前的學習也只算是管中窺豹

問題學習分布式系統

所在 數據中心 sch 可能 原理 性能 結構化 使用 key   很長一段時間,對分布式系統都比較感興趣,也聽說過、了解過其中一些相關的知識點,但都比較零碎。一直想系統的學習一下,但是一拖再拖,寫下本文,也是希望能督促自己。 寫在前面   聽過很多道理,卻依然過

問題學習分布式系統之數據分片

訪問方式 papers 個人 明顯 節點數 ant 此舉 身份驗證 hash函數   在前文中,提出了分布式系統(尤其是分布式存儲系統)需要解決的兩個最主要的問題,即數據分片和數據冗余,下面這個圖片(來源)形象生動的解釋了其概念和區別:      其中數據即A、B屬於數

問題學習openstack

對數 check def UC stopped ilo ted lis publish 1.為什麽要引入nova conductor, nova conductor 為什麽接管了nova api RPC調用nova scheduler 的任務? nova-conducto

java分散式系統部署學習(九)ansible-playbook進階

一、併發執行 ansible預設只會建立5個程序,所以一次任務只能同時控制5臺機器執行.那如果你有大量的機器需要控制,或者你希望減少程序數,那你可以採取非同步執行.ansible的模組可以把task放進後臺,然後輪詢它.這使得在一定程序數下能讓大量需要的機器同時運作起來. 使用asy

分散式學習筆記三:分散式系統session一致性的問題

session的概念 什麼是session? 伺服器為每個使用者建立一個會話,儲存使用者的相關資訊,以便多次請求能夠定位到同一個上下文。這樣,當用戶在應用程式的 Web 頁之間跳轉時,儲存在 Session 物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當用戶請求來自應用程式的

關於分散式系統的一些學習心得-筆記

分散式系統(distributed system)是建立在網路之上的軟體系統。處理各項協助的任務,然後整合出結果 分散式系統是一個複雜且寬泛的研究領域,學習分散式系統通常要從兩個方面來入手 1. 近些年分散式系統領域都在做些什麼。2. 為什麼現在投入分散式系統的學習和研究是值得的。

分散式學習最佳實踐:從分散式系統的特徵開始(附思維導圖)

什麼是分散式系統 回到頂部   分散式系統是由一組通過網路進行通訊、為了完成共同的任務而協調工作的計算機節點組成的系統。分散式系統的出現是為了用廉價的、普通的機器完成單個計算機無法完成的計算、儲存任務。其目的是利用更多的機器,處理更多的資料。   首先需要明確的是,只

分散式系統學習筆記

分散式系統 一、什麼是分散式系統? 二、為什麼要進行分散式系統的拆分? 1)要是不拆分,一個大系統幾十萬行程式碼,20個人維護一份程式碼,簡直是悲劇啊。程式碼經常改著改著就衝突了,各種程式碼衝突和合並要處理,非常耗費時間;經常我改動了我的程式碼,你呼叫了我,導致你的程式碼也

Zedboard 學習記錄(二):移植不桌面的linux系統

準備工作: 1)啟動檔案: 2)4GB的SD卡 3)ZedBoard 開發板 版本:REV-D 4)裝有Ubuntu系統的電腦一臺(用虛擬機器也可以) 移植工作: 1、將SD卡插到Ubunt電腦中。 2、在Linux中進行格式化,並分割槽。       1

《徹底解決分散式系統一致性問題》學習筆記

《徹底解決分散式系統一致性問題》直播者:李豔鵬 筆記作者:JKXQJ 一致性問題產生的背景 JEE架構:WEB容器—組合業務邏輯—>EJB容器—資料存ORM—>資料庫 SSH架構:Struts MVC—組合業務邏輯—>Spri

[分散式系統學習]閱讀筆記 Distributed systems for fun and profit 之一 基本概念

因為工作的原因,最近打算看一些分散式學習的資料。其中這個http://book.mixu.net/distsys/就是一篇非常適合分散式入門的介紹。 這個短小的材料有下面5個小的章節,圖文並茂,也沒有太難的概念,非常推薦。 基礎知識。主要是一些基本概念,例如可擴充套件性(scalability),可用

[分散式系統學習] 6.824 LEC2 RPC和執行緒 筆記

6.824的課程通常是在課前讓你做一些準備。一般來說是先讀一篇論文,然後請你提一個問題,再請你回答一個問題。然後上課,然後佈置Lab。 第二課的準備-Crawler 第二課的準備不是論文,是讓你實現Go Tour裡面的crawler。Go Tour裡面原有的實現是序列的,並且可能爬到相同的url。要求讓你

[分散式系統學習] 6.824 LEC3 GFS 筆記

Google File System 第三課的準備是閱讀論文GFS。該論文是分散式系統中經典論文之一。 讀完做一點小總結。 GFS的feature 1. 非POXIS介面API,支援對檔案和資料夾的建立,讀,寫,增加,重新命名和建立快照操作。 2. 有多個商用Linux機器做節點,稱為chunk s

[分散式系統學習] 6.824 LEC1 MapReduce 筆記

什麼是Map-Reduce呢? Map指的是一個形如下面定義的函式。 def Map(k, v): //return [(k1, v1), (k2, v2), (k3, v3), ...] pass 它接受一個key和一個value,返回一組所謂的中間值。注意,返回的不是一個dict,

[分散式系統學習]閱讀筆記 Distributed systems for fun and profit 之四 Replication 拷貝

 閱讀http://book.mixu.net/distsys/replication.html的筆記,是本系列的第四章 拷貝其實是一組通訊問題,為一些子問題,例如選舉,失靈檢測,一致性和原子廣播提供了上下文。 同步拷貝 可以看到三個不同階段,首先client傳送請求。然後同步拷貝,同步意味著這