Zookeeper系列一:Zookeeper介紹、Zookeeper安裝配置、ZK Shell的使用

1、Zookeeper介紹

1. 介紹Zookeeper以前先來介紹一下分佈式

1.1 分佈式主要是下面兩個方面:

1) 任務拆分java

  任務拆分指的是把傳統的單節點服務拆分紅多個節點服務部署到不一樣的機器上對外提供服務。好比一個傳統服務有訂單+支付+物流等3個模塊,拆分紅訂單系統、支付系統、物流系統3個服務。
2) 節點分工node

  如上面的服務拆分後,訂單系統、支付系統、物流系統各司其職
說明:apache

分佈式解決高可用,高併發的。vim

集羣解決的是高可用。服務器

集羣從物理上來定義,分佈式一種工做方式。
例如:一個工做任務須要10個小時(單節點)
分佈式:10臺機器,任務只須要1個小時就可以完成
集羣:10臺機器,任務仍是10個小時。網絡

1.2 分佈式協做中的難點:

若是讓你設計一個分佈式系統,你預見到什麼問題?
1) 保證節點高可用(節點故障)
2) 數據的一致性
3) 通信異常
4) 網絡分區
.......session

2.  Zookeeper簡介

Zookeeper就是用來解決分佈式協做中的難點的併發

zookeeper是google的chubby項目開源實現。最先是hadoop的子項目分佈式

Zookeeper的使用場景:高併發

小米米聊、淘寶Taokeeper實際上是類zookeeper。

Kafka使用zookeeper。消息發佈訂閱,其中zk就是用於檢測節點崩潰。實現主題的發現,而且保持主題的生產和消費狀態。

Hbase三段查找,Root-Region=》Meta Region=》Region(Table)。hbase的元數據信息放在HBase。HMaster掛掉,立刻要節點恢復。
Hadoop。NameNode(SecondaryNameNode),HA Hadoop。通常狀況下一個簡單的hadoop集羣,只有一個NameNode,若是NameNode掛掉,hadoop集羣不可用。HA Haoop裏面就要用到zk。

3. Zookeeper解決哪些問題

3.1 Master節點管理

  解決的問題:Master高可用(掛掉之後,誰來負責工做),保證惟一。

3.2 配置文件管理

  解決的問題:統一把配置文件存放zk,由ZK統一分發修改的內容到各臺機器。

3.3 發佈與訂閱

  發佈者(producer)將數據發佈到zk節點上,供訂閱者(consumer)動態獲取

3.4 分佈式鎖

  分佈式環境訪問同一個資源,由第三方配鎖實現。
  解決的問題:由zk統一進行協調,保證數據的一致性。

3.5 集羣的管理

  Worker集羣監控。保證主數據和備份數據的一致

2、Zookeeper安裝配置

環境準備:

一臺安裝有jdk的虛擬機:192.168.152.130

1. 安裝

1.1.下載

cd /software
 wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

1.2.解壓

tar -zxvf zookeeper-3.4.6.tar.gz

2. 配置

說明:這裏配置的是僞分佈式的zookeeper

注意:配置以前必定要在/etc/hosts裏面配置主機映射,不然會報錯誤:

ERROR [master:3890:QuorumCnxManager$Listener@517] - Exception while listening
java.net.SocketException: Unresolved address

vim /etc/hosts

2.1 先創建zookeeper的三個數據目錄

mkdir -p /zookeeper/zk1
mkdir -p /zookeeper/zk2
mkdir -p /zookeeper/zk3

2.2 查看zookeeper的配置文件(已刪掉多餘的配置和註釋)

vim zoo_sample.cfg
tickTime=2000   #session的會話時間 以ms爲單位
initLimit=10      #服務器啓動之後,master和slave通信的時間
syncLimit=5       #master和slave之間的心跳檢測時間,檢測slave是否存活
dataDir=/tmp/zookeeper  #保存zk的快照和數據
clientPort=2181      #客戶端訪問zk的端口

2.3 複製zoo_sample.cfg爲zoo1.cfg添加以下配置

cp zoo_sample.cfg zoo1.cfg
vim zoo1.cfg

配置:

#session的會話時間 以ms爲單位
tickTime=2000

