hadoop系列:zookeeper(1)——zookeeper單點和叢集安裝
1、概述
8月份的第一週,忙得暈頭轉向,為了解決OSGI-Felix 下 hibernate JPA的ClassLoader問題,就耽誤了至少兩天時間,還好在週五系統成功在servicemix上運行了。已經幾天時間沒有碰部落格了,剛好下週有安排給實驗室的幾個大神討論zookeeper相關技術。
我這麼一想,咦~~剛好這週末準備PPT的時候,還不如就預先做幾篇關於zookeeper的文章,這樣既可以兩件工作合成一件,又可以在介紹枯燥的負載均衡層的時候,提前給大家透露一些更精彩的技術內容,權當是為以後hadoop生態系統的講解預熱吧。
話轉正題,介紹zookeeper的文章,我將分成三個部分,第一篇文章我們講解zookeeper的兩種安裝方式包括一些基本的;第二篇文章我們講解zookeeper的核心原理,包括選舉演算法和事件機制;第三篇文章我們做一些編碼例項,實際講解zookeeper的使用場景。這樣希望大家可以學以致用。
哦,還要說明一下,包括LVS+Keepalived+Nginx配置在內的最後兩篇負載均衡層的文章不會水了大家。只是延遲一週左右退出,要知道小弟我也要優先完成公司的的任務啊,畢竟要吃一口飯。哈哈。
2、zookeeper是什麼
ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop的重要元件,CDH版本中更是使用它進行Namenode的協調控制。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、名字服務、分散式同步、組服務等。
ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。
好吧,我“百度”的,怎樣?不服就飛成都約我吃飯,^_^。說得那麼抽象,zookeeper到底能為我們的分散式系統做什麼事情呢:
- 管理系統中獨特的/統一的資訊:
一個分散式系統的各節點可能需要一個規範的、各節點的唯一的命名(例如節點名、CPU編號等),ZK可以實現這個的應用場景。
各個節點也會有一致的資訊,例如每個節點的主配置資訊。為了管理方便,新加入的節點也需要快速同步這些資訊。使用ZK可以方便的做到。
- 叢集狀態監控和通知:
分散式系統中的每個節點需要知道整個系統的狀態、知道系統中每個節點的狀態:當有新節點加入時它需要知道、當有節點出現故障時它需要知道、當有節點退出時它需要知道。ZK就是這樣一個“通知工具”。
- 協調資源搶佔(鎖):
當分散式系統的多個節點試圖同時搶佔唯一資源時(例如同時寫入一個檔案),就需要對這個唯一資源的使用進行協調。這是ZK的“協調者”功能。
- 分派計算任務:
如何協調1000個需要同時處理的任務到分散式系統的13個節點?如何保證執行失敗的任務能被重新執行?如何在某個節點崩潰的情況下,接管其正在處理的任務?
在瞭解了zookeeper的工作原理後,也許您還可以發現zookeeper的更多使用場景。我們也會在介紹zookeeper的第三篇文章中,用實際編寫程式碼的方式向各位讀者演示zookeeper如何實現以上各種工作任務的。
3、單點模式的安裝
下面我們就來實際安裝zookeeper。首先我們進行單伺服器的zookeeper安裝,讓zookeeper跑起來。成功後,我們再進行擴充套件,在多臺(三臺)伺服器上進行zookeeper的安裝,並讓其作為一個整體,執行起來。
3.1、準備工作
我們將在IP:192.168.61.130的機器上安裝zookeeper,您至少需要準備:
JDK的安裝這裡用幾句話描述就行了,但是一定記得設定PATH,classpath,JAVA_HOME環境變數:
tar -zxvf ./jdk-7u71-linux-x64.tar.gz
我將設定JDK的路徑為:/usr/jdk1.7.0_71
mv ./jdk1.7.0_71 /usr/jdk1.7.0_71/
記得設定環境變數(全域性配置檔案為:/etc/profile):
vim /etc/profile
貼上以下指令碼到檔案:
export PATH=/usr/jdk1.7.0_71/bin:$PATH
export classpath=/usr/jdk1.7.0_71/lib
export JAVA_HOME=/usr/jdk1.7.0_71
記得儲存檔案哈。然後重新載入作業系統使用者的環境資訊:
su - root
完成準備工作後,執行一下java命令,驗證準備工作是正確的(如果出現了一些java的幫助資訊,說明java命令執行成功了)。
3.2、正式安裝(配置項講解)
zookeeper的目錄我是放置在/usr/zookeeper-3.4.6/這個位置,所以:
tar -zxvf ./zookeeper-3.4.6.tar.gz
mv ./zookeeper-3.4.6 /usr/zookeeper-3.4.6/
同樣的,設定全域性環境變數:
export PATH=/usr/zookeeper-3.4.6/bin:$PATH
好的,安裝完成了,是不是簡單。接下來,我們講解一下zookeeper的主配置檔案。zookeeper的主配置檔案所在的地址是:${您的zookeeper安裝位置}/conf/zoo.cfg
但是,解壓後的zookeeper並沒有這個配置檔案,有一個名叫zoo_sample.cfg,所以,我們複製一個zoo.cfg檔案:
cp /usr/zookeeper-3.4.6/conf/zoo_sample.cfg /usr/zookeeper-3.4.6/conf/zoo.cfg
接下來,我們講解一下這個配置檔案中的重要配置項(在單節點模式下,配置資訊不需要做任何更改,就可以執行):
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
# maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# The number of snapshots to retain in dataDir
# autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
# autopurge.purgeInterval=1
- tickTime:這個屬性我們將在講解zookeeper的選舉機制時進行著重說明。
- dataDir:zookeeper的工作目錄,註釋寫得很清楚,只有測試環境才使用tmp目錄,否則都建議進行專門的設定。
- clientPort:客戶端的連線埠
- maxClientCnxns:客戶端最大連線數
最後,使用zkServer.sh start命令,啟動zookeeper:
[[email protected] ~]# zkServer.sh start
JMX enabled by default
Using config: /usr/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
之後可以使用zkServer.sh status檢視zookeeper的工作狀態:
[[email protected] ~]# zkServer.sh status
JMX enabled by default
Using config: /usr/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: standalone
使用jps命令也可以檢視:
[[email protected] ~]# jps
28172 Jps
14639 QuorumPeerMain
QuorumPeerMain這個程序就是zookeeper的程序。至此,zookeeper的單節點安裝就成功了。
4、叢集模式下的安裝
4.1、準備工作
我們將在以下三臺機器上安裝並採用叢集方式執行zookeeper:
- 192.168.61.129
- 192.168.61.130
- 192.168.61.131
安裝JDK,設定華景變數,解壓並防止zookeeper,這些步驟就都不說了,請參見上文中的設定。以下是我的建議:
所有節點的JDK安裝路徑,zookeeper的安裝路徑和環境變數的設定都完全一樣,這樣不會配著配著就把自己腦袋配暈(特別是如果您是第一次進行zookeeper的配置)
在正式環境中,我們不會使用root使用者進行zookeeper的執行。所以您最好在測試環境的時候建立一個使用者,例如名字叫做zookeeper的使用者。
正式換進下我們一般也不會關閉防火牆。但是為了保證在測試環境下熟悉相關的配置,我建議您關閉防火牆。(如果開啟防火牆的話,請開啟2181、2888、3888這幾個埠)
我們先建立幾個資料夾,注意資料夾的許可權要為您當前的使用者開啟(如果是root使用者,就不需要關心這個問題)。等一下配置過程中,我們會用到這些資料夾。
建立zookeeper工作目錄:
mkdir -p /usr/zookeeperdata/
mkdir -p /usr/zookeeperdata/data
建立zookeeper日誌目錄:
mkdir -p /usr/zookeeperdata/log
到此,準備工作結束。
4.2、正式安裝(配置項講解)
如果您是按照我的建議進行的準備工作,那麼到這裡,您三臺機器的目錄結構、環境變數、執行使用者都應該是完全一致的。這裡您只需要配置其中的一臺,然後將配置檔案scp到另外兩臺,就可以完成配置了。
以下是其中一臺的配置資訊:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/zookeeperdata/data
dataLogDir=/usr/zookeeperdata/log
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=192.168.61.129:2888:3888
server.2=192.168.61.130:2888:3888
server.3=192.168.61.131:2888:3888
請注意變化的資訊:
我們重新設定了zookeeper的工作目錄和日誌目錄:
dataDir=/usr/zookeeperdata/data
dataLogDir=/usr/zookeeperdata/log
我們指定了整個zookeeper叢集的server編號、地址和埠:
server.1=192.168.61.129:2888:3888
server.2=192.168.61.130:2888:3888
server.3=192.168.61.131:2888:3888
========================華麗的分割線====================
完成後我們將其中配置檔案拷貝到另外兩臺機器上:
scp /usr/zookeeper-3.4.6/conf/zoo.cfg [email protected]:/usr/zookeeper-3.4.6/conf/zoo.cfg
scp /usr/zookeeper-3.4.6/conf/zoo.cfg [email protected]:/usr/zookeeper-3.4.6/conf/zoo.cfg
現在最重要的一個步驟到了。還記得我們在配置檔案中給出的server列表都有一個編號嗎?我們需要為這三個節點建立對應的編號檔案,在/usr/zookeeperdata/data/myid檔案中。如下:
server.1=192.168.61.129:2888:3888,所以在129這臺機器上執行:
echo 1 > /usr/zookeeperdata/data/myid
server.2=192.168.61.130:2888:3888,所以在130這臺機器上執行:
echo 2 > /usr/zookeeperdata/data/myid
server.3=192.168.61.131:2888:3888,所以在131這臺機器上執行:
echo 3 > /usr/zookeeperdata/data/myid
至此,大功告成,我們準備開始啟動了。分別在三臺機器上執行(注意,執行部分先後):
zkServer.sh start
出現的結果如下(可能您的結果狀態和我的會不一樣)
129:
zkServer.sh status
JMX enabled by default
Using config: /usr/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
130:
zkServer.sh status
JMX enabled by default
Using config: /usr/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
131:
zkServer.sh status
JMX enabled by default
Using config: /usr/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
在一個zookeeper叢集叢集中,始終有一個節點會通過叢集所有節點參與的選舉被推舉為“leader”節點。其他節點就是“follower”節點。具體的原理,我們會在下篇文章進行詳細的闡述。
5、簡要命令和結構說明
本小結,我們簡單說明一下zookeeper的資料儲存結構,算是為下一篇文章介紹zookeeper中幾個重要的原理打打基礎。
5.1、zookeeper的儲存結構
zookeeper中的資料是按照“樹”結構進行儲存的。而且znode節點還分為4中不同的型別。如下:
PERSISTENT-持久化節點:建立這個節點的客戶端在與zookeeper服務的連線斷開後,這個節點也不會被刪除(除非您使用API強制刪除)。
PERSISTENT_SEQUENTIAL-持久化順序編號節點:當客戶端請求建立這個節點A後,zookeeper會根據parent-znode的zxid狀態,為這個A節點編寫一個全目錄唯一的編號(這個編號只會一直增長)。當客戶端與zookeeper服務的連線斷開後,這個節點也不會被刪除。
EPHEMERAL-臨時znode節點:建立這個節點的客戶端在與zookeeper服務的連線斷開後,這個節點就會被刪除。
EPHEMERAL_SEQUENTIAL-臨時順序編號znode節點:當客戶端請求建立這個節點A後,zookeeper會根據parent-znode的zxid狀態,為這個A節點編寫一個全目錄唯一的編號(這個編號只會一直增長)。當建立這個節點的客戶端與zookeeper服務的連線斷開後,這個節點被刪除
5.2、執行zkCli.sh命令
我們可以使用zkCli.sh命令,登入到一個zookeeper節點(不一定是leader節點),並通過命令列操作zookeeper的資料結構。
[[email protected] ~]# zkCli.sh
Connecting to localhost:2181
2015-08-08 08:18:15,181 [myid:] - INFO [main:[email protected]] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT
2015-08-08 08:18:15,193 [myid:] - INFO [main:[email protected]] - Client environment:host.name=vm2
。。。
。。。
[zk: localhost:2181(CONNECTED) 0]
通過ls命令,可以檢視zookeeper叢集當前的資料結構:
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]
當然,您還可以更多的命令:
connect host:port
get path [watch]
ls path [watch]
set path data [version]
rmr path
delquota [-n|-b] path
quit
printwatches on|off
create [-s] [-e] path data acl
stat path [watch]
close
ls2 path [watch]
history
listquota path
setAcl path acl
getAcl path
sync path
redo cmdno
addauth scheme auth
delete path [version]
setquota -n|-b val path
6、後文介紹
下一篇文章,我們將按照新的計劃,介紹zookeeper中的幾個關鍵原理。包括選舉策略,事件機制等。稍等片刻,馬上回來!
相關推薦
hadoop系列:zookeeper(1)——zookeeper單點和叢集安裝
1、概述 8月份的第一週,忙得暈頭轉向,為了解決OSGI-Felix 下 hibernate JPA的ClassLoader問題,就耽誤了至少兩天時間,還好在週五系統成功在servicemix上運行了。已經幾天時間沒有碰部落格了,剛好下週有安排給實驗室的幾個大
第11章 拾遺4:IPv6(1)_報文格式和地址型別
1. IPv4和IPv6協議棧的比較 (1)IPv6取代IPv4,支援IPv6的動態路由協議都屬於IPv6協議(如RIPng、OSPFv3)。 (2)Internet控制訊息協議IPv6版(ICMPv6)取代ICMP,它報告錯誤和其他資訊以幫助你診斷不成功的資料包傳送。其主要功能有鄰居
Java for Web學習筆記(三九):Filter(1)用途、定義和順序
Filter的用途 Filter可以用於以下方面: 記錄request和response的log進行認證和授權進行壓縮和加壓,非HTTPS的加密和解密錯誤處理。對於tomcat,出現錯誤通常會給出一個500的頁面,還有錯誤診斷資訊,對於一個公眾服務,這些診斷資訊可能會向黑客
大資料基礎(1)zookeeper原始碼解析
五 原始碼解析 public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING;}zookeeper伺服器狀態:剛啟動LOOKING,follower是FOLLOWING,leader是LEADING,observer是
zookeeper(1)
gossip 部落格園 首頁 新隨筆 聯絡 管理
轉載:深入淺出Zookeeper(一) Zookeeper架構及FastLeaderElection機制
轉載至 http://www.jasongj.com/zookeeper/fastleaderelection/: 原創文章,轉載請務必將下面這段話置於文章開頭處。本文轉發自技術世界,原文連結 http://www.jasongj.com/zookeeper/fastlead
JAVA大資料(1)--ZooKeeper的安裝與部署
本文講述如何安裝和部署ZooKeeper。 一、系統要求 ZooKeeper可以執行在多種系統平臺上面,表1展示了zk支援的系統平臺,以及在該平臺上是否支援開發環境或者生產環境。 表1:ZooKeeper支援的執行平臺 系統 開發環境 生
Java併發程式設計系列之十:synchronized(1)
在多執行緒併發訪問資源(這類資源稱為臨街資源)的時候,由於割裂來了原子操作,所以會導致資料不一致的情況。為了避免這種情況,需要使用同步機制,同步機制能夠保證多執行緒併發訪問資料的時候不會出現資料不一致的情況。 一種同步機制是使用synchronized關鍵字,
bootstrap源碼學習:輔助(1)
div max uid 排列 lock oot 引用 flex ots .blockquote-footer::before { content: "\2014 \00A0"; } 引用的腳步~效果是插入了“—”,可以做一個署名。 .container { m
EntityFramework Core筆記:入門(1)
tool power arc 2.3 isp IE clas scope color 1. 安裝運行環境 EntityFramework Core運行環境,安裝NuGget包: //Sql Server Database Provider PM> Ins
Centos 學習之路:基礎(1)
格式 鍵盤 平臺 處理 eight ctrl+ 環境 rehel 主機 馮·諾伊曼計算機模型: 采用二進制數表示程序和數據; 能存儲程序和數據,並能自動控制程序的執行; 具備運算器、控制器、存儲器、輸入設備和輸出設備5個基本部分。 CPU:是控制器及運算器 CPU的架
Python時間序列LSTM預測系列學習筆記(1)-單變數
本文是對: https://machinelearningmastery.com/time-series-forecasting-long-short-term-memory-network-python/ https://blog.csdn.net/iyangdi/article/deta
javaweb學習筆記(十五):JDBC(1)
目錄 1.概念 2 JDBC介面的核心API 例1:jdbc連線資料庫 例2:Statement物件演示 例3:PreparedStatement物件演示 例4:CallableStatement物件演示 1.概念 SUN公司為了簡化、統一對資料庫
javaweb學習筆記(十一):JSP(1)
目錄 jsp(1) 1.基本概念 1 .1Jsp的執行過程 1.2 JSP與servlet 2 JSP語法 2.1 Jsp模板 2.2 Jsp表示式 2.3 Jsp指令碼 2.4 Jsp宣告 2.5 Jsp註釋 jsp(1) 1.基本
javaweb學習筆記(八):JavaScript(1)
目錄 1.javascript 1.1 js的引入方式 1.2 ECMAScript基礎 1.2.1語法 1.2.2資料型別 1.2.3 運算子 1.3 ECMA物件 1.3.1 Function物件 1.3.2Number物件 1.3.3 String物
從Paxos到ZooKeeper(三)ZooKeeper的ZAB協議
ZAB協議 (一)ZAB協議是ZooKeeper實現資料一致性的核心演算法 (二)ZAB協議實現了一種主備模式的系統架構保持叢集中各副本之間資料的一致性 ZooKeeper使用單一的主程序接收並處理客戶端所有事務請求,採用ZAB的原子廣播協議,將伺服器資料狀態變更以事務Proposa
Map集合的練習:獲取每個字串出現的次數,輸出形式:a(1)b(2)。。。。。
package classdemo; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; /** * Map集合練習 需求:“fhsadfhsa
DSL 系列(1) - 擴展點的論述與實現
instance RoCE union caller move llb his java 偽代碼 前言 DSL 全稱為 domain-specific language(領域特定語言),本系列應當會很長,其中包含些許不成熟的想法,歡迎私信指正。 1. DSL 簡述? 我理
JVM垃圾回收(四)- GC算法:實現(1)
並行 ctime 配置 使用情況 ava 第一個 中標 算法 bsp GC算法:實現 上面我們介紹了GC算法中的核心概念,接下來我們看一下JVM裏的具體實現。首先必須了解的一個重要的事實是:對於大部分的JVM來說,兩種不同的GC算法是必須的,一個是清理Young Gene
hadoop教學視訊總結(1)
1、hadoop3(聽說比spark快10倍),基於jdk1.8以上,至少3臺機器 更加支援spark, 增加classpath isolation 防止一些不同的jar包版本 支援hdfs的擦除編碼 DataNode 儲存資料新增負載均衡 MapRedu