更新時間:2020-10-30 來源:黑馬程序員 瀏覽量:
命名服務(wù)(Name
Service)也是分布式系統(tǒng)中比較常見的一類場景,是分布式系統(tǒng)最基本的公共服務(wù)之一。在分布式系統(tǒng)中,被命名的實體通常可以是集群中的機(jī)器、提供的服務(wù)地址或遠(yuǎn)程對象等——這些我們都可以統(tǒng)稱它們?yōu)槊?Name),其中較為常見的就是一些分布式服務(wù)框架(如RPC、RMI)中的服務(wù)地址列表,通過使用命名服務(wù),客戶端應(yīng)用能夠根據(jù)指定名字來獲取資源的實體、服務(wù)地址和提供者的信息等。
ZooKeeper
提供的命名服務(wù)功能能夠幫助應(yīng)用系統(tǒng)通過一個資源引用的方式來實現(xiàn)對資源的定位與使用。另外,廣義上命名服務(wù)的資源定位都不是真正意義的實體資源——在分布式環(huán)境中,上層應(yīng)用僅僅需要一個全局唯一的名字,類似于數(shù)據(jù)庫中的唯一主鍵。
所以接下來。我們來看看如何使用ZooKeeper來實現(xiàn)一套分布式全局唯一ID的分配機(jī)制所謂ID,就是一個能夠唯一標(biāo)識某個對象的標(biāo)識符。在我們熟悉的關(guān)系型數(shù)據(jù)庫中,各個表都需要一個主鍵來唯一標(biāo)識每條數(shù)據(jù)庫記錄,這個主鍵就是這樣的唯一ID。在過去的單庫單表型系統(tǒng)中,通常可以使用數(shù)據(jù)庫字段自帶的auto_increment屬性來自動為每條數(shù)據(jù)庫記錄生成一個唯一的ID,數(shù)據(jù)庫會保證生成的這個ID在全局唯一。但是隨著數(shù)據(jù)庫數(shù)據(jù)規(guī)模的不斷增大,分庫分表隨之出現(xiàn),而auto_increment屬性僅能針對單一表中的記錄自動生成ID,因此在這種情況下,就無法再依靠數(shù)據(jù)庫的auto_increment屬性來唯一標(biāo)識一條記錄了。于是,我們必須尋求一種能夠在分布式環(huán)境下生成全局唯一ID的方法。
一說起全局唯一 ID,相信大家都會聯(lián)想到 UUID。沒錯,UUID 是通用唯一識別碼(Universally Unique
Identifier)的簡稱,是一種在分布式系統(tǒng)中廣泛使用的用于唯一標(biāo)識元素的標(biāo)準(zhǔn)
確實,UUID是一個非常不錯的全局唯一ID生成方式,能夠非常簡便地保證分布式環(huán)境中的唯一性。一個標(biāo)準(zhǔn)的 UUID 是一個包含 32 位字符和 4
個短線的字符串,例如“e70f1357-f260-46ff-a32d-53a086c57ade”。UUID的優(yōu)勢自然不必多說,我們重點來看看它的缺陷。
長度過長
UUID 最大的問題就在于生成的字符串過長。顯然,和數(shù)據(jù)庫中的 INT 類型相比,存儲一個UUID需要花費更多的空間。
含義不明
上面我們已經(jīng)看到一個典型的 UUID 是類似于“e70f1357-f260-46ff-a32d-53a086c57ade”的一個字符串。根據(jù)這個字符串,開發(fā)人員從字面上基本看不出任何其表達(dá)的含義,這將會大大影響問題排查和開發(fā)調(diào)試的效率。
所以接下來,我們結(jié)合一個分布式任務(wù)調(diào)度系統(tǒng)來看看如何使用ZooKeepe來實現(xiàn)這類全局唯一ID的生成。
之前我們已經(jīng)提到,通過調(diào)用ZooKeeper節(jié)點創(chuàng)建的API接口可以創(chuàng)建一個順序節(jié)點,并且在API返回值中會返回這個節(jié)點的完整名字。利用這個特性,我們就可以借助ZooKeeper來生成全局唯一的ID了,如下圖:
全局唯一ID生成的ZooKeeper節(jié)點示意圖
說明,對于一個任務(wù)列表的主鍵,使用ZooKeeper生成唯一ID的基本步驟:
所有客戶端都會根據(jù)自己的任務(wù)類型,在指定類型的任務(wù)下面通過調(diào)用create()接口來創(chuàng)建一個順序節(jié)點,例如創(chuàng)建“job-”節(jié)點。
節(jié)點創(chuàng)建完畢后,create()接口會返回一個完整的節(jié)點名,例如“job-0000000003”。
客戶端拿到這個返回值后,拼接上 type 類型,例如“type2-job-0000000003”,這就可以作為一個全局唯一的ID了。
在ZooKeeper中,每一個數(shù)據(jù)節(jié)點都能夠維護(hù)一份子節(jié)點的順序順列,當(dāng)客戶端對其創(chuàng)建一個順序子節(jié)點的時候 ZooKeeper
會自動以后綴的形式在其子節(jié)點上添加一個序號,在這個場景中就是利用了ZooKeeper的這個特性。
猜你喜歡:
ZooKeeper數(shù)據(jù)發(fā)布/訂閱使用教程