讲一点分布式的基础知识,图解!
故事還是得從單機開始,沒有單機哪兒來的分布式?
在IT世界,二進制的數據是我們最寶貴的資產,必須要把它保存在斷電也不怕的硬盤上。
但是只用一塊硬盤很危險,萬一壞了數據就徹底沒了。于是人們就想了個辦法,把兩塊硬盤組織了起來,互為備份。
這種方式有個專門的術語,叫RAID ,就是冗余磁盤陣列的意思。
上圖中兩個磁盤互為備份,是RAID 1 , 數據會被同時寫到兩塊硬盤中,安全性大大提高。
需要提醒的是,雖然這里有兩塊硬盤,但是從用戶角度,只能看到一個邏輯的硬盤,操作系統已經把底層的兩塊硬盤給隱藏了。
RAID 1 的不爽之處是浪費了一個硬盤的容量, 改進方案可以用RAID 5:
RAID5 并沒有像RAID 1那樣對數據做備份, 它引入了一個叫做奇偶校驗的東西(上圖的黃色部分),? 這樣當一個磁盤壞的時候,就可以利用其它磁盤的數據進行恢復。
?
具體的計算如下(略繁瑣,可以跳過)。
奇偶校驗是用異或(xor)來實現的,簡單的說,相同為0,不同為
?
比如, 磁盤1保存 的數值是7(二進制?0111), 磁盤2 保存的是數值是8(二進制1000), 做一個xor操作
0111 xor 1000 ?=> 1111
那磁盤3保存的值就是二進制1111。
現在假設磁盤2壞掉了,換了個新磁盤,那根據磁盤1 中的 0111 和磁盤3中的1111,就可以計算出磁盤2的值是:
0111 xor 1111 => ?1000
于是磁盤2的值就可以恢復了!
但是, 如果在恢復的時候,又有一個盤壞掉了,那就悲催了。
使用RAID 5,寫入時需要做計算,性能受到一定影響。
?
聰明的你肯定可以想到,除了RAID 1, 5, 還有其他方式, 例如RAID 0, 2,3,6,7, 5E 等,八仙過海,各顯神通。
主從備份
但是在互聯網應用中,RAID用的越來越少了,更常用的是跨越機器的備份。
?
這種方式不會把數據分散地寫到各個機器的硬盤中,而是整體地寫到一個機器中,然后整體地復制到其他機器。
由于跨越了網絡,這種備份通常是異步的。
副本多了,還帶來了一個好處,可以把讀操作發到副本機器上去讀,主庫只負責寫操作, 壓力就降低了。
這就是常見的MySQL主從復制,讀寫分離。
可是,由于時間差的關系, 副本的數據可能會落后于主庫, 產生讀寫不一致的問題,需要程序員想辦法來解決。
(注:具體的復制細節,請移步《MySQL:硬盤在24 * 7工作中罷工了,我該怎么辦?》)
分區
備份問題解決了, 如果你的數據越來越多,馬上就會面對另外一個問題:一個機器無論如何也放不下了,怎么辦?
解決辦法就是分區, 把邏輯上是整體的數據,分別存儲到不同的物理機器上去。
(不同的系統稱呼不同,Elasticsearch 把它稱為Shard,即分片, HBase把他稱為Region)
可以這么分:
每個機器保存一段數據,?Redis的Cluster就采用了類似的方式,每個服務器負責一段Hash槽。
?
還可以這么分:
這種方式稱為Round-Robin ,也是Kafka默認的分區策略
Elasticsearch 則采用了另外一種辦法:余數算法
?
余數算法簡單明了, 非常容易確定一個數據保存在哪個機器上, 存取都非常地方便。
但是弱點也非常明顯:如果數據更多了,想增加分區怎么辦?
對不起,增加不了!?因為一旦增加分區,余數就會發生變化,數據就找不到了。
分區+備份
僅僅把數據做了分區還不夠,如果分區所在的節點如果壞了,數據就丟了。
為了可靠性,數據必須得有備份,像這樣:
?
?
每個機器上都有一個分區的主副本,每個主副本都有兩個從副本(保存在不同的機器上),數據安全多了。
這是個非常常見的復制方式,Kafka和Elastic search 都在使用,需要注意的是:復制的最小單位是分區,而不是節點。
比如機器1掛掉了, 分區1的主副本丟掉了, 不用怕, 分區1還有兩個從副本,分別保存在機器2和機器3上, 可以從他們那里去讀數據。
問題是現在有兩個從副本,他們都想當主副本,承擔起主副本的職責,到底誰來當?
這是個非常麻煩的問題,把問題抽象一下:這相當于在一個分布式環境下(通常有著不可靠的網絡),各個節點要達成共識:同意一個節點當老大。
解決這個問題,必須要利用一些共識算法(Raft, Paxos 等), ?這些算法都很復雜,可以自己去實現,但是最好還是利用現成的組件,例如Zookeeper,讓這個穩定可靠的“黑盒子”來幫忙吧。
總結
以上是生活随笔為你收集整理的讲一点分布式的基础知识,图解!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一次服务器CPU占用率高的定位分析
- 下一篇: 从工具到社区,美图秀秀大规模性能优化实践