一、Zookeeper的搭建方式
Zookeeper安裝方式有三種,單機(jī)模式和集群模式以及偽集群模式缠诅。
1.單機(jī)模式:Zookeeper只運(yùn)行在一臺服務(wù)器上溶浴,適合測試環(huán)境;
2.偽集群模式:就是在一臺物理機(jī)上運(yùn)行多個Zookeeper 實例管引。
3.集群模式:Zookeeper運(yùn)行于一個集群上士败,適合生產(chǎn)環(huán)境,這個計算機(jī)集群被稱為一個“集合體”(ensemble)汉匙。
Zookeeper通過復(fù)制來實現(xiàn)高可用性,只要集合體中半數(shù)以上的機(jī)器處于可用狀態(tài)生蚁,它就能夠保證服務(wù)繼續(xù)噩翠。為什么一定要超過半數(shù)呢?這跟Zookeeper的復(fù)制策略有關(guān):zookeeper確保對znode 樹的每一個修改都會被復(fù)制到集合體中超過半數(shù)的機(jī)器上邦投。
1.1 Zookeeper的單機(jī)模式搭建
(1)下載ZooKeeper:http://pan.baidu.com/s/1pJlwbR9
(2)解壓:tar -zxvf zookeeper-3.4.5.tar.gz 重命名:mv zookeeper-3.4.5 zk
(3)配置文件:在conf目錄下刪除zoo_sample.cfg
文件伤锚,創(chuàng)建一個配置文件zoo.cfg
。
tickTime=2000
dataDir=/usr/local/zk/data
dataLogDir=/usr/local/zk/dataLog
clientPort=2181
(4)配置環(huán)境變量:為了今后操作方便志衣,我們需要對Zookeeper的環(huán)境變量進(jìn)行配置屯援,方法如下在/etc/profile文件中加入如下內(nèi)容:
export ZOOKEEPER_HOME=/usr/local/zk
export PATH=.:HADOOP H OME/bin: ZOOKEEPER_HOME/bin:JAVA H OME/bin: PATH
(5)啟動ZooKeeper的Server:zkServer.sh start
;關(guān)閉ZooKeeper的Server:zkServer.sh stop
1.2 Zookeeper的偽集群模式搭建
Zookeeper不但可以在單機(jī)上運(yùn)行單機(jī)模式Zookeeper念脯,而且可以在單機(jī)模擬集群模式 Zookeeper的運(yùn)行狞洋,也就是將不同節(jié)點運(yùn)行在同一臺機(jī)器。我們知道偽分布模式下Hadoop的操作和分布式模式下有著很大的不同绿店,但是在集群為分布 式模式下對Zookeeper的操作卻和集群模式下沒有本質(zhì)的區(qū)別吉懊。顯然,集群偽分布式模式為我們體驗Zookeeper和做一些嘗試性的實驗提供了很大 的便利假勿。比如借嗽,我們在實驗的時候,可以先使用少量數(shù)據(jù)在集群偽分布模式下進(jìn)行測試转培。當(dāng)測試可行的時候恶导,再將數(shù)據(jù)移植到集群模式進(jìn)行真實的數(shù)據(jù)實驗。這樣不 但保證了它的可行性浸须,同時大大提高了實驗的效率惨寿。這種搭建方式,比較簡便删窒,成本比較低缤沦,適合測試和學(xué)習(xí),如果你的手頭機(jī)器不足易稠,就可以在一臺機(jī)器上部署了 3個server缸废。
1.2.1. 注意事項
在一臺機(jī)器上部署了3個server,需要注意的是在集群為分布式模式下我們使用的每個配置文檔模擬一臺機(jī)器,也就是說單臺機(jī)器及上運(yùn)行多個Zookeeper實例企量。但是测萎,必須保證每個配置文檔的各個端口號不能沖突,除了clientPort不同之外届巩,dataDir也不同硅瞧。另外,還要在dataDir所對應(yīng)的目錄中創(chuàng)建myid文件來指定對應(yīng)的Zookeeper服務(wù)器實例恕汇。
(1)clientPort端口:如果在1臺機(jī)器上部署多個server腕唧,那么每臺機(jī)器都要不同的 clientPort,比如 server1是2181,server2是2182瘾英,server3是2183枣接,
(2)dataDir和dataLogDir:dataDir和dataLogDir也需要區(qū)分下,將數(shù)據(jù)文件和日志文件分開存放缺谴,同時每個server的這兩變量所對應(yīng)的路徑都是不同的但惶。
(3)server.X和myid: server.X 這個數(shù)字就是對應(yīng),data/myid中的數(shù)字湿蛔。在3個server的myid文件中分別寫入了0膀曾,1,2阳啥,那么每個server中的zoo.cfg都配 server.0 server.2,server.3就行了添谊。因為在同一臺機(jī)器上,后面連著的2個端口察迟,3個server都不要一樣碉钠,否則端口沖突。
下面是我所配置的集群偽分布模式卷拘,分別通過zoo1.cfg喊废、zoo2.cfg、zoo3.cfg來模擬由三臺機(jī)器的Zookeeper集群栗弟。詳見下圖1.1-1.3
代碼清單 1.1 zoo1.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.
dataDir=/usr/local/zk/data_1
# the port at which the clients will connect
clientPort=2181
#the location of the log file
dataLogDir=/usr/local/zk/logs_1
server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389
代碼清單 1.2 zoo2.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.
dataDir=/usr/local/zk/data_2
# the port at which the clients will connect
clientPort=2182
#the location of the log file
dataLogDir=/usr/local/zk/logs_2
server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389
代碼清單 zoo3.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.
dataDir=/usr/local/zk/data_3
# the port at which the clients will connect
clientPort=2183
#the location of the log file
dataLogDir=/usr/local/zk/logs_3
server.0=localhost:2287:3387
server.1=localhost:2288:3388
server.2=localhost:2289:3389
1.2.2 啟動
在集群為分布式下污筷,我們只有一臺機(jī)器,按時要運(yùn)行三個Zookeeper實例乍赫。此時瓣蛀,如果在使用單機(jī)模式的啟動命令是行不通的。此時雷厂,只要通過下面三條命令就能運(yùn)行前面所配置的Zookeeper服務(wù)惋增。如下所示:
zkServer.sh start zoo1.sh
zkServer.sh start zoo2.sh
zkServer.sh start zoo3.sh
啟動過程,如下圖1.4-1.5所示:
圖 1.4
[站外圖片上傳中...(image-3744f9-1510797174100)]
圖 1.5
在運(yùn)行完第一條指令之后改鲫,會出現(xiàn)一些錯誤異常诈皿,產(chǎn)生異常信息的原因是由于Zookeeper服務(wù)的每個實例都擁有全局配置信息林束,他們在啟動的時候會隨時隨地的進(jìn)行Leader選舉操作。此時稽亏,第一個啟動的Zookeeper需要和另外兩個Zookeeper實例進(jìn)行通信壶冒。但是,另外兩個Zookeeper實例還沒有啟動起來截歉,因此就產(chǎn)生了這樣的異樣信息胖腾。
我們直接將其忽略即可,待把圖中“2號”和“3號”Zookeeper實例啟動起來之后瘪松,相應(yīng)的異常信息自然會消失咸作。此時,可以通過下面三條命令宵睦,來查詢记罚。
zkServer.sh status zoo1.cfg
zkServer.sh status zoo2.cfg
zkServer.sh status zoo3.cfg
Zookeeper服務(wù)的運(yùn)行狀態(tài),如圖1.6状飞。
圖 1.6
1.3 Zookeeper的集群模式搭建
為了獲得可靠地Zookeeper服務(wù)毫胜,用戶應(yīng)該在一個機(jī)群上部署Zookeeper书斜。只要機(jī)群上大多數(shù)的Zookeeper服務(wù)啟動了诬辈,那么總的Zookeeper服務(wù)將是可用的。集群的配置方式荐吉,和前兩種類似焙糟,同樣需要進(jìn)行環(huán)境變量的配置。在每臺機(jī)器上conf/zoo.cf配置文件的參數(shù)設(shè)置相同
1.3.1 創(chuàng)建myid
在dataDir(/usr/local/zk/data)目錄創(chuàng)建myid文件
Server0機(jī)器的內(nèi)容為:0
Server1機(jī)器的內(nèi)容為:1
Server2機(jī)器的內(nèi)容為:2
1.3.2 編寫配置文件
在conf目錄下刪除zoo_sample.cfg文件样屠,創(chuàng)建一個配置文件zoo.cfg穿撮,如圖2.4所示。
代碼清單 2.4 zoo.cfg中的參數(shù)設(shè)置
# 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.
dataDir=/usr/local/zk/data
# the port at which the clients will connect
clientPort=2183
#the location of the log file
dataLogDir=/usr/local/zk/log
server.0=hadoop:2288:3388
server.1=hadoop0:2288:3388
server.2=hadoop1:2288:3388
1.3.3 啟動
分別在3臺機(jī)器上啟動ZooKeeper的Server:zkServer.sh start痪欲;
二悦穿、Zookeeper的配置
Zookeeper的功能特性是通過Zookeeper配置文件來進(jìn)行控制管理的(zoo.cfg).這樣的設(shè)計其實有其自身的原因,通過前面對Zookeeper的配置可以看出业踢,在對Zookeeper集群進(jìn)行配置的時候栗柒,它的配置文檔是完全相同的。集群偽分布模式中知举,有少部分是不同的瞬沦。這樣的配置方式使得在部署Zookeeper服務(wù)的時候非常方便。如果服務(wù)器使用不同的配置文件雇锡,必須確保不同配置文件中的服務(wù)器列表相匹配逛钻。
在設(shè)置Zookeeper配置文檔時候,某些參數(shù)是可選的锰提,某些是必須的曙痘。這些必須參數(shù)就構(gòu)成了Zookeeper配置文檔的最低配置要求芳悲。另外,若要對Zookeeper進(jìn)行更詳細(xì)的配置屡江,可以參考下面的內(nèi)容芭概。
2.1 基本配置
下面是在最低配置要求中必須配置的參數(shù):
1.client:監(jiān)聽客戶端連接的端口。
2.tickTime:基本事件單元惩嘉,這個時間是作為Zookeeper服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時間間隔罢洲,每隔tickTime時間就會發(fā)送一個心跳;最小的session過期時間為2倍tickTime
3.dataDir:存儲內(nèi)存中數(shù)據(jù)庫快照的位置文黎,如果不設(shè)置參數(shù)惹苗,更新食物的日志將被存儲到默認(rèn)位置。
應(yīng)該謹(jǐn)慎的選擇日志存放的位置耸峭,使用專用的日志存儲設(shè)備能夠大大提高系統(tǒng)的性能桩蓉,如果將日志存儲在比較繁忙的存儲設(shè)備上,那么將會很大程度上影像系統(tǒng)性能劳闹。
2.2 高級配置
下面是高級配置參數(shù)中可選配置參數(shù)院究,用戶可以使用下面的參數(shù)來更好的規(guī)定Zookeeper的行為:
(1)dataLogdDir
這個操作讓管理機(jī)器把事務(wù)日志寫入“dataLogDir”所指定的目錄中,而不是“dataDir”所指定的目錄本涕。這將允許使用一個專用的日志設(shè)備业汰,幫助我們避免日志和快照的競爭。配置如下:
# the directory where the snapshot is stored
dataDir=/usr/local/zk/data
(2)maxClientCnxns
這個操作將限制連接到Zookeeper的客戶端數(shù)量菩颖,并限制并發(fā)連接的數(shù)量样漆,通過IP來區(qū)分不同的客戶端。此配置選項可以阻止某些類別的Dos攻擊晦闰。將他設(shè)置為零或忽略不進(jìn)行設(shè)置將會取消對并發(fā)連接的限制放祟。
例如,此時我們將maxClientCnxns的值設(shè)為1呻右,如下所示:
# set maxClientCnxns
maxClientCnxns=1
啟動Zookeeper之后跪妥,首先用一個客戶端連接到Zookeeper服務(wù)器上。之后如果有第二個客戶端嘗試對Zookeeper進(jìn)行連接声滥,或者有某些隱式的對客戶端的連接操作眉撵,將會觸發(fā)Zookeeper的上述配置。
(3)minSessionTimeout和maxSessionTimeout
即最小的會話超時和最大的會話超時時間醒串。在默認(rèn)情況下执桌,minSession=2tickTime;maxSession=20tickTime芜赌。
2.3 集群配置
(1)initLimit
此配置表示仰挣,允許follower(相對于Leaderer言的“客戶端”)連接并同步到Leader的初始化連接時間,以tickTime為單位缠沈。當(dāng)初始化連接時間超過該值膘壶,則表示連接失敗错蝴。
(2)syncLimit
此配置項表示Leader與Follower之間發(fā)送消息時,請求和應(yīng)答時間長度颓芭。如果follower在設(shè)置時間內(nèi)不能與leader通信顷锰,那么此follower將會被丟棄。
(3)server.A=B:C:D
A:其中 A 是一個數(shù)字亡问,表示這個是服務(wù)器的編號官紫;
B:是這個服務(wù)器的 ip 地址;
C:Leader選舉的端口州藕;
D:Zookeeper服務(wù)器之間的通信端口束世。
(3)myid和zoo.cfg
除了修改 zoo.cfg 配置文件,集群模式下還要配置一個文件 myid床玻,這個文件在 dataDir 目錄下毁涉,這個文件里面就有一個數(shù)據(jù)就是 A 的值,Zookeeper 啟動時會讀取這個文件锈死,拿到里面的數(shù)據(jù)與 zoo.cfg 里面的配置信息比較從而判斷到底是那個 server贫堰。
三、搭建ZooKeeper服務(wù)器集群
搭建要求:
1> zk服務(wù)器集群規(guī)模不小于3個節(jié)點
2> 要求各服務(wù)器之間系統(tǒng)時間要保持一致待牵。
3.1 安裝配置ZK
(1)使用WinScp將Zk傳輸?shù)紿adoop主機(jī)上的/usr/local其屏,我用的版本是zookeeper-3.4.5.tar.gz。
(2)在hadoop的/usr/local目錄下洲敢,解壓縮zk....tar.gz漫玄,設(shè)置環(huán)境變量
a解壓縮:在/usr/local目錄下茄蚯,執(zhí)行命令:tar -zxvf zookeeper-3.4.5.tar.gz压彭,如圖2.1。
[站外圖片上傳中...(image-80be68-1510797174100)]
圖 2.1
b重命名:解壓后將文件夾渗常,重命名為zk壮不,執(zhí)行命令: mv zookeeper-3.4.5 zk如圖2.2。
圖 2.2
c)設(shè)置環(huán)境變量:執(zhí)行命令: vi /etc/profile 皱碘,添加 :export ZOOKEEPER_HOME=/usr/local/zk询一,如圖2.3所示的內(nèi)容。執(zhí)行命令:source /etc/profile 如圖2.4所示癌椿。
圖 2.3
[站外圖片上傳中...(image-21eff8-1510797174100)]
圖2.4
3.2 修改ZK配置文件
(1)重命名:將/usr/local/zk/conf目錄下zoo_sample.cfg健蕊,重命名為zoo.cfg,執(zhí)行命令:mv zoo_sample.cfg zoo.cfg踢俄。如圖2.5所示缩功。
[站外圖片上傳中...(image-32209-1510797174100)]
圖 2.5
(2)查看:在/usr/local/zk/conf目錄下,修改文件 vi zoo.cfg都办,文件內(nèi)容如下圖2.6所示嫡锌。在該文件中dataDir表示文件存放目錄虑稼,它的默認(rèn)設(shè)置為/tmp/zookeeper這是一個臨時存放目錄,每次重啟后會丟失势木,在這我們自己設(shè)一個目錄蛛倦,/usr/local/zk/data。
[站外圖片上傳中...(image-918ca0-1510797174100)]
圖 2.6
(2)創(chuàng)建文件夾:mkdir /usr/local/zk/data
(3)創(chuàng)建myid:在data目錄下啦桌,創(chuàng)建文件myid溯壶,值為0;vi myid ;內(nèi)容為0甫男。
(4)編輯:編輯該文件茸塞,執(zhí)行vi zoo.cfg ,修改dataDir=/usr/local/zk/data查剖。
新增:server.0=hadoop:2888:3888
server.1=hadoop0:2888:3888
server.2=hadoop1:2888:3888
tickTime :這個時間是作為 Zookeeper 服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時間間隔钾虐,也就是每個 tickTime 時間就會發(fā)送一個心跳;
dataDir:顧名思義就是 Zookeeper 保存數(shù)據(jù)的目錄笋庄,默認(rèn)情況下效扫,Zookeeper 將寫數(shù)據(jù)的日志文件也保存在這個目錄里;
clientPort:這個端口就是客戶端連接 Zookeeper 服務(wù)器的端口直砂,Zookeeper 會監(jiān)聽這個端口菌仁,接受客戶端的訪問請求。
當(dāng)這些配置項配置好后静暂,就可以啟動 Zookeeper 了济丘,啟動后使用命令echo ruok | nc localhost 2181檢查 Zookeeper 是否已經(jīng)在服務(wù)。
3.3 配置其他節(jié)點
(1)把haooop主機(jī)的zk目錄和/etc/profile目錄洽蛀,復(fù)制到hadoop0和hadoop1中摹迷。執(zhí)行命令:
scp -r /usr/local/zk/ hadoop0:/usr/local/
scp -r /usr/local/zk/ hadoop1:/usr/local/
scp /etc/profile hadoop0:/etc/
scp /etc/profile hadoop1:/etc/
ssh hadoop0
suorce /etc/profile
vi /usr/local/zk/data/myid
exit
ssh hadoop1
suorce /etc/profile
vi /usr/local/zk/data/myid
exit
(2)把hadoop1中相應(yīng)的myid的值改為1,把hadoop2中相應(yīng)的myid的值改為2郊供。
四峡碉、啟動檢驗
(1)啟動,在三個節(jié)點上分別執(zhí)行命令zkServer.sh start
hadoop節(jié)點:如圖3.1所示驮审。
[站外圖片上傳中...(image-c7bc4b-1510797174100)]
圖 3.1
hadoop0節(jié)點:如圖3.2所示鲫寄。
[站外圖片上傳中...(image-ecd7b6-1510797174100)]
圖 3.2
hadoop1節(jié)點:如圖3.3所示。
[站外圖片上傳中...(image-9ed439-1510797174100)]
圖 3.3
(2)檢驗疯淫,在三個節(jié)點上分別執(zhí)行命令zkServer.sh status地来,從下面的圖中我們會發(fā)現(xiàn)hadoop和hadoop1為Follower,hadoop0為Leader熙掺。
hadoop節(jié)點:如圖3.4
[站外圖片上傳中...(image-6ee562-1510797174100)]
圖 3.4
hadoop0節(jié)點:如圖3.5
[站外圖片上傳中...(image-6687ff-1510797174100)]
圖 3.5