分佈式鎖相關知識

什麼是分佈式協調技術

分佈式協調技術主要用來解決分佈式環境當中多個進程之間的同步控制,讓他們有序的去訪問某種臨界資源,防止造成"髒數據"的後果。
在這裏插入圖片描述
在這圖中有三臺機器,每臺機器各跑一個應用程序。然後我們將這三臺機器通過網絡將其連接起來,構成一個系統來爲用戶提供服務,對用戶來說這個系統的架構是透明的,他感覺不到我這個系統是一個什麼樣的架構。那麼我們就可以把這種系統稱作一個分佈式系統。

在這個分佈式系統中如何對進程進行調度,我假設在第一臺機器上掛載了一個資源,然後這三個物理分佈的進程都要競爭這個資源,但我們又不希望他們同時進行訪問,這時候我們就需要一個協調器,來讓他們有序的來訪問這個資源。這個協調器就是我們經常提到的那個鎖,比如說"進程-1"在使用該資源的時候,會先去獲得鎖,"進程1"獲得鎖以後會對該資源保持獨佔,這樣其他進程就無法訪問該資源,"進程1"用完該資源以後就將鎖釋放掉,讓其他進程來獲得鎖,那麼通過這個鎖機制,我們就能保證了分佈式系統中多個進程能夠有序的訪問該臨界資源。那麼我們把這個分佈式環境下的這個鎖叫作分佈式鎖。這個分佈式鎖也就是我們分佈式協調技術實現的核心內容。

什麼是分佈式鎖

爲了防止分佈式系統中的多個進程之間相互干擾,我們需要一種分佈式協調技術來對這些進程進行調度。而這個分佈式協調技術的核心就是來實現這個分佈式鎖

爲什麼要使用分佈式鎖

在這裏插入圖片描述

  • 成員變量 A 存在 JVM1、JVM2、JVM3 三個 JVM 內存中
  • 成員變量 A 同時都會在 JVM 分配一塊內存,三個請求發過來同時對這個變量操作,顯然結果是不對的
  • 不是同時發過來,三個請求分別操作三個不同 JVM 內存區域的數據,變量 A 之間不存在共享,也不具有可見性,處理的結果也是不對的 注:該成員變量 A 是一個有狀態的對象

如果我們業務中確實存在這個場景的話,我們就需要一種方法解決這個問題,這就是分佈式鎖要解決的問題

分佈式鎖應該具備哪些條件

  • 在分佈式系統環境下,一個方法在同一時間只能被一個機器的一個線程執行
  • 高可用的獲取鎖與釋放鎖
  • 高性能的獲取鎖與釋放鎖
  • 具備可重入特性(可理解爲重新進入,由多於一個任務併發使用,而不必擔心數據錯誤)
  • 具備鎖失效機制,防止死鎖
  • 具備非阻塞鎖特性,即沒有獲取到鎖將直接返回獲取鎖失敗

分佈式鎖的實現有哪些

  • Memcached:利用 Memcached 的 add 命令。此命令是原子性操作,只有在 key 不存在的情況下,才能 add 成功,也就意味着線程得到了鎖。
  • Redis:和 Memcached 的方式類似,利用 Redis 的 setnx 命令。此命令同樣是原子性操作,只有在 key 不存在的情況下,才能 set 成功。
  • Zookeeper:利用 Zookeeper 的順序臨時節點,來實現分佈式鎖和等待隊列。Zookeeper 設計的初衷,就是爲了實現分佈式鎖服務的。
  • Chubby:Google 公司實現的粗粒度分佈式鎖服務,底層利用了 Paxos 一致性算法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章