what is Zookeeper?
1,開源的分布式的,為分布式應用提供協調服務的Apache項目
2,提供一個簡單原語集合,以便於分布式應用可以在它之上構建更高層次的同步服務
3,設計非常易於編程,它使用的是類似於文件系統那樣的樹形數據結構
4,目的就是將分布式服務不再需要由於協作沖突而另外實現的協作服務
Zookeeper service
Zookeeper 數據結構
數據結構和分等級的命名空間
Zookeeper的命名空間的結構和文件系統很相似。一個名字和文件一樣使用/ 的路勁表現。zookeeper的每個節點都是被路徑唯一標識
Zookeeper's Hierarchical Namespace
ZooKeeper 角色
Leader,learner,client
Leader:負責進行投票的發起和決議,更新系統狀態
learner又分為 follower , Observer
follower:用於接收客戶請求並向客戶端返回結果,在選主過程中參與投票
Observer:可以接收客戶端連接,將寫請求轉發給leader節點。但Observer 不參加投票過程,只同步leader的狀態。Observer的目的是為了擴展系統,提高讀取速度
client 請求發起方
ZooKeeper 典型的應用場景
ZoopKeeper 從設計模式角度來說,是一個基於觀察者模式的分布式服務管理框架,它負責存儲和管理大家都關心的數據。
然后接受觀察者的注冊,一旦這些數據的狀態發生改變,Zookeeper就將負責通知已經在Zookeeper上注冊的哪些觀察者做出相應的反應,從而實現集群中類似Master/Slave的管理模式
應用場景
*統一命名服務(Name Service)
*配置管理(Configuration Management)
*集群管理(Group Membership)
*共享鎖(Locks)/同步鎖
Zookeeper 單機模式安裝
1, java 框架,需要下載安裝配置JDK
2,Zookeeper 官網下載Zookeeper,解壓,賦權
3,在Zookeeper 的安裝目錄文件下,創建保存數據的目錄,默認情況,寫數據的日志文件也保存在這個目錄里面
mkdir -p data/zkData
4,重命名配置文件
安裝目錄下conf 文件夾下,有個zoo_sample.cfg,重命名為zoo.cfg,並且修改dataDir 的路徑
#zookeeper 保存數據的目錄,默認情況,寫數據的日志文件也保存在這個目錄里面
dataDir=/opt/modules/zookeeper-3.4.14/data/zkData
5,啟動
bin/zkServer.sh start
bin/zkServer.sh status 查看狀態 standalone
6, bin/zkCi.sh 進入客戶端模式,任意鍵,進入命令提醒
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
Zookeeper 分布式配置
1,修改zoo.cfg,修改文件存儲路徑
dataDir=/opt/app/zookeeper-3.4.14/data/zkData
2,添加集群
############################cluster###################
server.1=hella-hadoop.chris.com:2888:3888
server.2=hella-hadoop02.chris.com:2888:3888
server.3=hella-hadoop03.chris.com:2888:3888
server.A=B:C:D :A是一個數字,表示是第幾號服務器;B是這個服務器的ip地址;C表示這個服務器與集群中的Leader服務器交換信息的端口;
D表示的是萬一集群中的Leader 服務器掛了,需要用一個端口來重新進行選舉,選出一個新的Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。
如果是偽集群的配置方式,由於B都是一樣,所以不同的Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。
集群模式下配置一個文件myid,這個文件在dataDir 目錄下,這個文件里面就有一個數據就是A 的值,Zookeeper 啟動的時候就會讀取此文件,拿到里面的數據與zoo.fcg里面的配置信息比較從而判斷到底是那個server
3,在/opt/app/zookeeper-3.4.14/data/zkData 目錄下創建文件myid
不同的機器寫入不同的id,和server.1,server.2,server.3相對應
4,分發至不同機器
scp -r zookeeper-3.4.14/ chris@hella-hadoop02.chris.com:/opt/app/
scp -r zookeeper-3.4.14/ chris@hella-hadoop03.chris.com:/opt/app/
並且修改myid
5,分別啟動zookeeper service
bin/zkServer.sh start
bin/zkServer.sh status 查看狀態 mode : leader 或者 follower
zoo.cfg 一些參數的意義
# The number of milliseconds of each tick #客戶段與服務器維持心跳的時間《zookeeper》 tickTime=2000 # The number of ticks that the initial # synchronization phase can take #initLimit 是用來配置Zookeeper接收客戶端(不是用戶連接Zookeeper服務器的客戶端, #而是Zookeeper服務器集群中連接到leader的follower服務器)初始化連接時最長能夠忍 #受多少個心跳時間間隔數,當超過10個心跳的時間(tickTime)長度之后,zookeeper服 #務器還沒收到客戶端的返回信息,表明這個客戶端連接失敗,總的時間長度就是5*2000=10秒 initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement #syncLimit 表明了Leader 和 Follower 之間發送消息,請求和應答時間長度,最長 #不能超過多少個tickTime的時間長度,總的時間長度就是2*2000=4秒 syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. #zookeeper 保存數據的目錄,默認情況,寫數據的日志文件也保存在這個目錄里面 dataDir=/opt/modules/zookeeper-3.4.14/data/zkData # the port at which the clients will connect #客戶端連接zookeeper服務器的端口,zookeeper會監聽這個端口,接受客戶端的訪問請求 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. # # 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