zookeeper是分布式應用中的一種框架。
zookeeper能幹什麼哪?我總結了一句話,就是:zookeeper是用來保證資料在集群間的事務性一致。
我們細細品一下這句話,可以獲得以下認識:
這是我們獲得的認識。
下面談一談,zk到底是怎麼一回事?
簡單地講,zk是乙個檔案系統,類似於linux的檔案,有根路徑「/」,根目錄下各級子目錄,可以有一級一級的子目錄。在zk中,目錄被稱作「節點」。與linux不同的是,zk的節點是可以存放資料的。也就是說,zk中儲存的資料是存放在節點中的。
既然節點是一級級的。那麼,必然有父節點,有子節點。談這個話題有什麼用?繼續向下看。
在zk中,還有乙個很重要的特性,就是事件的監聽機制。
當我們想在zk中建立節點、刪除節點、修改節點值等時候,都會產生事件,註冊了事件***的類,就可以獲得這些事件。換句話說,只要zk的節點變化了,那麼資料肯定變化,那麼註冊器通過監控節點的變化就可以知道資料的變化。那麼而這正是zk的無比強大之處。
總結一下,zk中資料的通知機制是通過對節點變化的監聽機制實現的。
下面,看一下zk的應用場景吧!
舉例子,公司有很多業務系統,這些業務系統都需要某種單據號,那麼這個單據號肯定在所有系統中都是唯一的,在不指定哪個系統產生該單據號的情況下,可以使用zk做這件事情。zk可以保證原子性,不會因為多個系統的爭搶造成不一致。
對於運維工作而言,集群的管理非常重要,有伺服器down掉那是非常要緊的事情,必須第一時間知道。那麼,伺服器down有可能是斷電,網路中斷等各種原因。伺服器 一旦down掉,它是沒有辦法向外界傳送求救訊號的。怎麼辦?當伺服器啟動時,在zk集群建立乙個連線,如果伺服器down掉,那麼連線就中斷了,那麼zk那麼就知道有伺服器down掉了,這時候zk就可以對外傳送求救訊號了。
在多系統架構中,有些資源是獨佔的,也就是說同一時刻只能有乙個系統在用。如果是虛擬機器內部,可以通過synchronized關鍵字實現,但是系統之間就無能為力了。可以這樣做:當系統占用資源時,去zk建立乙個指定節點;如果其他系統想要占用資源,也要去建立相同的節點,但是發現已經被建立了,那麼就不能再次建立,只能等待。這就實現了獨佔鎖機制了。
zk的特性還有很多,需要我們把這些特性應用到具體的工作中。
有的同學想:為什麼原來沒有這樣的東西啊?因為zk是分布式系統,在單機下是用不上這套東西的。只有到了分布式環境下,才有zk的用武之地!
二、 zookeeper提供了什麼
簡單的說,zookeeper=檔案系統+通知機制。
1、 檔案系統
zookeeper維護乙個類似檔案系統的資料結構:
[attach]6801[/attach]
每個子目錄項如 nameservice 都被稱作為 znode,和檔案系統一樣,我們能夠自由的增加、刪除znode,在乙個znode下增加、刪除子znode,唯一的不同在於znode是可以儲存資料的。
有四種型別的znode:
1、persistent-持久化目錄節點
客戶端與zookeeper斷開連線後,該節點依舊存在
2、 persistent_sequential-持久化順序編號目錄節點
客戶端與zookeeper斷開連線後,該節點依舊存在,只是zookeeper給該節點名稱進行順序編號
3、ephemeral-臨時目錄節點
客戶端與zookeeper斷開連線後,該節點被刪除
4、ephemeral_sequential-臨時順序編號目錄節點
客戶端與zookeeper斷開連線後,該節點被刪除,只是zookeeper給該節點名稱進行順序編號
2、 通知機制
客戶端註冊監聽它關心的目錄節點,當目錄節點發生變化(資料改變、被刪除、子目錄節點增加刪除)時,zookeeper會通知客戶端。
就這麼簡單,下面我們看看能做點什麼呢?
三、 我們能用zookeeper做什麼
1、 命名服務
這個似乎最簡單,在zookeeper的檔案系統裡建立乙個目錄,即有唯一的path。在我們使用tborg無法確定上游程式的部署機器時即可與下游程式約定好path,通過path即能互相探索發現,不見不散了。
2、 配置管理
程式總是需要配置的,如果程式分散部署在多台機器上,要逐個改變配置就變得困難。好吧,現在把這些配置全部放到zookeeper上去,儲存在 zookeeper 的某個目錄節點中,然後所有相關應用程式對這個目錄節點進行監聽,一旦配置資訊發生變化,每個應用程式就會收到 zookeeper 的通知,然後從 zookeeper 獲取新的配置資訊應用到系統中就好。
[attach]6802[/attach]
3、 集群管理
所謂集群管理無在乎兩點:是否有機器退出和加入、選舉master。
對於第一點,所有機器約定在父目錄groupmembers下建立臨時目錄節點,然後監聽父目錄節點的子節點變化訊息。一旦有機器掛掉,該機器與zookeeper的連線斷開,其所建立的臨時目錄節點被刪除,所有其他機器都收到通知:某個兄弟目錄被刪除,於是,所有人都知道:它上船了。新機器加入也是類似,所有機器收到通知:新兄弟目錄加入,highcount又有了。
對於第二點,我們稍微改變一下,所有機器建立臨時順序編號目錄節點,每次選取編號最小的機器作為master就好。
[attach]6803[/attach]
4、 分布式鎖
有了zookeeper的一致性檔案系統,鎖的問題變得容易。鎖服務可以分為兩類,乙個是保持獨佔,另乙個是控制時序。
對於第一類,我們將zookeeper上的乙個znode看作是一把鎖,通過createznode的方式來實現。所有客戶端都去建立 /distribute_lock 節點,最終成功建立的那個客戶端也即擁有了這把鎖。廁所有言:來也衝衝,去也衝衝,用完刪除掉自己建立的distribute_lock 節點就釋放出鎖。
對於第二類, /distribute_lock 已經預先存在,所有客戶端在它下面建立臨時順序編號目錄節點,和選master一樣,編號最小的獲得鎖,用完刪除,依次方便。
5、佇列管理
兩種型別的佇列:
1、 同步佇列,當乙個佇列的成員都聚齊時,這個佇列才可用,否則一直等待所有成員到達。
2、佇列按照 fifo 方式進行入隊和出隊操作。
第一類,在約定目錄下建立臨時目錄節點,監聽節點數目是否是我們要求的數目。
第二類,和分布式鎖服務中的控制時序場景基本原理一致,入列有編號,出列按編號。
終於了解完我們能用zookeeper做什麼了,可是作為乙個程式設計師,我們總是想狂熱了解zookeeper是如何做到這一點的,單點維護乙個檔案系統沒有什麼難度,可是如果是乙個集群維護乙個檔案系統保持資料的一致性就非常困難了。
四、 分布式與資料複製
zookeeper作為乙個集群提供一致的資料服務,自然,它要在所有機器間做資料複製。資料複製的好處:
1、 容錯
乙個節點出錯,不致於讓整個系統停止工作,別的節點可以接管它的工作;
2、提高系統的擴充套件能力
把負載分布到多個節點上,或者增加節點來提高系統的負載能力;
3、提高效能
讓客戶端本地訪問就近的節點,提高使用者訪問速度。
從客戶端讀寫訪問的透明度來看,資料複製集群系統分下面兩種:
1、寫主(writemaster)
對資料的修改提交給指定的節點。讀無此限制,可以讀取任何乙個節點。這種情況下客戶端需要對讀與寫進行區別,俗稱讀寫分離;
2、寫任意(write any)
對資料的修改可提交給任意的節點,跟讀一樣。這種情況下,客戶端對集群節點的角色與變化透明。
對zookeeper來說,它採用的方式是寫任意。通過增加機器,它的讀吞吐能力和響應能力擴充套件性非常好,而寫,隨著機器的增多吞吐能力肯定下降(這也是它建立observer的原因),而響應能力則取決於具體實現方式,是延遲複製保持最終一致性,還是立即複製快速響應。
我們關注的重點還是在如何保證資料在集群所有機器的一致性,這就涉及到paxos演算法。
webpack loader 生成虛擬檔案的方案
此文已由作者張磊授權網易雲社群發布。使用 webpack 的時候,難免需要寫一些 loader,接著就會遇到乙個很糾結的問題。該 loader 會生成乙個檔案,一般這個檔案的生成時機都是在 loader 處理所有的檔案後。一般有兩種處理方案。一種是寫乙個 plugin,監聽對應的事件 一種是生成乙個...
虛擬檔案系統
虛擬檔案系統 virtual file system,簡稱 vfs 是 linux 核心中的乙個軟體層,用於給使用者空間的程式提供檔案系統介面 同時,它也提供了核心中的乙個 抽象功能,允許不同的檔案系統共存。系統中所有的檔案系統不但依賴 vfs 共存,而且也依靠 vfs 協同工作。為了能夠支援各種實...
Linux虛擬檔案系統
這一周主要學了檔案系統的相關知識,通過學習基本上掌握了 linux 檔案系統的結構,檔案型別,以及讀取模式等等,也學會怎麼用命令簡單的建立乙個檔案系統。linux 的檔案系統主要有 ext2 ext3 ext4 在windows 下乙個分割槽會採用的一棵目錄樹來管理,而 linux 則只有一棵目錄樹...