一、集群模式
1、單機模式
在zoo.cfg中只配置一個server.id就是單機模式了。
這種模式下,如果當前主機宕機,那么所有依賴於當前zookeeper服務工作的其他服務器都不能在進行正常工作,這種事件稱為單節點故障。所以這種模式一般用在測試環境。
2、偽分布式
在zoo.cfg中配置多個server.id,其中ip都是當前機器,而端口各不相同,啟動時就是偽集群模式了。
這種模式和單機模式產生的問題是一樣的。這種模式也是用在測試環境中。
3、完全分布式
多台機器各自配置zoo.cfg文件,將各自互相加入服務器列表,上面搭建的集群就是這種完全分布式。
這種模式是真實生產環境中使用的zookeeper集群模式。
二、zookeeper完全分布式集群的搭建
搭建zookeeper集群需要最少三台機器,需要安裝jdk作為基礎支持。此次使用的Zookeeper3.4.7版本。
1、准備虛擬機
准備三台虛擬機,將ip和端口規划好。這里最好將主機名,以及主機名和ip的映射關系配置到/etc/hosts內
vim /etc/hosts # 填入以下內容,如果之前已經添加過,則忽略此操作 127.0.0.1 localhost ::1 localhost 192.168.234.21 spark01 192.168.234.22 spark02 192.168.234.23 spark03
2、安裝jdk
如果已經安裝,則忽略
1、將jdk安裝包上傳、解壓安裝包,並更名,命令如下:
tar -zxvf jdk1.8.0_131.tar.gz -C /data/aicu-tob/software/
2、修改/etc/profile, 在文件行尾加入以下內容后保存退出。
export JAVA_HOME=/data/aicu-tob/software/jdk1.8.0_131
export PATH=$PATH:$JAVA_HOME/bin
3、搭建集群
3.1.下載安裝包
下載zookeeper的安裝包,下載地址:http://zookeeper.apache.org/ 上傳到linux集群環境下,規划自己的管理目錄,解壓安裝包。
mkdir -p /data/aicu-tob/software tar -zxvf zookeeper-3.4.10.tar.gz -C /data/aicu-tob/software
3.2.集群配置
3.2.1 修改配置文件zoo.cfg
# 進入conf目錄,復制zoo-sample.cfg重命名為zoo.cfg,通過修改zoo.cfg來對zookeeper進行配置。這個名字固定寫死,因為zookeeper啟動會檢查這個文件,根據這個配置文件里的信息來啟動服務。 cd /data/aicu-tob/software/zookeeper-3.4.10/conf cp zoo-sample.cfg zoo.cfg # vim zoo.cfg,此文件中需要修改以下兩處: 1、dataDir:指定zookeeper將數據保存在哪個目錄下,如果不修改,默認在/tmp下,這個目錄下的數據有可能會在磁盤空間不足或服務器重啟時自動被linux清理,所以一定要修改這個地址。按個人習慣將其修改為自己的管理目錄。 dataDir=/data/aicu-tob/software/zookeeper-3.4.10/data dataLogDir=/data/aicu-tob/software/zookeeper-3.4.10/logs 2、完全分布式:多台機器各自配置,zookeeper有幾個節點,就配置幾個server。例如本文宗總共三台主機,於是在配置文件末尾加上下面三行,可以填寫ip也可以是/etc/hosts的主機名,建議后者,可以充分解耦 server.1=spart01:2888:3888 server.2=spart02:2888:3888 server.3=spart03:2888:3888 # 注意:一定要跟自己的myid配置對應上,否則集群一直處於非正常狀態 myid文件中就是N,則對應zoo.cfg 中server.{N} ,關於myid配置,見下一小節 zookeeper服務默認的端口號為2888和3888,2888原子廣播端口,3888選舉端口,
3.2.2 myid
到dataDir指定目錄下生成一個文件叫myid(必須叫這個名字),其中寫上一個數字表明當前機器是哪一個編號的機器,注意:本機的myid內容一定要與server.{N}保持一致
# 在spart01主機 vim myid 1
3.2.3.拷貝
#將以上Zookeeper文件夾遠程拷貝到另外兩台服務器中: scp -r /data/aicu-tob/software/zookeeper-3.4.10 root@spart02 scp -r /data/aicu-tob/software/zookeeper-3.4.10 root@spart03 #然后修改另外兩台服務器中的myid文件中的id即可。 #spart02 vim myid 2 #spart03 vim myid 3
4、啟動zookeeper
啟動zookeeper的各種命令操作如下,可以使用絕對路徑操作這些命令,也可使用相對路徑操作這些命令,相對路徑需要進到zookeeper服務的bin目錄進行操作
#啟動ZK服務,Zookeeper集群需要每台挨個啟動。 bin/zkServer.sh start #停止ZK服務: bin/zkServer.sh stop #重啟ZK服務: bin/zkServer.sh restart #查看ZK服務狀態: bin/zkServer.sh status # 依次查看三台主機,會發現某一台被選舉為leader,其余兩台為follower 也可以是用jps命令查看線程
啟動集群的時候,集群數量啟動沒有超過一半,狀態會有錯誤提示,當集群啟動數量超過一半就會自動轉為正常狀態,並且此台使集群進入正常工作狀態的服務器會成為leader角色,集群中其他服務器的角色為fllower。 Zookeeper集群模式搭建到此完成。
5、測試zookeeper
5.1 在Zookeeper上測試數據同步
在spart01上操作:
# 1、切換目錄 cd /data/aicu-tob/software/zookeeper-3.4.10 # 2、客戶登陸, ./bin/zkCli.sh 注意zoo.cfg如果修改了clientPort,例如clientPort=8131,那么此處需要指定參數 ./bin/zkCli.sh -server localhost:8131 # 本實驗是登陸本機操作,當然localhost也可以是其他zk主機 WatchedEvent state:SyncConnected type:None path:null [zk: localhost:2181(CONNECTED) 0] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 1] get /zookeeper cZxid = 0x0 ctime = Thu Jan 01 08:00:00 CST 1970 mZxid = 0x0 mtime = Thu Jan 01 08:00:00 CST 1970 pZxid = 0x0 cversion = -1 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 0 numChildren = 1 [zk: localhost:2181(CONNECTED) 3] create /hadoop123 123 //創建一個hadoop123文件並且值為:123 Created /hadoop123 [zk: localhost:2181(CONNECTED) 4] ls / #查看是否創建好了 [hadoop123, zookeeper] [zk: localhost:2181(CONNECTED) 5] get /hadoop123 #獲取文件的值 123 cZxid = 0x200000002 ctime = Fri Mar 25 09:54:20 CST 2016 mZxid = 0x200000002 mtime = Fri Mar 25 09:54:20 CST 2016 pZxid = 0x200000002 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 0 [zk: localhost:2181(CONNECTED) 6]
在spart02和spart03上查看在sparrk01上創建文件是否同步過來:
./bin/zkCli.sh -server localhost:8131 [zk: localhost:2181(CONNECTED) 0] ls / #顯示hadoop123同步過來了 [hadoop123, zookeeper] [zk: localhost:2181(CONNECTED) 1] get /hadoop123 #獲取hadoop123文件內容 123 cZxid = 0x200000002 ctime = Fri Mar 25 09:54:20 CST 2016 mZxid = 0x200000002 mtime = Fri Mar 25 09:54:20 CST 2016 pZxid = 0x200000002 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 0 [zk: localhost:2181(CONNECTED) 2]
5.2 測試Zookeeper故障角色轉移
所先查看spark01、spark02、spark03上角色狀態
然后把leader干掉,然后會發現選舉出一個新的leader,如果重啟掛掉的zk,它會變成follower