#服務器啓動之後,master和slave通信的時間
initLimit=10

#master和slave之間的心跳檢測時間,檢測slave是否存活
syncLimit=5

#(這個目錄能夠自行指定)
dataDir=/zookeeper/zk1

#客戶端訪問zk的端口
clientPort=2181
#master對應於前面在hosts裏面配置的主機映射 2888是數據同步和消息傳遞端口,3888是選舉端口 server.1=master:2888:3888 #master對應於前面在hosts裏面配置的主機映射 2889是數據同步和消息傳遞端口,3889是選舉端口 
server.2=master:2889:3889

#
master對應於前面在hosts裏面配置的主機映射 2890是數據同步和消息傳遞端口,3890是選舉端口
server.3=master:2890:3890
 

2.4 複製zoo1.cfg爲zoo2.cfg添加以下配置

cp zoo1.cfg zoo2.cfg
vim zoo2.cfg
#session的會話時間 以ms爲單位
tickTime=2000

#服務器啓動之後,master和slave通信的時間
initLimit=10

#master和slave之間的心跳檢測時間,檢測slave是否存活
syncLimit=5

#(這個目錄能夠自行指定)
dataDir=/zookeeper/zk2

#客戶端訪問zk的端口
clientPort=2182

#master對應於前面在hosts裏面配置的主機映射 2888是數據同步和消息傳遞端口,3888是選舉端口 server.1=master:2888:3888 #master對應於前面在hosts裏面配置的主機映射 2889是數據同步和消息傳遞端口,3889是選舉端口 
server.2=master:2889:3889

#
master對應於前面在hosts裏面配置的主機映射 2890是數據同步和消息傳遞端口,3890是選舉端口
server.3=master:2890:3890

 2.5 複製zoo1.cfg爲zoo3.cfg添加以下配置

cp zoo1.cfg zoo3.cfg
vim zoo3.cfg
#session的會話時間 以ms爲單位
tickTime=2000

#服務器啓動之後,master和slave通信的時間
initLimit=10

#master和slave之間的心跳檢測時間,檢測slave是否存活
syncLimit=5

#(這個目錄能夠自行指定)
dataDir=/zookeeper/zk3

#客戶端訪問zk的端口
clientPort=2183
#master對應於前面在hosts裏面配置的主機映射 2888是數據同步和消息傳遞端口,3888是選舉端口 server.1=master:2888:3888 #master對應於前面在hosts裏面配置的主機映射 2889是數據同步和消息傳遞端口,3889是選舉端口 
server.2=master:2889:3889

#
master對應於前面在hosts裏面配置的主機映射 2890是數據同步和消息傳遞端口,3890是選舉端口
server.3=master:2890:3890

2.6 手動創建myid文件且指定在zk數據目錄,也就是dataDir指定的路徑(無論真分佈仍是僞分佈都須要指定) 

echo 1 >> /zookeeper/zk1/myid
echo 2 >> /zookeeper/zk2/myid
echo 3 >> /zookeeper/zk3/myid

 說明:

myid文件內容分別爲1,2,3對應於zk配置文件的server.1,server.2,server.3

2.7 測試zookeeper分佈式是否搭建成功

分別啓動三個zookeeper

cd /software/zookeeper-3.4.6/bin/
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo1.cfg
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo2.cfg
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo3.cfg

查看3個zookeeper的狀態

cd /software/zookeeper-3.4.6/bin/
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo1.cfg
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo2.cfg
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo3.cfg

 

能夠看到第2個zookeeper是leader,第1個和第3個爲follower,到此zookeeper分佈式搭建完成!!!

2.8 Zookeeper經常使用命令 

啓動:
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo1.cfg
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo2.cfg
./zkServer.sh start /software/zookeeper-3.4.6/conf/zoo3.cfg

中止:
./zkServer.sh stop /software/zookeeper-3.4.6/conf/zoo1.cfg
./zkServer.sh stop /software/zookeeper-3.4.6/conf/zoo2.cfg
./zkServer.sh stop /software/zookeeper-3.4.6/conf/zoo3.cfg

查看狀態:
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo1.cfg
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo2.cfg
/zkServer.sh status /software/zookeeper-3.4.6/conf/zoo3.cfg

