當前位置:
首頁 > 知識 > 帶著問題學習分布式系統

帶著問題學習分布式系統

來自:xybaby

鏈接:www.cnblogs.com/xybaby/p/6930977.html(點擊尾部閱讀閱讀前往)

寫在前面

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

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

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

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

幸好,差不多半年前開始意識到了這個問題,開始看書,看別人的博客,開始思考如何充分利用好有限的時間。自己也實踐了一些想法,比如寫博客,堅持寫博客。也有很多沒做好,比如如何學習掌握一門新技術。關於這一點,其實看了許多文章,也有很多印象深刻,覺得很有道理;也有一些好書,比如《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)分片的粒度,即數據子集的大小,也是數據遷移的基本單位。粒度過粗,不利於數據均衡;粒度過細,管理、遷移成本又會比較大。

數據冗餘

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

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

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

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

(3)不平等的情況下

(3.1)寫節點怎麼將變更的數據同步到其他節點,同步還是非同步;

(3.2)非寫節點能否提供讀數據,如果能夠允許,會不會讀取到過時的數據。

(3.3)主節點是怎麼產生的,當主節點宕機的時候,怎麼選擇出新的主節點。是有統一的複製集管理中心(記錄誰主誰次,各自的狀態),還是複製集自己選舉出一個主節點?

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

其他

分布式系統有自己的術語或者概念。在當前的這個時間點,我對其中的一些有了解,或者使用過;另外一些只是聽說過,不甚了解;當然,還有更多的是不知道的,是需要在後續的學習中去發現、去掌握的。

分片 副本 一致性哈希 冪等 CAP paxos raft NWR lease 兩階段提交協議 三階段提交協議 拜占庭問題

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

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

Distributed systems for fun and profit

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

MIT課程:http://nil.csail.mit.edu/6.824/2016/schedule.html

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

總結:

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

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

版權聲明:

本文編號2459,以後想閱讀這篇文章直接輸入2459即可。

輸入m獲取文章目錄

推薦

Python編程

更多推薦18個技術類微信公眾號

涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序猿 的精彩文章:

DevOps時代,沒想到微軟都在干這些事
ATM機上那些喪心病狂的攝像頭 一定要當心
Eclipse 4.7 Oxygen 正式發布!帶來大量更新
StackOverflow發布2017年最流行資料庫排名:MySQL最受歡迎

TAG:程序猿 |

您可能感興趣

鏈式供彈系統
分散式系統發展史
分散式系統中常見技術解決的問題是什麼?
學習樹——系統解決孩子學習問題的新思維
分散式文件系統設計與實現
響應式微服務架構-分散式系統設計原則
電腦系統沒有安裝好出現故障問題,趕緊學習怎麼解決
基於細胞起源模式的新型癌症分類系統
基於交換中心的分散式系統數據同步技術
分散式存儲系統的一致性是什麼?
蘋果推出iOS 系統 修複印度特殊字元問題
嵌入式系統概述——硬體篇
電腦藍屏問題除了重裝系統,我們還可以這麼解救系統
智能學習系統
步兵分隊戰術虛擬訓練系統
這樣如廁 生殖系統將會出現嚴重問題
系統學習PHP之正則表達式
系統性抗真菌藥物學習筆記
系統工程小夥伴帶你看幾款熱門EOS 分散式應用
中國發布本質安全分散式存儲系統