為什麼使用Zookeeper?
大部分分布式應用需要一個主要、協調器或控制器來管理實體分布的子程序(如資源、任務配置設定等)
目前,大部分應用需要開發私有的協調程式,缺乏一個通用的機制
協調程式的反複編寫浪費,且難以形成通用、伸縮性好的協調器
ZooKeeper:提供通用的分布式鎖服務,用以協調分布式應用
Zookeeper能幫我們做什麼?
Hadoop2.0,使用Zookeeper的事件處理確定整個叢集隻有一個活躍的NameNode,存儲配置資訊等.
HBase,使用Zookeeper的事件處理確定整個叢集隻有一個HMaster,察覺HRegionServer聯機和當機,存儲通路控制清單等.
Zookeeper的特性
Zookeeper是簡單的
Zookeeper是富有表現力的
Zookeeper具有高可用性
Zookeeper采用松耦合互動方式
Zookeeper是一個資源庫
Zookeeper單機
單機模式:
1) 首先下載下傳zookeeper壓縮包
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz
2) 解壓縮
首先建立檔案夾,這裡放到/user/local/zk/cloud/檔案夾下
tar -zxvf zookeeper-3.4.8.tar.gz -C /user/local/zk/cloud/zookeeper1
tar -zxvf zookeeper-3.4.8.tar.gz -C /user/local/zk/cloud/zookeeper2
tar -zxvf zookeeper-3.4.8.tar.gz -C /user/local/zk/cloud/zookeeper3
3)運作單價環境
跳轉到對應目錄:cd /usr/local/zk/cloud/zookeeper1/conf
修改配置檔案名:mv zoo_sample.cfg zoo.cfg
跳轉到對應目錄:cd /usr/local/zk/cloud/zookeeper1/bin
啟動zookeeper :./zdServer.sh start
4) 使用java 用戶端連接配接ZooKeeper
跳轉到對應目錄:cd /usr/local/zk/cloud/zookeeper1/bin
啟動zookeeper用戶端 :./zkCli.sh -server 127.0.0.1:2181
啟動完成之後測試一下:
create /name “xiangping”
get /name :如果可以得到值就可以了
5) 關閉
跳轉到對應目錄:cd /usr/local/zk/cloud/zookeeper1/bin
關閉zookeeper :./zdServer.sh stop
Zookeeper叢集(單機中做叢集)
所謂 “僞分布式叢集” 就是在,在一台PC中,啟動多個ZooKeeper的執行個體。“完全分布式叢集” 是每台PC,啟動一個ZooKeeper執行個體。
ZooKeeper不存在明顯的master/slave關系,各個節點都是伺服器,leader挂了,會立馬從follower中選舉一個出來作為leader.
由于沒有主從關系,也不用配置SSH無密碼登入了,各個zk伺服器是自己啟動的,互相之間通過TCP端口來交換資料
建立環境目錄
1.切換到/usr/local/zk/cloud/路徑下,把解壓好的zookeeper複制三份,zookeeper1,zookeeper2,zookeeper3
2.建立三個myid檔案:
~ echo “1” > /usr/local/zk/cloud/zookeeper1/myid
~ echo “2” > /usr/local/zk/cloud/zookeeper2/myid
~ echo “3” > /usr/local/zk/cloud/zookeeper3/myid
注意:myid隻能為數字,因為我試驗了下,包含英文的話zk啟動不起來,抛出異常
3.修改配置檔案
vi /usr/local/zk/cloud/zookeeper1/conf/zoo.cfg
initLimit=10
syncLimit=5
dataDir=/usr/local/zk/cloud/data/zookeeper1
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
vi /usr/local/zk/cloud/zookeeper2/conf/zoo.cfg
initLimit=10
syncLimit=5
dataDir=/usr/local/zk/cloud/data/zookeeper2
clientPort=2182
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
vi /usr/local/zk/cloud/zookeeper3/conf/zoo.cfg
initLimit=10
syncLimit=5
dataDir=/usr/local/zk/cloud/data/zookeeper3
clientPort=2183
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
啟動每台機器
cd /usr/local/zk/cloud/
/zookeeper1/bin/zkServer.sh start
/zookeeper2/bin/zkServer.sh start
/zookeeper3/bin/zkServer.sh start
測試zookeeper叢集:
cd /usr/local/zk/cloud/
/zookeeper1/bin/zkCli.sh -server 127.0.0.1:2181
啟動完成之後:
create /name “xiangping”
cd /usr/local/zk/cloud/
/zookeeper2/bin/zkCli.sh -server 127.0.0.1:2182
啟動完成之後:
get /name : 如果可以得到—”xiangping”就ok了
cd /usr/local/zk/cloud/
/zookeeper3/bin/zkCli.sh -server 127.0.0.1:2183
啟動完成之後:
get /name : 如果可以得到—”xiangping”就ok了
zookeeper叢集(多台機器叢集)
我們使用三台機器搭建Zookeeper叢集
設定ip位址與機器名分别為:
192.168.100.104 zookeeper1
192.168.100.105 zookeeper2
192.168.100.106 zookeeper3
1、 修改機器IP 可以在網絡連接配接中直接使用滑鼠操作
2、 修改機器名vim /etc/sysconfig/network 修改如下配置:HOSTNAME=機器名稱,HOSTNAME=為你的機器名稱,三台機器分别設定為:zookeeper1、zookeeper2、zookeeper3
3、 修改機器名稱與IP位址對應關系:vim /etc/hosts
添加如下配置:
192.168.100.104 zookeeper1
192.168.100.105 zookeeper2
192.168.100.106 zookeeper3
4、 解壓下載下傳好的zookeeper-3.4.5.tar.gz
修改zoo.cfg檔案
dataDir=/usr/local/zk/cloud/zookeeper-3.4.5/data
在檔案中添加配置:
server.1=hadoop4:2888:3888
server.2=hadoop5:2888:3888
server.3=hadoop6:2888:3888
zook.cfg檔案内容如下:
# The number of milliseconds of each tick
tickTime=
# The number of ticks that the initial
# synchronization phase can take
initLimit=
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/zookeeper/data
# the port at which the clients will connect
clientPort=
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current
/zookeeperAdmin.html#sc_maintenance
#
# 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=zookeeper1::
server=zookeeper2::
server=zookeeper3::
1.tickTime:CS通信心跳時間
Zookeeper 伺服器之間或用戶端與伺服器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。tickTime以毫秒為機關。
tickTime=2000
2.initLimit:LF初始通信時限
叢集中的follower伺服器(F)與leader伺服器(L)之間初始連接配接時能容忍的最多心跳數(tickTime的數量)。
initLimit=5
3.syncLimit:LF同步通信時限
叢集中的follower伺服器與leader伺服器之間請求和應答之間能容忍的最多心跳數(tickTime的數量)。
syncLimit=2
4.dataDir:資料檔案目錄
Zookeeper儲存資料的目錄,預設情況下,Zookeeper将寫資料的日志檔案也儲存在這個目錄裡。
dataDir=/usr/zookeeper/data
5.clientPort:用戶端連接配接端口
用戶端連接配接 Zookeeper 伺服器的端口,Zookeeper 會監聽這個端口,接受用戶端的通路請求。
clientPort=2181
6.伺服器名稱與位址:叢集資訊(伺服器編号,伺服器位址,LF通信端口,選舉端口)
這個配置項的書寫格式比較特殊,規則如下:
server.N=YYY:A:B
server.1=zookeeper1:2888:3888
server.2=zookeeper2:2888:3888
server.3=zookeeper3:2888:3888
5、 建立myid檔案:在zoo.cfg中設定的dataDir對應的目錄中(/usr/local/zk/cloud/zookeeper-3.4.5/data)建立myid檔案
并添加如下内容:echo “N” > myid (N為唯一id(最友善可以寫機器名稱最後一位數字))
添加内容以後:touch myid
注意三台機器都要設定
6、 啟動zookeeper進入zookeeper-3.4.5的bin目錄:./zkServer.sh start 注意三台機器都要啟動
使用 ./zkServer.sh status 可以檢視狀态,三台機器中有一台會是leader狀态其它是follower狀态
7、 測試zookeeper
進入zookeeper-3.4.5的bin目錄:./zkCli.sh
建立一個檔案 create /name “xiangping”
使用另外一台機器登入zookeeper: ./zkCli.sh
get /name -如果能擷取到xiangping就可以了