上海企業(yè)名錄地址電話seo網(wǎng)絡(luò)推廣
ZooKeeper
ZK概述
ZooKeeper概念: Zookeeper是一個分布式協(xié)調(diào)服務(wù)的開源框架。本質(zhì)上是一個分布式的小文件存儲系統(tǒng)
ZooKeeper作用: 主要用來解決分布式集群中應(yīng)用系統(tǒng)的一致性問題。
ZooKeeper結(jié)構(gòu): 采用樹形層次結(jié)構(gòu),ZooKeeper樹中的每個節(jié)點被稱為—Znode。且樹中的每個節(jié)點可以擁有子節(jié)點
ZK集群環(huán)境
zookeeper概念: 分布式協(xié)調(diào)服務(wù)zookeeper的服務(wù)角色分別為:leader: 管理者 ,負責(zé)管理follower,處理所有的事務(wù)請求(數(shù)據(jù)的保存,修改,刪除)follower: 追隨者,負責(zé)選舉(選舉leader)和數(shù)據(jù)的同步及獲取observer: 觀察者,負責(zé)數(shù)據(jù)的同步及獲取(需要在配置文件中指定才能生效)zookeeper應(yīng)用: 搭建hadoop高可用環(huán)境時,至少需要兩個hadoop服務(wù)(NameNode和ResourceManager),一主一備,主服務(wù)對外提供業(yè)務(wù)功能,備用服務(wù)等待主服務(wù)不可用時,啟用備用服務(wù)器對外提供業(yè)務(wù)功能
ZK啟動和使用
配置環(huán)境變量
配置zookeeper環(huán)境變量**(注意三臺都單獨配置!!!)**
可以使用CRT客戶端發(fā)送以下命令到三臺
[root@nodex ~]# echo 'export ZOOKEEPER_HOME=/export/server/zookeeper' >> /etc/profile [root@nodex ~]# echo 'export PATH=$PATH:$ZOOKEEPER_HOME/bin' >> /etc/profile [root@nodex ~]# source /etc/profile
啟動集群
啟動zookeeper服務(wù)**(注意三臺都單獨需要啟動!!!)**
可以使用CRT客戶端發(fā)送以下命令到三臺
[root@nodex ~]# zkServer.sh start
還可以查看服務(wù)狀態(tài): [root@node]# zkServer.sh status
關(guān)閉zk服務(wù)的命令是: [root@node]# zkServer.sh stop
客戶端連接
連接服務(wù)
方式1:直接連接本地: [root@node1 ~]# zkCli.sh
方式2:連接其他節(jié)點: [root@node1 ~]# zkCli.sh -server 節(jié)點地址
[root@node1 ~]# zkCli.sh
ZK的shell命令
知識點:
查看所有shell命令: helpcreate [-s] [-e] 節(jié)點絕對路徑 節(jié)點數(shù)據(jù): 創(chuàng)建數(shù)據(jù)節(jié)點 注意: -s代表序列化節(jié)點 -e代表臨時節(jié)點delete 節(jié)點絕對路徑 [version]: 刪除一級節(jié)點 注意: 此方式如果有子節(jié)點是不能刪除的
rmr 節(jié)點絕對路徑: 刪多層除節(jié)點(如果有子節(jié)點也可以刪除)set 節(jié)點絕對路徑 data [version]: 設(shè)置 /修改節(jié)點數(shù)據(jù)get 節(jié)點絕對路徑 [watch]: 獲取數(shù)據(jù) 注意: watch是監(jiān)聽
ls 節(jié)點絕對路徑 : 查看節(jié)點信息 舉例: 查看根路徑下節(jié)點 ls /
ls2 節(jié)點絕對路徑 : 查看節(jié)點詳情信息
history: 查看操作歷史quit: 退出
示例:
[root@node1 ~]# zkCli.sh
...
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 1] create /binzi 666
Created /binzi
[zk: localhost:2181(CONNECTED) 2] create /binzi/b1 111
Created /binzi/b1
[zk: localhost:2181(CONNECTED) 3] create /binzi/b2 222
Created /binzi/b2[zk: localhost:2181(CONNECTED) 4] ls /
[binzi, zookeeper]
[zk: localhost:2181(CONNECTED) 5] ls /binzi
[b2, b1]
[zk: localhost:2181(CONNECTED) 6] set /binzi 888
...
[zk: localhost:2181(CONNECTED) 7] get /binzi
888
...[zk: localhost:2181(CONNECTED) 8] delete /binzi/b1
[zk: localhost:2181(CONNECTED) 9] ls /binzi
[b2]# 注意: delete不能刪除有子節(jié)點的節(jié)點
[zk: localhost:2181(CONNECTED) 10] delete /binzi
Node not empty: /binzi
# rmr可以刪除多層節(jié)點
[zk: localhost:2181(CONNECTED) 11] rmr /binzi
[zk: localhost:2181(CONNECTED) 12] ls /
[zookeeper][zk: localhost:2181(CONNECTED) 13] history
...
[zk: localhost:2181(CONNECTED) 14] quit
Quitting...shut down
[root@node1 ~]#
ZK的節(jié)點特性和分類
節(jié)點特性
ZooKeeper的數(shù)據(jù)模型,在結(jié)構(gòu)上和標準文件系統(tǒng)的非常相似,都是采用樹形層次結(jié)構(gòu),和文件系統(tǒng)的目錄樹一樣,ZooKeeper樹中的每個節(jié)點可以擁有子節(jié)點。
但也有不同之處:Znode兼具文件和目錄兩種特點: Znode沒有文件和目錄之分,Znode既有像文件一樣存儲數(shù)據(jù),也能像目錄一樣作為路徑標識的一部分Znode具有原子性操作: 讀操作將獲取與節(jié)點相關(guān)的所有數(shù)據(jù),寫操作也將替換掉節(jié)點的所有數(shù)據(jù)Znode存儲數(shù)據(jù)大小有限制: 每個Znode的數(shù)據(jù)大小至多1M,當時常規(guī)使用中應(yīng)該遠小于此值Znode通過路徑引用: 路徑必須是絕對的,因此他們必須由斜杠字符來開頭。除此以外,他們必須是唯一的,也就是說每一個路徑只有一個表示,因此這些路徑不能改變。 默認有/zookeeper節(jié)點用以保存關(guān)鍵的管理信息。
節(jié)點分類
節(jié)點分類: 永久普通節(jié)點,臨時普通節(jié)點,永久序列化節(jié)點,臨時序列化節(jié)點創(chuàng)建永久普通節(jié)點: create /節(jié)點 數(shù)據(jù)創(chuàng)建臨時普通節(jié)點: create -e /節(jié)點 數(shù)據(jù)創(chuàng)建永久序列化節(jié)點: create -s /節(jié)點 數(shù)據(jù)創(chuàng)建臨時序列化節(jié)點: create -e -s /節(jié)點 數(shù)據(jù)注意: 臨時節(jié)點不能創(chuàng)建子節(jié)點
節(jié)點屬性
每個znode都包含了一系列的屬性,通過命令get /節(jié)點,可以獲得節(jié)點的屬性
注意: 對于zk來說,每次的變化都會產(chǎn)生一個唯一的事務(wù)id,zxid(ZooKeeper Transaction Id)。通過zxid,可以確定更新操作的先后順序。例如,如果zxid1小于zxid2,說明zxid1操作先于zxid2發(fā)生,zxid對于整個zk都是唯一的,即使操作的是不同的znode。
cZxid :Znode創(chuàng)建的事務(wù)id。
ctime :Znode創(chuàng)建時的時間戳.? mZxid :Znode被修改的事務(wù)id,即每次對當前znode的修改都會更新mZxid。
? mtime :Znode最新一次更新發(fā)生時的時間戳.? pZxid :Znode的子節(jié)點列表變更的事務(wù)ID,添加子節(jié)點或刪除子節(jié)點就會影響子節(jié)點列表
? cversion :子節(jié)點進行變更的版本號。添加子節(jié)點或刪除子節(jié)點就會影響子節(jié)點版本號? dataVersion:數(shù)據(jù)版本號,每次對節(jié)點進行set操作,dataVersion的值都會增加1(即使設(shè)置的是相同的數(shù)據(jù)),可有效避免了 數(shù)據(jù)更新時出現(xiàn)的先后順序問題。
? aclVersion : 權(quán)限變化列表版本 access control list Version
? ephemeralOwner : 字面翻譯臨時節(jié)點擁有者,永久節(jié)點值為: 0x0,臨時節(jié)點值為:會話ID (不是0x0的就是臨時節(jié)點)
? dataLength : Znode數(shù)據(jù)長度
? numChildren: 當前Znode子節(jié)點數(shù)量(不包括子子節(jié)點)
ZK集群特點
1. 全局數(shù)據(jù)一致: 集群中每個服務(wù)器保存一份相同的數(shù)據(jù)副本,client無論連接到哪個服務(wù)器,展示的數(shù)據(jù)都是一致的,這是最重要的特征;2. 可靠性: 如果消息被其中一臺服務(wù)器接受,那么將被所有的服務(wù)器接受。3. 順序性: 包括全局有序和偏序兩種:全局有序是指如果在一臺服務(wù)器上消息a在消息b前發(fā)布,則在所有Server上消息a都將在消息b前被發(fā)布;偏序是指如果一個消息b在消息a后被同一個發(fā)送者發(fā)布,a必將排在b前面。4. 數(shù)據(jù)更新原子性: 一次數(shù)據(jù)更新要么成功(半數(shù)以上節(jié)點成功),要么失敗,不存在中間狀態(tài);5. 實時性: Zookeeper保證客戶端將在一個時間間隔范圍內(nèi)獲得服務(wù)器的更新信息,或者服務(wù)器失效的信息。
watch監(jiān)聽機制
? ZooKeeper中,引入了Watcher機制來實現(xiàn)數(shù)據(jù)發(fā)布/訂閱功能,一個典型的發(fā)布/訂閱模型系統(tǒng)定義了一種一對多的訂閱關(guān)系,能讓多個訂閱者同時監(jiān)聽某一個主題對象,當這個主題對象自身狀態(tài)變化時,會通知所有訂閱者,使他們能夠做出相應(yīng)的處理。
ZooKeeper允許客戶端向服務(wù)端注冊一個Watcher監(jiān)聽,當服務(wù)端的一些事件觸發(fā)了這個Watcher,那么就會向指定客戶端發(fā)送一個事件通知來實現(xiàn)分布式的通知功能。
watch監(jiān)聽機制過程: 客戶端向服務(wù)端注冊Watcher 服務(wù)端事件發(fā)生觸發(fā)Watcher 客戶端回調(diào)Watcher得到觸發(fā)事件情況
Watch監(jiān)聽機制注冊格式: get /節(jié)點絕對路徑 watch
Watch監(jiān)聽機制特點:先注冊再觸發(fā): Zookeeper中的watch機制,必須客戶端先去服務(wù)端注冊監(jiān)聽,這樣事件發(fā)送才會觸發(fā)監(jiān)聽,通知給客戶端一次性觸發(fā): 事件發(fā)生觸發(fā)監(jiān)聽,一個watcher event就會被發(fā)送到設(shè)置監(jiān)聽的客戶端,這種效果是一次性的,后續(xù)再次發(fā)生同樣的事件,不會再次觸發(fā)。異步發(fā)送: watcher的通知事件從服務(wù)端發(fā)送到客戶端是異步的。通知內(nèi)容: 通知狀態(tài)(keeperState),事件類型(EventType)和節(jié)點路徑(path)
示例
node1上創(chuàng)建臨時節(jié)點
[zk: localhost:2181(CONNECTED) 1] create -e /master 1111
Created /master
node2上設(shè)置監(jiān)聽
[zk: localhost:2181(CONNECTED) 28] get /master watch
node1退出
[zk: localhost:2181(CONNECTED) 2] quit
node2查看消息
[zk: localhost:2181(CONNECTED) 29]
WATCHER::WatchedEvent state:SyncConnected type:NodeDeleted path:/master
ZK應(yīng)用
1. 數(shù)據(jù)發(fā)布/訂閱數(shù)據(jù)發(fā)布/訂閱系統(tǒng),就是發(fā)布者將數(shù)據(jù)發(fā)布到ZooKeeper的一個節(jié)點上,提供訂閱者進行數(shù)據(jù)訂閱,從而實現(xiàn)動態(tài)更新數(shù)據(jù)的目的,實現(xiàn)配置信息的集中式管理和數(shù)據(jù)的動態(tài)更新。主要用到知識點: 監(jiān)聽機制2. 提供集群選舉在分布式環(huán)境下,不管是主從架構(gòu)集群,還是主備架構(gòu)集群,要求在服務(wù)的時候有且有一個正常的對外提供服務(wù),我們稱之為master。
當master出現(xiàn)故障之后,需要重新選舉出的新的master。保證服務(wù)的連續(xù)可用性。zookeeper可以提供這樣的功能服務(wù)。
主要用到知識點: znode唯一性、臨時節(jié)點短暫性、監(jiān)聽機制。選舉概述:
選舉要求: 過半原則,所以搭建集群一般奇數(shù),只要某個node節(jié)點票數(shù)過半立刻成為leader集群第一次啟動: 啟動follower每次投票后,他們會相互同步投票情況,如果票數(shù)相同,誰的myid大,誰就當選leader,一旦確定了leader,后面來的默認就是follower,即使它的myid大,leader也不會改變(除非leader宕機了)leader宕機后啟動: 每一個leader當老大的時候,都會產(chǎn)生新紀元epoch,且每次操作完節(jié)點數(shù)據(jù)都會更新事務(wù)id(高32位_低32位) ,當leader宕機后,剩下的follower就會綜合考慮幾個因素選出最新的leader,先比較最后一次更新數(shù)據(jù)事務(wù)id(高32位_低32位),誰的事務(wù)id最大,誰就當選leader,如果更新數(shù)據(jù)的事務(wù)id都相同的情況下,就需要再次考慮myid,誰的myid大,誰就當選leader
hadoop高可用(主備切換)
概述
? hadoop2.x之后,Cloudera提出了QJM/Qurom Journal Manager,這是一個基于Paxos算法(分布式一致性算法)實現(xiàn)的HDFS HA方案,它給出了一種較好的解決思路和方案,QJM主要優(yōu)勢如下:不需要配置額外的高共享存儲,降低了復(fù)雜度和維護成本。消除spof(單點故障)。系統(tǒng)魯棒性(Robust)的程度可配置、可擴展。
? 在HA架構(gòu)里面SecondaryNameNode已經(jīng)不存在了,為了保持standby NN, 實時的與Active NN的元數(shù)據(jù)保持一致,他們之間交互通過JournalNode進行操作同步。
? 任何修改操作在 Active NN上執(zhí)行時,JournalNode進程同時也會記錄修改log到至少半數(shù)以上的JN中,這時 Standby NN 監(jiān)測到JN 里面的同步log發(fā)生變化了會讀取 JN 里面的修改log,然后同步到自己的目錄鏡像文件里面
? 當發(fā)生故障時,Active的 NN 掛掉后,Standby NN 會在它成為Active NN 前,讀取所有的JN里面的修改日志,這樣就能高可靠的保證與掛掉的NN的目錄鏡像文件一致,然后無縫的接替它的職責(zé),維護來自客戶端請求,從而達到一個高可用的目的。
? 在HA模式下,datanode需要確保同一時間有且只有一個NN能命令DN。為此:每個NN改變狀態(tài)的時候,向DN發(fā)送自己的狀態(tài)和一個序列號。
? DN在運行過程中維護此序列號,當failover時,新的NN在返回DN心跳時會返回自己的active狀態(tài)和一個更大的序列號。DN接收到這個返回則認為該NN為新的active。
? 如果這時原來的active NN恢復(fù),返回給DN的心跳信息包含active狀態(tài)和原來的序列號,這時DN就會拒絕這個NN的命令。
Failover Controller
HA模式下,會將FailoverController部署在每個NameNode的節(jié)點上,作為一個單獨的進程用來監(jiān)視NN的健康狀態(tài)。FailoverController主要包括三個組件:
HealthMonitor: 監(jiān)控NameNode是否處于unavailable或unhealthy狀態(tài)。當前通過RPC調(diào)用NN相應(yīng)的方法完成。? ActiveStandbyElector: 監(jiān)控NN在ZK中的狀態(tài)。
? ZKFailoverController: 訂閱HealthMonitor 和ActiveStandbyElector 的事件,并管理NN的狀態(tài),另外zkfc還
負責(zé)解決fencing(也就是腦裂問題)。
JournalNode進程作用: 任何修改操作在 Active NN上執(zhí)行時,JournalNode進程同時也會記錄修改log到至少半數(shù)以上的JN中,這時 Standby NN 監(jiān)測到JN 里面的同步log發(fā)生變化了會讀取 JN 里面的修改log,然后同步到自己的目錄鏡像文件里面DFSZKFailoverController進程作用: 1. 健康監(jiān)測:周期性的向它監(jiān)控的NN發(fā)送健康探測命令,從而來確定某個NameNode是否處于健康狀態(tài),如果機器宕機,心跳失敗,那么zkfc就會標記它處于一個不健康的狀態(tài)2.會話管理:如果NN是健康的,zkfc就會在zookeeper中保持一個打開的會話,如果NameNode同時還是Active狀態(tài)的,那么zkfc還會在Zookeeper中占有一個類型為短暫類型的znode,當這個NN掛掉時,這個znode將會被刪除,然后備用的NN將會得到這把鎖,升級為主NN,同時標記狀態(tài)為Active3.master選舉:通過在zookeeper中維持一個短暫類型的znode,來實現(xiàn)搶占式的鎖機制,從而判斷那個NameNode為Active狀態(tài)4.當宕機的NN新啟動時,它會再次注冊zookeper,發(fā)現(xiàn)已經(jīng)有znode鎖了,便會自動變?yōu)镾tandby狀態(tài),如此往復(fù)循環(huán),保證高可靠
高可用服務(wù)
NN: NameNode
DN: DataNodeRM: ResourceManager
NM: NodeManagerJN: JournalNode
ZK: ZooKeeper
ZKFC: DFSZKFailoverController
啟動hadoop高可用環(huán)境
# 1.先恢復(fù)快照到高可用環(huán)境# 2.三臺服務(wù)器啟動zookeeper服務(wù)
[root@node1 ~]# zkServer.sh start
[root@node2 ~]# zkServer.sh start
[root@node3 ~]# zkServer.sh start# 3.在node1中啟動hadoop集群
[root@node1 ~]# start-all.sh# 4.檢查服務(wù)
[root@node1 ~]# jps
[root@node2 ~]# jps
[root@node3 ~]# jps
NameNode高可用:
web鏈接:
node1:50070
node2:50070
可以使用kill -9 NN進程號把其中主服務(wù)殺掉,觀察效果,然后使用 hdfs --daemon start namenode 重啟,再次觀察效果
active: namenode主服務(wù)
standby: namenode備份服務(wù)
ResourceManager高可用
web鏈接:
node1:8088
node2:8088
可以使用kill -9 RM進程號把其中主服務(wù)殺掉,觀察效果,然后使用 yarn --daemon start resourcemanager 重啟,再次觀察效果
注意: 兩個服務(wù)同時啟動,按照上述鏈接去訪問會自動跳到同一個主節(jié)點頁面