哈嘍嫉嘀!大家好炼邀,我是小奇,一位不靠譜的程序員
小奇打算以輕松幽默的對話方式來分享一些技術(shù)剪侮,如果你覺得通過小奇的文章學到了東西拭宁,那就給小奇一個贊吧
文章持續(xù)更新
作為一名Java程序員瓣俯,Zookeeper底層的一些原理是我們不必學會就可以搬磚工作的一種技能點杰标,但是小奇為什么還要講一下呢?難道就是為了浪費大家1分鐘的寶貴時間彩匕,一個人1分鐘在旱,50萬人就是1年,5000萬人就是100年推掸,賺了,小奇以一己之力成功搞掛一個人(血賺)驻仅。
當然不是谅畅,并且小奇的文章也沒有那么多人看,最多也就浪費個腎吧噪服。
學習Zookeeper底層原理是因為面試官要問啊毡泻!,所以我們就要學粘优,什么仇味?不實用的你不學?那鄰居小奇可要使勁學啦雹顺,到時候面試官只要小奇不要你丹墨。
至于你問為什么面試官要問Zookeeper底層原理呢,這個嬉愧。贩挣。。我把這次機會留給你,下次你面試的時候面試官問:“講一下Zookeeper底層原理”王财。你:“面試官你好卵迂,請問為什么你要問Zookeeper底層原理呢,你給我臺電腦绒净,我五分鐘給你搭建好圖書管理系統(tǒng)他不香嗎见咒,咱們鍵盤上見真章”。這時面試官就會告訴你答案挂疆,你就可以把答案打在評論區(qū)改览,讓小奇以及眾多小伙伴一起知道一下到底為什么要問?
在一個晴朗的周日恃疯,我來到了一個陌生的園區(qū)(別問為什么是周日,問就是997墨闲,不過為了填飽肚子的打工人今妄,只能明知山有虎、偏向虎山行)鸳碧,坐在陌生的會議室盾鳞,等待HR小姐姐去叫面試官,此時我的心情和各位小伙伴一樣五味雜陳瞻离,擔心面試官問的會不會很難腾仅?問到我的知識盲區(qū)我該怎么辦?一會自我介紹的時候要不要吹一下我和小奇的關(guān)系套利?
一位英俊瀟灑推励,眼神犀利的面試官走了進來,看到他那犀利肉迫、仿佛能看穿一切的眼神 验辞,我在想要不然一會就不要20k了,要8k得了喊衫,這個面試官一看就不好糊弄啊跌造,但是我想起來我來之前剛看了小奇的趣學編程系列,我已經(jīng)完全學會了小奇的精髓族购,我頓時就來了底氣壳贪,決定一會要30k,不給就學小奇賴著不走(哈哈)
面試官:小奇是吧寝杖,帶簡歷了嗎违施?
我:沒帶,現(xiàn)在彩印兩塊一張朝墩,我簡歷五張醉拓,每次面試都要花費十塊伟姐,我朋友說了還沒工作就先讓你掏錢的工作不要去。
面試官:亿卤。愤兵。。那你靠什么來征服我排吴,讓我錄用你
我:氣質(zhì)秆乳?
(此時面試官并沒有叫保安,而是從門后拿出了恭候我多時的棍子钻哩,我瞬間慫了)
我只好從我的雙肩包中拿出了我上午從其他公司面試官手中要回的簡歷屹堰,上午的情形是這樣的。
上午的面試官:今天的面試就到這吧街氢,回去等通知吧扯键!
我:面試官你好,如果貴公司不打算錄取我的話珊肃,能不能把我的紙質(zhì)簡歷還給我荣刑,我下午還有一家面試。
上午的面試官:我說你的簡歷怎么皺皺巴巴伦乔,原來你一直在循環(huán)利用袄骺鳌!這個癥狀出現(xiàn)多久了烈和?
我:半拉月了爱只。。招刹。
(當我把皺皺巴巴的簡歷交給面試官后恬试,這場面試才得以繼續(xù)進行。疯暑。忘渔。)
面試官:我看你簡歷上寫的精通Zookeeper缰儿?(哼,面試官輕蔑的一笑)
我:本來不想寫精通的散址,但是同行們抬愛乖阵,非逼著寫,但是也無可厚非预麸,雖說沒有到達爐火純青瞪浸,但是也差不多登峰造極了吧。
面試官:呵呵吏祸、那你先說一說Zookeeper是什么吧
我:ZooKeeper是一個分布式的对蒲,開放源碼的分布式應(yīng)用程序協(xié)調(diào)服務(wù),主要為了解決分布式架構(gòu)下數(shù)據(jù)一致性問題,典型的應(yīng)用場景有分布式配置中心蹈矮、分布式注冊中心砰逻、分布式鎖、分布式隊列泛鸟、集群選舉蝠咆、分布式屏障、發(fā)布/訂閱等場景北滥。
面試官:嗯刚操,Zookeeper是怎樣的一個數(shù)據(jù)結(jié)構(gòu)呢?
我:Zookeeper是一個類似于文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)再芋,最外層我們可以想象成一個大的文件夾菊霜,里面都是一些小的文件夾。
四济赎、Zookeeper有哪些數(shù)據(jù)結(jié)構(gòu)
面試官:嗯鉴逞,Zookeeper有幾種常用的數(shù)據(jù)格式呢?
我:Zookeeper中每一個子目錄項都是一個znode(目錄節(jié)點)联喘,這些目錄節(jié)點和我們普通的目錄一樣可以新建华蜒、刪除、修改豁遭,我們常用的主要有四種類型的znode叭喜。
1、持久化目錄節(jié)點:
客戶端與zookeeper斷開連接后蓖谢,該節(jié)點依舊存在捂蕴,只要不手動刪除該節(jié)點,他將永遠存在闪幽。
2啥辨、持久化順序編號目錄節(jié)點:
客戶端與zookeeper斷開連接后,該節(jié)點依舊存在盯腌,只是zookeeper給該節(jié)點名稱進行順序編號溉知。
3、臨時目錄節(jié)點:
客戶端與zookeeper斷開連接后腕够,該節(jié)點被刪除级乍。
4、臨時順序編號目錄節(jié)點:
客戶端與zookeeper斷開連接后帚湘,該節(jié)點被刪除玫荣,只是zookeeper給該節(jié)點名稱進行順序編號。
面試官:嗯捅厂,Zookeeper有哪些核心的功能呢贯卦?
我:zookeeper有監(jiān)聽通知機制,如果對某個節(jié)點進行監(jiān)聽焙贷,當這個節(jié)點被刪除撵割,或者被修改時,監(jiān)聽方會感知到修改消息盈厘。
面試官:嗯睁枕,既然zookeeper有監(jiān)聽機制,那么可以監(jiān)聽到幾種類型的變化呢沸手?
我:可以監(jiān)聽到七種類型變化:
1外遇、None:連接建立事件
2、NodeCreated:節(jié)點創(chuàng)建
3契吉、NodeDeleted:節(jié)點刪除
4跳仿、NodeDataChanged:節(jié)點數(shù)據(jù)變化
5、NodeChildrenChanged:子節(jié)點列表變化
6捐晶、DataWatchRemoved:節(jié)點監(jiān)聽被移除
7菲语、ChildWatchRemoved:子節(jié)點監(jiān)聽被移除
面試官:我們在開發(fā)中使用Synchronized就可以保證線程安全了,為什么還需要使用zookeeper來實現(xiàn)分布式鎖呢惑灵?
我:如果我們是單機情況下也就是只有一個進程的情況下使用Synchronized是可以保證線程安全的山上。但是分布式情況下是多個不同的進程,而不是一個進程里面不同的線程英支,所以Synchronized是無法保證多個進程安全的佩憾。
面試官:zookeeper節(jié)點有哪些重要信息呢,怎么進行查看干花?
我:zookeeper節(jié)點可以通過stat命令來查看主要信息妄帘,其中信息有:
1、cZxid:創(chuàng)建znode的事務(wù)id(Zxid的值)池凄。
2抡驼、mZxid:最后修改znode的事務(wù)id。
3肿仑、pZxid:最后添加或刪除子節(jié)點的事務(wù)id(子節(jié)點列表發(fā)生變化才會發(fā)生改變)致盟。
4、ctime:znode創(chuàng)建時間尤慰。
5勾邦、mtime:znode最近修改時間。
6割择、dataVersion:znode的當前數(shù)據(jù)版本。
7萎河、cversion:znode的子節(jié)點結(jié)果集版本(一個節(jié)點的子節(jié)點增加荔泳、刪除都會影響這個版本)蕉饼。
8、aclVersion:表示對此znode的acl版本玛歌。
9昧港、ephemeralOwner:znode是臨時znode時,表示znode所有者的sessionid支子,如果znode不是臨時節(jié)點创肥,則該字段設(shè)置為零。
10值朋、dataLength:znode數(shù)據(jù)字段的長度叹侄。
面試官:zookeeper創(chuàng)建節(jié)點,和監(jiān)聽節(jié)點有哪些命令昨登?
我:
1趾代、創(chuàng)建持久節(jié)點:create /節(jié)點名稱
2、創(chuàng)建持久順序節(jié)點:create -s /節(jié)點名稱
3丰辣、創(chuàng)建臨時節(jié)點:create -e /節(jié)點名稱
4撒强、創(chuàng)建臨時順序節(jié)點:create -e -s /節(jié)點名稱
5、監(jiān)聽節(jié)點:get -w /節(jié)點名稱
面試官:zookeeper有哪些權(quán)限控制呢飘哨?
我:應(yīng)該是按照大小個吧,誰個高誰說了算琐凭。
面試官:你特么找打是吧芽隆,數(shù)據(jù)那特么有大小個。淘正。摆马。
我:zookeeper有ACL( Access Control List )權(quán)限控制,可以控制節(jié)點的讀寫操作鸿吆,保證數(shù)據(jù)的安全性囤采,不然的話誰都可以創(chuàng)建和刪除節(jié)點,那不就亂了套了惩淳。
面試官:ACL權(quán)限設(shè)置有幾部分組成呢蕉毯?
我:有三部分組成,分別是權(quán)限模式思犁、授權(quán)對象代虾、權(quán)限信息。
面試官:能具體說一說這三部分都代表什么嗎激蹲?
我:權(quán)限模式:?就是zookeeper服務(wù)器進行權(quán)限驗證的方式棉磨,比如手機解鎖是用指紋還是用密碼呢,如果用密碼学辱,知道密碼的都可以解鎖你的手機乘瓤,如果用指紋环形,只有你自己的手指頭可以解鎖。所以權(quán)限模式大體分為兩種類型:
1衙傀、范圍驗證:?范圍就是zookeeper可以針對一個ip或者一段ip地址授予權(quán)限抬吟,相當于指紋解鎖,我給我一個手指頭统抬,或者所有的腳指頭都授予權(quán)限火本。
2、口令驗證:?可以理解為用戶名密碼的方式聪建,這種就相當于密碼解鎖了钙畔,知道了用戶名密碼后所有的人都相當于授予了權(quán)限。
授權(quán)對象:?授權(quán)對象就是把權(quán)限授予給誰妆偏,如果是范圍驗證方式刃鳄,那么授權(quán)對象就是ip地址,如果是口令驗證钱骂,授權(quán)對象就是用戶名叔锐。
授權(quán)信息:?授權(quán)信息就是指我們具體的權(quán)力是什么,比如我們解鎖手機后可以打游戲還是可以聽歌见秽,還是可以用手機砸核桃呢愉烙。
zookeeper中定義好的權(quán)限有5種:
1、數(shù)據(jù)節(jié)點(c:create)創(chuàng)建權(quán)限解取,授予權(quán)限的對象可以在數(shù)據(jù)節(jié)點下創(chuàng)建子節(jié)點步责。
2、數(shù)據(jù)節(jié)點(w:wirte)更新權(quán)限禀苦,授予權(quán)限的對象可以更新該數(shù)據(jù)節(jié)點蔓肯。
3、數(shù)據(jù)節(jié)點(r:read)讀取權(quán)限振乏,授予權(quán)限的對象可以讀取該節(jié)點的內(nèi)容以及子節(jié)點的列表信息蔗包。
4、數(shù)據(jù)節(jié)點(d:delete)刪除權(quán)限慧邮,授予權(quán)限的對象可以刪除該數(shù)據(jù)節(jié)點的子節(jié)點调限。
5、數(shù)據(jù)節(jié)點(a:admin)管理者權(quán)限误澳,授予權(quán)限的對象可以對該數(shù)據(jù)節(jié)點體進行ACL權(quán)限設(shè)置耻矮。
面試官:我們怎么查看和設(shè)置某個節(jié)點的ACL權(quán)限信息呢
我:可以通過getAcl來獲取某個節(jié)點的權(quán)限信息,通過setAcl來設(shè)置某個節(jié)點的權(quán)限信息忆谓。
面試官:zookeeper的數(shù)據(jù)是存儲在內(nèi)存中的嗎,怎么進行持久化操作呢?
我:zookeeper和redis很像哨免,數(shù)據(jù)都是在內(nèi)存中的勾扭,持久化也是兩種方式,一種是記錄事務(wù)日志铁瞒,一種是快照方式。
記錄事務(wù)日志磁盤會進行IO操作桅滋,事務(wù)日志的不斷增多會觸發(fā)磁盤為文件開辟新的磁盤塊慧耍,所以為了提升磁盤的效率,可以在創(chuàng)建文件的時候就向操作系統(tǒng)申請一塊大一點的磁盤塊丐谋,通過參數(shù)zookeeper.preAllocSize配置芍碧。
事務(wù)日志的存放地址通過zoo.cfg配置文件中的dataDir來指定。
面試官:小伙子真厲害啊号俐,我這邊沒有什么要問的了泌豆,你還有什么問題要問(面試官兩眼放光)
我:額。吏饿。踪危。面試官這個我的紙質(zhì)簡歷可以給我嗎,可以不往我的簡歷上寫寫畫畫嗎猪落,我明天的面試還要用贞远。
面試官:還面啥別的公司啊,就來我這吧笨忌,條件隨便開
我:那就100k吧(此時面試官又拿起了他準備好的棍子)
面試官:你要是不來就給我推薦一下蓝仲,讓別人來我這面試一下
我:你先好好學習一下zookeeper吧,今天幸虧只是我來了官疲,如果是小奇的忠實讀者來了袱结,你將會被虐的很慘的。(我將我的博客地址留給了面試官途凫,轉(zhuǎn)身留下了帥氣的背影垢夹,而面試官落寞無神的呆呆的坐在那里,仿佛一個億離他而去颖榜。棚饵。。)
這里關(guān)于zookeeper還沒有整理完畢噪漾,文章后面持續(xù)更新,建議收藏且蓬。
文章中涉及到的命令大家一定要像我一樣每個都敲幾遍欣硼,只有在敲的過程中才能發(fā)現(xiàn)自己對命令是否真正的掌握了。
如果覺得我的文章還不錯的話就點個贊吧