>[danger]# 什麼是分布式系統
>分布式系統是由一組通過網路進行通訊、為了完成共同的任務而協調工作的計算機節點組成的系統。分布式系統的出現是為了用廉價的、普通的機器完成單個計算機無法完成的計算、儲存任務。其目的是利用更多的機器,處理更多的資料。
!(>首先需要明確的是,只有當單個節點的處理能力無法滿足日益增長的計算、儲存任務的時候,且硬體的提公升(加記憶體、加磁碟、使用更好的cpu)高昂到得不償失的時候,應用程式也不能進一步優化的時候,我們才需要考慮分布式系統。
>分布式系統的幾個特性:**可擴充套件性、高效能、高可用、一致性**。這幾個特性也是分布式系統的衡量指標,正是為了在不同的程度上滿足這些特性(或者說達到這些指標),才會設計出各種各樣的演算法、協議,然後根據業務的需求在這些特性間平衡。
>[danger]# 分布式鎖又是怎麼產生的呢
>現如今大多數網際網路系統都是分布式部署的,分布式部署確實能帶來效能和效率上的提公升,但是當某個資源在多系統之間,具有共享性的時候,為了保證大家訪問這個資源資料是一致的,這個時候我們需要用分布式鎖來讓多客戶端互斥的對共享資源進行訪問。
目前主流的有三種分布式鎖,從實現的複雜度上來看,從上往下難度依次增加:
>[success]* **基於資料庫實現**
>[success]* **基於 redis 實現**
>redis實現比較複雜,流程如下:
1.根據lockkey區進行setnx(set not exist,顧名思義,如果key值為空,則正常設定,返回1,否則不會進行設定並返回0)操作,如果設定成功,表示已經獲得鎖,否則並沒有獲取鎖。
2.如果沒有獲得鎖,去redis上拿到該key對應的值,在該key上我們儲存乙個時間戳(用毫秒表示,t1),為了避免死鎖以及其他客戶端占用該鎖超過一定時間(5秒),使用該客戶端當前時間戳,與儲存的時間戳作比較。
3.如果沒有超過該key的使用時限,返回false,表示其他人正在占用該key,不能強制使用;如果已經超過時限,那我們就可以進行解鎖,使用我們的時間戳來代替該字段的值。
4.但是如果在setnx失敗後,get該值卻無法拿到該字段時,說明操作之前該鎖已經被釋放,這個時候,最好的辦法就是重新執行一遍setnx方法來獲取其值以獲得該鎖。
注意:redis實現分布式鎖服務時,有可能存在master崩潰導致多個節點獲取鎖的問題,詳細情況請參閱**redis實現**
zookeeper不存在這個問題,請參閱zookeeper原理相關文件。
>[success]* **基於 zookeeper 實現**
>1. 客戶端呼叫create()方法建立名為「locknode/guid-lock-」的節點,需要注意的是,這裡節點的建立型別需要設定為ephemeral\_sequential。
>2. 客戶端呼叫getchildren(「locknode」)方法來獲取所有已經建立的子節點。
>3. 客戶端獲取到所有子節點path之後,如果發現自己在步驟1中建立的節點是所有節點中序號最小的,那麼就認為這個客戶端獲得了鎖。
>4. 如果建立的節點不是所有節點中需要最小的,那麼則監視比自己建立節點的序列號小的最大的節點,進入等待。直到下次監視的子節點變更的時候,再進行子節點的獲取,判斷是否獲取鎖。
釋放鎖的過程相對比較簡單,就是刪除自己建立的那個子節點即可。
!(>[warning]## 執行效率
1. zookeeper每次進行鎖操作前都要建立若干節點,完成後要釋放節點,會浪費很多時間;
2. 而redis只是簡單的資料操作,沒有這個問題。
>[warning]## 總結
zookeeper實現簡單,但效率較低;redis實現複雜,但效率較高。
>[warning]## 演算法實現
zookeeper官網及redis官網均給出了分布式鎖的實現,如下:
1. [zookeeper實現](
2. [redis實現](
分布式儲存系統概述
雲計算 大資料,這些熱點詞彙,後台的基礎設施離開不了分布式儲存系統,它的兩個特點,一是規模大,二是成本低。其實分布式系統的設計是根據需求來變化的,那麼我們接下來就看,我們需要儲存哪些資料,以及,分布式儲存系統有哪些分類。1.分布式儲存的資料 大致可以分為三類 結構化資料 這個最容易理解,關聯式資料庫...
分布式儲存系統 Ceph
你了解ceph嗎?ceph是一種分布式儲存系統,它可以將多台伺服器組成乙個超大集群,把這些機器中的磁碟資源整合到一塊兒,形成乙個大的資源池 pb級別 然後按需分配給應用使用。那麼你知道ceph的架構嗎?ceph的底層實現是rados,rados是由c 寫的,但是它向外界暴露了呼叫介面,即librad...
分布式儲存系統概述
分布式儲存系統定義 由大量普通pc伺服器通過internet互聯,對外作為乙個整體提供服務,具有可擴充套件,低成本,高效能,易用的特點。結構化資料 一般儲存在關係型資料庫中,可以用二維關係表結構來表示 半結構化資料 一般是自描述的,如html文件 分布式檔案系統 儲存blob資料 二進位製大物件,如...