天天看點

轉載 分布式協調技術 分布式鎖

在給大家介紹ZooKeeper之前先來給大家介紹一種技術——分布式協調技術。那麼什麼是分布式協調技術?那麼我來告訴大家,其實分布式協調技術 主要用來解決分布式環境當中多個程序之間的同步控制,讓他們有序的去通路某種臨界資源,防止造成"髒資料"的後果。這時,有人可能會說這個簡單,寫一個調 度算法就輕松解決了。說這句話的人,可能對分布式系統不是很了解,是以才會出現這種誤解。如果這些程序全部是跑在一台機上的話,相對來說确實就好辦了,問 題就在于他是在一個分布式的環境下,這時問題又來了,那什麼是分布式呢?這個一兩句話我也說不清楚,但我給大家畫了一張圖希望能幫助大家了解這方面的内 容,如果覺得不對盡可拍磚,來咱們看一下這張圖,如圖1.1所示。

轉載 分布式協調技術 分布式鎖

給大家分析一下這張圖,在這圖中有三台機器,每台機器各跑一個應用程式。然後我們将這三台機器通過網絡将其連接配接起來,構成一個系統來為使用者提供服務,對使用者來說這個系統的架構是透明的,他感覺不到我這個系統是一個什麼樣的架構。那麼我們就可以把這種系統稱作一個分布式系統。

那我們接下來再分析一下,在這個分布式系統中如何對程序進行排程,我假設在第一台機器上挂載了一個資源,然後這三個實體分布的程序都要競争這個資源,但我們又不希望他們同時進行通路,這時候我們就需要一個協調器,來讓他們有序的來通路這個資源。這個協調器就是我們經常提到的那個鎖,比如說"程序-1"在使用該資源的時候,會先去獲得鎖,"程序1"獲得鎖以後會對該資源保持獨占,這樣其他程序就無法通路該資源,"程序1"用完該資源以後就将鎖釋放掉,讓其他程序來獲得鎖,那麼通過這個鎖機制,我們就能保證了分布式系統中多個程序能夠有序的通路該臨界資源。那麼我們把這個分布式環境下的這個鎖叫作分布式鎖。這個分布式鎖也就是我們分布式協調技術實作的核心内容,那麼如何實作這個分布式呢,那就是我們後面要講的内容。

好我們知道,為了防止分布式系統中的多個程序之間互相幹擾,我們需要一種分布式協調技術來對這些程序進行排程。而這個分布式協調技術的核心就是來實作這個分布式鎖。那麼這個鎖怎麼實作呢?這實作起來确實相對來說比較困難的。

在看了圖1.1所示的分布式環境之後,有人可能會感覺這不是很難。無非是将原來在同一台機器上對程序排程的原語,通過網絡實作在分布式環境中。是的,表面上是可以這麼說。但是問題就在網絡這,在分布式系統中,所有在同一台機器上的假設都不存在:因為網絡是不可靠的。

比如,在同一台機器上,你對一個服務的調用如果成功,那就是成功,如果調用失敗,比如抛出異常那就是調用失敗。但是在分布式環境中,由于網絡的不可 靠,你對一個服務的調用失敗了并不表示一定是失敗的,可能是執行成功了,但是響應傳回的時候失敗了。還有,A和B都去調用C服務,在時間上 A還先調用一些,B後調用,那麼最後的結果是不是一定A的請求就先于B到達呢? 這些在同一台機器上的種種假設,我們都要重新思考,我們還要思考這些問題給我們的設計和編碼帶來了哪些影響。還有,在分布式環境中為了提升可靠性,我們往 往會部署多套服務,但是如何在多套服務中達到一緻性,這在同一台機器上多個程序之間的同步相對來說比較容易辦到,但在分布式環境中确實一個大難題。

是以分布式協調遠比在同一台機器上對多個程序的排程要難得多,而且如果為每一個分布式應用都開發一個獨立的協調程式。一方面,協調程式的反複編寫浪 費,且難以形成通用、伸縮性好的協調器。另一方面,協調程式開銷比較大,會影響系統原有的性能。是以,急需一種高可靠、高可用的通用協調機制來用以協調分 布式應用。

目前,在分布式協調技術方面做得比較好的就是Google的Chubby還有Apache的ZooKeeper他們都是分布式鎖的實作者。有人會問 既然有了Chubby為什麼還要弄一個ZooKeeper,難道Chubby做得不夠好嗎?不是這樣的,主要是Chbby是非開源的,Google自家 用。後來雅虎模仿Chubby開發出了ZooKeeper,也實作了類似的分布式鎖的功能,并且将ZooKeeper作為一種開源的程式捐獻給了 Apache,那麼這樣就可以使用ZooKeeper所提供鎖服務。而且在分布式領域久經考驗,它的可靠性,可用性都是經過理論和實踐的驗證的。是以我們 在建構一些分布式系統的時候,就可以以這類系統為起點來建構我們的系統,這将節省不少成本,而且bug也 将更少。