2.9 Zookeeper真分佈式部署在master、slave一、slave2 三臺不一樣的服務器上

 server1..../conf/zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper/zk
clientPort=2181

server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

 server2..../conf/zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper/zk
clientPort=2181

server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

server3..../conf/zoo.cfg

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper/zk
clientPort=2181

server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888

注意:

真分佈必須是奇數臺,由於必須知足n/2+1=m,m必須大於部署zk機器數的一半(n/2)可用才認爲集羣可用,並且奇數臺更節省資源
2/2+1=2 一臺不能壞
3/2+1=2 能夠壞掉一臺

4/2+1=3 只能壞一臺
5/2+1=3 能夠壞2臺

3、ZK Shell的使用

1. 鏈接zk

zkCli.sh [-server ip:port]

示例:

鏈接到master(127.0.0.1 master)這臺機器上2181的zookeeper

./zkCli.sh -server master 2181

2. 列出zk中的節點

ls、ls2

 示例:

 

3. 建立節點

create [-s] [-e] path data acl

說明:

zk的節點分爲兩種:臨時節點(隨着zk session消亡而自動刪除)、持久節點(一直存在)

-s: 順序節點

-e: 臨時節點

acl:訪問權限控制

示例:

3.1 建立一個zk-test的節點,數據是123 不帶-s 、-e默認是持久節點

create /zk-test "123"

3.2 建立順序節點

create  -s   /zk-test  「test123」

 

 屢次執行建立順序節點的命令,能夠看到zookeeper的內部會對順序節點的名稱進行自增控制

 

3.3 建立臨時節點

create -e /zk-test123 "test1234"

 

說明:

臨時節點依賴於順序節點,臨時節點下不能再建立臨時節點,順序節點下才能夠建立臨時節點

3.4 建立子節點test

create  /zk-test ""
create  /zk-test/test "1"
ls /zk-test/test

4. 刪除節點命令

delete 

示例:

刪除節點zk-test,若是zk-test下面還有子節點得先刪除子節點,才能刪除zk-test

delete /zk-test/test
delete /zk-test

 遞歸刪除一個znode

rmr path 

示例:

刪除zk-test及其下面的子節點

rmr  /zk-test

5. 獲取節點信息

get

 示例:

create /zk-123  「abc」
get /zk-123

結果說明:

結果
cZxid = #建立節點時zk內部本身分配的id
Ctime = #建立節點的時間
mZxid = #修改的id
mtime = 修改的時間
pZxid = 子節點最後一次被修改的id
cVersion = 0  #擁有的子節點被改的話,該值隨着改變
dataVersion = 0 #數據版本
aclVersion = 0 # 訪問控制權限的版本
ephemeralOwner = 0X0 #臨時節點仍是持久節點 臨時節點值不爲0(值爲當前會話id),持久節點值永遠爲0
dataLength = 3 #數據長度
numChildren = 0 #子節點個數

6. 更新節點數據

set  /zk-123 「d」

 

7. 鏈接到指定節點

connect host:port

 示例:

鏈接到2181
connect master:2181

鏈接到2182
connect master:2182

鏈接到2183
connect master:2183

說明:

這個命令是在已經鏈接到zookeeper以後,在裏面切換到其餘zookeeper時使用 

 

8. 設置配額

配額:給某個目錄指定多少存儲空間或者容許建立多少個節點

setquota -n|-b val path

參數說明:

n 指定能夠設置多少個子節點

b 指定能夠設置多大空間(byte)

示例:

setquota -n 5 /zk-123
create  /zk-123/1 1
create  /zk-123/2 2
create  /zk-123/3 3
create  /zk-123/4 4 
create  /zk-123/5 5 
create  /zk-123/6 6

說明:

對於配額不是硬性的提示,超過配額仍是能夠繼續建立,只不過在日誌裏面有提示

配額的用途:

限制子節點的建立個數和分配空間的大小,如指定某個session有多少空間能夠用

9. 查看配額

listquota path

10. 查看節點的狀態

stat path

示例:

查看節點zk-123的狀態

stat  /zk-123

相關文章
相關標籤/搜索