Java面试题目,java工程师成神之路
2. ZooKeeper 介紹
2.1. ZooKeeper 由來
正式介紹 ZooKeeper 之前,我們先來看看 ZooKeeper 的由來,還挺有意思的。
下面這段內(nèi)容摘自《從 Paxos 到 ZooKeeper 》第四章第一節(jié),推薦大家閱讀一下:
ZooKeeper 最早起源于雅虎研究院的一個(gè)研究小組。在當(dāng)時(shí),研究人員發(fā)現(xiàn),在雅虎內(nèi)部很多大型系統(tǒng)基本都需要依賴一個(gè)類似的系統(tǒng)來進(jìn)行分布式協(xié)調(diào),但是這些系統(tǒng)往往都存在分布式單點(diǎn)問題。所以,雅虎的開發(fā)人員就試圖開發(fā)一個(gè)通用的無單點(diǎn)問題的分布式協(xié)調(diào)框架,以便讓開發(fā)人員將精力集中在處理業(yè)務(wù)邏輯上。
關(guān)于“ZooKeeper”這個(gè)項(xiàng)目的名字,其實(shí)也有一段趣聞。在立項(xiàng)初期,考慮到之前內(nèi)部很多項(xiàng)目都是使用動(dòng)物的名字來命名的(例如著名的 Pig 項(xiàng)目),雅虎的工程師希望給這個(gè)項(xiàng)目也取一個(gè)動(dòng)物的名字。時(shí)任研究院的首席科學(xué)家 RaghuRamakrishnan 開玩笑地說:“在這樣下去,我們這兒就變成動(dòng)物園了!”此話一出,大家紛紛表示就叫動(dòng)物園管理員吧一一一因?yàn)楦鱾€(gè)以動(dòng)物命名的分布式組件放在一起,雅虎的整個(gè)分布式系統(tǒng)看上去就像一個(gè)大型的動(dòng)物園了,而 ZooKeeper 正好要用來進(jìn)行分布式環(huán)境的協(xié)調(diào)一一于是,ZooKeeper 的名字也就由此誕生了。
2.2. ZooKeeper 概覽
ZooKeeper 是一個(gè)開源的分布式協(xié)調(diào)服務(wù),它的設(shè)計(jì)目標(biāo)是將那些復(fù)雜且容易出錯(cuò)的分布式一致性服務(wù)封裝起來,構(gòu)成一個(gè)高效可靠的原語集,并以一系列簡(jiǎn)單易用的接口提供給用戶使用。
原語: 操作系統(tǒng)或計(jì)算機(jī)網(wǎng)絡(luò)用語范疇。是由若干條指令組成的,用于完成一定功能的一個(gè)過程。具有不可分割性·即原語的執(zhí)行必須是連續(xù)的,在執(zhí)行過程中不允許被中斷。
ZooKeeper 為我們提供了高可用、高性能、穩(wěn)定的分布式數(shù)據(jù)一致性解決方案,通常被用于實(shí)現(xiàn)諸如數(shù)據(jù)發(fā)布/訂閱、負(fù)載均衡、命名服務(wù)、分布式協(xié)調(diào)/通知、集群管理、Master 選舉、分布式鎖和分布式隊(duì)列等功能。
另外,ZooKeeper 將數(shù)據(jù)保存在內(nèi)存中,性能是非常棒的。 在“讀”多于“寫”的應(yīng)用程序中尤其地高性能,因?yàn)椤皩憽睍?huì)導(dǎo)致所有的服務(wù)器間同步狀態(tài)。(“讀”多于“寫”是協(xié)調(diào)服務(wù)的典型場(chǎng)景)。
2.3. ZooKeeper 特點(diǎn)
- 順序一致性: 從同一客戶端發(fā)起的事務(wù)請(qǐng)求,最終將會(huì)嚴(yán)格地按照順序被應(yīng)用到 ZooKeeper 中去。
- 原子性: 所有事務(wù)請(qǐng)求的處理結(jié)果在整個(gè)集群中所有機(jī)器上的應(yīng)用情況是一致的,也就是說,要么整個(gè)集群中所有的機(jī)器都成功應(yīng)用了某一個(gè)事務(wù),要么都沒有應(yīng)用。
- 單一系統(tǒng)映像 : 無論客戶端連到哪一個(gè) ZooKeeper 服務(wù)器上,其看到的服務(wù)端數(shù)據(jù)模型都是一致的。
- 可靠性: 一旦一次更改請(qǐng)求被應(yīng)用,更改的結(jié)果就會(huì)被持久化,直到被下一次更改覆蓋。
2.4. ZooKeeper 典型應(yīng)用場(chǎng)景
ZooKeeper 概覽中,我們介紹到使用其通常被用于實(shí)現(xiàn)諸如數(shù)據(jù)發(fā)布/訂閱、負(fù)載均衡、命名服務(wù)、分布式協(xié)調(diào)/通知、集群管理、Master 選舉、分布式鎖和分布式隊(duì)列等功能。
下面選 3 個(gè)典型的應(yīng)用場(chǎng)景來專門說說:
實(shí)際上,這些功能的實(shí)現(xiàn)基本都得益于 ZooKeeper 可以保存數(shù)據(jù)的功能,但是 ZooKeeper 不適合保存大量數(shù)據(jù),這一點(diǎn)需要注意。
2.5. 有哪些著名的開源項(xiàng)目用到了 ZooKeeper?
3. ZooKeeper 重要概念解讀
破音:拿出小本本,下面的內(nèi)容非常重要哦!
3.1. Data model(數(shù)據(jù)模型)
ZooKeeper 數(shù)據(jù)模型采用層次化的多叉樹形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)上都可以存儲(chǔ)數(shù)據(jù),這些數(shù)據(jù)可以是數(shù)字、字符串或者是二級(jí)制序列。并且。每個(gè)節(jié)點(diǎn)還可以擁有 N 個(gè)子節(jié)點(diǎn),最上層是根節(jié)點(diǎn)以“/”來代表。每個(gè)數(shù)據(jù)節(jié)點(diǎn)在 ZooKeeper 中被稱為 znode,它是 ZooKeeper 中數(shù)據(jù)的最小單元。并且,每個(gè) znode 都一個(gè)唯一的路徑標(biāo)識(shí)。
強(qiáng)調(diào)一句:ZooKeeper 主要是用來協(xié)調(diào)服務(wù)的,而不是用來存儲(chǔ)業(yè)務(wù)數(shù)據(jù)的,所以不要放比較大的數(shù)據(jù)在 znode 上,ZooKeeper 給出的上限是每個(gè)結(jié)點(diǎn)的數(shù)據(jù)大小最大是 1M。
從下圖可以更直觀地看出:ZooKeeper 節(jié)點(diǎn)路徑標(biāo)識(shí)方式和 Unix 文件系統(tǒng)路徑非常相似,都是由一系列使用斜杠"/"進(jìn)行分割的路徑表示,開發(fā)人員可以向這個(gè)節(jié)點(diǎn)中寫人數(shù)據(jù),也可以在節(jié)點(diǎn)下面創(chuàng)建子節(jié)點(diǎn)。這些操作我們后面都會(huì)介紹到。
3.2. znode(數(shù)據(jù)節(jié)點(diǎn))
介紹了 ZooKeeper 樹形數(shù)據(jù)模型之后,我們知道每個(gè)數(shù)據(jù)節(jié)點(diǎn)在 ZooKeeper 中被稱為 znode,它是 ZooKeeper 中數(shù)據(jù)的最小單元。你要存放的數(shù)據(jù)就放在上面,是你使用 ZooKeeper 過程中經(jīng)常需要接觸到的一個(gè)概念。
3.2.1. znode 4種類型
我們通常是將 znode 分為 4 大類:
- 持久(PERSISTENT)節(jié)點(diǎn) :一旦創(chuàng)建就一直存在即使 ZooKeeper 集群宕機(jī),直到將其刪除。
- 臨時(shí)(EPHEMERAL)節(jié)點(diǎn) :臨時(shí)節(jié)點(diǎn)的生命周期是與 客戶端會(huì)話(session) 綁定的,會(huì)話消失則節(jié)點(diǎn)消失 。并且,臨時(shí)節(jié)點(diǎn)只能做葉子節(jié)點(diǎn) ,不能創(chuàng)建子節(jié)點(diǎn)。
- 持久順序(PERSISTENT_SEQUENTIAL)節(jié)點(diǎn) :除了具有持久(PERSISTENT)節(jié)點(diǎn)的特性之外, 子節(jié)點(diǎn)的名稱還具有順序性。比如 /node1/app0000000001 、/node1/app0000000002 。
- 臨時(shí)順序(EPHEMERAL_SEQUENTIAL)節(jié)點(diǎn) :除了具備臨時(shí)(EPHEMERAL)節(jié)點(diǎn)的特性之外,子節(jié)點(diǎn)的名稱還具有順序性。
3.2.2. znode 數(shù)據(jù)結(jié)構(gòu)
每個(gè) znode 由 2 部分組成:
- stat :狀態(tài)信息
- data : 節(jié)點(diǎn)存放的數(shù)據(jù)的具體內(nèi)容
總結(jié)
本文從基礎(chǔ)到高級(jí)再到實(shí)戰(zhàn),由淺入深,把MySQL講的清清楚楚,明明白白,這應(yīng)該是我目前為止看到過最好的有關(guān)MySQL的學(xué)習(xí)筆記了,我相信如果你把這份筆記認(rèn)真看完后,無論是工作中碰到的問題還是被面試官問到的問題都能迎刃而解!
重要的事:需要領(lǐng)取完整版的MySQL學(xué)習(xí)筆記的話,請(qǐng)轉(zhuǎn)發(fā)+關(guān)注后點(diǎn)這里免費(fèi)獲取到免費(fèi)的下載方式!
MySQL50道高頻面試題整理:
注后點(diǎn)這里免費(fèi)獲取到免費(fèi)的下載方式!**
MySQL50道高頻面試題整理:
總結(jié)
以上是生活随笔為你收集整理的Java面试题目,java工程师成神之路的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。