一、前言
作為一名Java程式設計師,Zookeeper底層的一些原理是我們不必學會就可以搬磚工作的一種技能點,但是小奇為什麼還要講一下呢?難道就是為了浪費大家1分鐘的寶貴時間,一個人1分鐘,50萬人就是1年,5000萬人就是100年,賺了,小奇以一己之力成功搞掛一個人(血賺)。
當然不是,並且小奇的文章也沒有那麼多人看,最多也就浪費個腎吧。
學習Zookeeper底層原理是因為面試官要問啊!,所以我們就要學,什麼?不實用的你不學?那鄰居小奇可要使勁學啦,到時候面試官只要小奇不要你。
至於你問為什麼面試官要問Zookeeper底層原理呢,這個。。。我把這次機會留給你,下次你面試的時候面試官問:“講一下Zookeeper底層原理”。你:“面試官你好,請問為什麼你要問Zookeeper底層原理呢,你給我臺電腦,我五分鐘給你搭建好圖書管理系統他不香嗎,咱們鍵盤上見真章”。這時面試官就會告訴你答案,你就可以把答案打在評論區,讓小奇以及眾多小夥伴一起知道一下到底為什麼要問?
二、面試
在一個晴朗的週日,我來到了一個陌生的園區(別問為什麼是週日,問就是997,不過為了填飽肚子的打工人,只能明知山有虎、偏向虎山行),坐在陌生的會議室,等待HR小姐姐去叫面試官,此時我的心情和各位小夥伴一樣五味雜陳,擔心面試官問的會不會很難?問到我的知識盲區我該怎麼辦?一會自我介紹的時候要不要吹一下我和小奇的關係?
一位英俊瀟灑,眼神犀利的面試官走了進來,看到他那犀利、彷彿能看穿一切的眼神 ,我在想要不然一會就不要20k了,要8k得了,這個面試官一看就不好糊弄啊,但是我想起來我來之前剛看了小奇的趣學程式設計系列,我已經完全學會了小奇的精髓,我頓時就來了底氣,決定一會要30k,不給就學小奇賴著不走(哈哈)
面試官:小奇是吧,帶簡歷了嗎?
我:沒帶,現在彩印兩塊一張,我簡歷五張,每次面試都要花費十塊,我朋友說了還沒工作就先讓你掏錢的工作不要去。
面試官:。。。那你靠什麼來征服我,讓我錄用你
我:氣質?
(此時面試官並沒有叫保安,而是從門後拿出了恭候我多時的棍子,我瞬間慫了)
我只好從我的雙肩包中拿出了我上午從其他公司面試官手中要回的簡歷,上午的情形是這樣的。
上午的面試官:今天的面試就到這吧,回去等通知吧!
我:面試官你好,如果貴公司不打算錄取我的話,能不能把我的紙質簡歷還給我,我下午還有一家面試。
上午的面試官:我說你的簡歷怎麼皺皺巴巴,原來你一直在迴圈利用啊!這個症狀出現多久了?
我:半拉月了。。。
(當我把皺皺巴巴的簡歷交給面試官後,這場面試才得以繼續進行。。。)
三、Zookeeper是什麼
面試官:我看你簡歷上寫的精通Zookeeper?(哼,面試官輕蔑的一笑)
我:本來不想寫精通的,但是同行們抬愛,非逼著寫,但是也無可厚非,雖說沒有到達爐火純青,但是也差不多登峰造極了吧。
面試官:呵呵、那你先說一說Zookeeper是什麼吧
我:ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,主要為了解決分散式架構下資料一致性問題,典型的應用場景有分散式配置中心、分散式註冊中心、分散式鎖、分散式佇列、叢集選舉、分散式屏障、釋出/訂閱等場景。
面試官:嗯,Zookeeper是怎樣的一個資料結構呢?
我:Zookeeper是一個類似於檔案系統的資料結構,最外層我們可以想象成一個大的資料夾,裡面都是一些小的資料夾。
四、Zookeeper有哪些資料結構
面試官:嗯,Zookeeper有幾種常用的資料格式呢?
我:Zookeeper中每一個子目錄項都是一個znode(目錄節點),這些目錄節點和我們普通的目錄一樣可以新建、刪除、修改,我們常用的主要有四種型別的znode。
1、持久化目錄節點:
客戶端與zookeeper斷開連線後,該節點依舊存在,只要不手動刪除該節點,他將永遠存在。
2、持久化順序編號目錄節點:
客戶端與zookeeper斷開連線後,該節點依舊存在,只是zookeeper給該節點名稱進行順序編號。
3、臨時目錄節點:
客戶端與zookeeper斷開連線後,該節點被刪除。
4、臨時順序編號目錄節點:
客戶端與zookeeper斷開連線後,該節點被刪除,只是zookeeper給該節點名稱進行順序編號。
五、Zookeeper有哪些核心功能
面試官:嗯,Zookeeper有哪些核心的功能呢?
我:zookeeper有監聽通知機制,如果對某個節點進行監聽,當這個節點被刪除,或者被修改時,監聽方會感知到修改訊息。
面試官:嗯,既然zookeeper有監聽機制,那麼可以監聽到幾種型別的變化呢?
我:可以監聽到七種型別變化:
1、None:連線建立事件
2、NodeCreated:節點建立
3、NodeDeleted:節點刪除
4、NodeDataChanged:節點資料變化
5、NodeChildrenChanged:子節點列表變化
6、DataWatchRemoved:節點監聽被移除
7、ChildWatchRemoved:子節點監聽被移除
面試官:我們在開發中使用Synchronized就可以保證執行緒安全了,為什麼還需要使用zookeeper來實現分散式鎖呢?
我:如果我們是單機情況下也就是隻有一個程序的情況下使用Synchronized是可以保證執行緒安全的。但是分散式情況下是多個不同的程序,而不是一個程序裡面不同的執行緒,所以Synchronized是無法保證多個程序安全的。
面試官:zookeeper節點有哪些重要資訊呢,怎麼進行檢視?
我:zookeeper節點可以透過stat命令來檢視主要資訊,其中資訊有:
1、cZxid:建立znode的事務id(Zxid的值)。
2、mZxid:最後修改znode的事務id。
3、pZxid:最後新增或刪除子節點的事務id(子節點列表發生變化才會發生改變)。
4、ctime:znode建立時間。
5、mtime:znode最近修改時間。
6、dataVersion:znode的當前資料版本。
7、cversion:znode的子節點結果集版本(一個節點的子節點增加、刪除都會影響這個版本)。
8、aclVersion:表示對此znode的acl版本。
9、ephemeralOwner:znode是臨時znode時,表示znode所有者的sessionid,如果znode不是臨時節點,則該欄位設定為零。
10、dataLength:znode資料欄位的長度。
面試官:zookeeper建立節點,和監聽節點有哪些命令?
我:
1、建立持久節點:create /節點名稱
2、建立持久順序節點:create -s /節點名稱
3、建立臨時節點:create -e /節點名稱
4、建立臨時順序節點:create -e -s /節點名稱
5、監聽節點:get -w /節點名稱
六、Zookeeper有哪些許可權控制
面試官:zookeeper有哪些許可權控制呢?
我:應該是按照大小個吧,誰個高誰說了算。
面試官:你特麼找打是吧,資料那特麼有大小個。。。
我:zookeeper有ACL( Access Control List )許可權控制,可以控制節點的讀寫操作,保證資料的安全性,不然的話誰都可以建立和刪除節點,那不就亂了套了。
面試官:ACL許可權設定有幾部分組成呢?
我:有三部分組成,分別是許可權模式、授權物件、許可權資訊。
面試官:能具體說一說這三部分都代表什麼嗎?
我:許可權模式: 就是zookeeper伺服器進行許可權驗證的方式,比如手機解鎖是用指紋還是用密碼呢,如果用密碼,知道密碼的都可以解鎖你的手機,如果用指紋,只有你自己的手指頭可以解鎖。所以許可權模式大體分為兩種型別:
1、範圍驗證: 範圍就是zookeeper可以針對一個ip或者一段ip地址授予許可權,相當於指紋解鎖,我給我一個手指頭,或者所有的腳指頭都授予許可權。
2、口令驗證: 可以理解為使用者名稱密碼的方式,這種就相當於密碼解鎖了,知道了使用者名稱密碼後所有的人都相當於授予了許可權。
授權物件: 授權物件就是把許可權授予給誰,如果是範圍驗證方式,那麼授權物件就是ip地址,如果是口令驗證,授權物件就是使用者名稱。
授權資訊: 授權資訊就是指我們具體的權力是什麼,比如我們解鎖手機後可以打遊戲還是可以聽歌,還是可以用手機砸核桃呢。
zookeeper中定義好的許可權有5種:
1、資料節點(c:create)建立許可權,授予許可權的物件可以在資料節點下建立子節點。
2、資料節點(w:wirte)更新許可權,授予許可權的物件可以更新該資料節點。
3、資料節點(r:read)讀取許可權,授予許可權的物件可以讀取該節點的內容以及子節點的列表資訊。
4、資料節點(d:delete)刪除許可權,授予許可權的物件可以刪除該資料節點的子節點。
5、資料節點(a:admin)管理者許可權,授予許可權的物件可以對該資料節點體進行ACL許可權設定。
面試官:我們怎麼檢視和設定某個節點的ACL許可權資訊呢
我:可以透過getAcl來獲取某個節點的許可權資訊,透過setAcl來設定某個節點的許可權資訊。
七、Zookeeper資料持久化
面試官:zookeeper的資料是儲存在記憶體中的嗎,怎麼進行持久化操作呢?
我:zookeeper和redis很像,資料都是在記憶體中的,持久化也是兩種方式,一種是記錄事務日誌,一種是快照方式。
記錄事務日誌磁碟會進行IO操作,事務日誌的不斷增多會觸發磁碟為檔案開闢新的磁碟塊,所以為了提升磁碟的效率,可以在建立檔案的時候就向作業系統申請一塊大一點的磁碟塊,透過引數zookeeper.preAllocSize配置。
事務日誌的存放地址透過zoo.cfg配置檔案中的dataDir來指定。
面試官:小夥子真厲害啊,我這邊沒有什麼要問的了,你還有什麼問題要問(面試官兩眼放光)
我:額。。。面試官這個我的紙質簡歷可以給我嗎,可以不往我的簡歷上寫寫畫畫嗎,我明天的面試還要用。
面試官:還面啥別的公司啊,就來我這吧,條件隨便開
我:那就100k吧(此時面試官又拿起了他準備好的棍子)
面試官:你要是不來就給我推薦一下,讓別人來我這面試一下
我:你先好好學習一下zookeeper吧,今天幸虧只是我來了,如果是小奇的忠實讀者來了,你將會被虐的很慘的。(我將我的部落格地址留給了面試官,轉身留下了帥氣的背影,而面試官落寞無神的呆呆的坐在那裡,彷彿一個億離他而去。。。)
八、總結
這裡關於zookeeper還沒有整理完畢,文章後面持續更新,建議收藏。
文章中涉及到的命令大家一定要像我一樣每個都敲幾遍,只有在敲的過程中才能發現自己對命令是否真正的掌握了。
如果覺得我的文章還不錯的話就點個贊吧,另外可以微信搜尋【小奇JAVA面試】閱讀更多的好文章,獲取我為大家準備的資料。