1. 程式人生 > >zookeeper簡介及安裝

zookeeper簡介及安裝

get image html 官網 進一步 ima enc 成員 nco

1. Zookeeper簡介
  • 1.1 概念
    zookeeper是一個維護配置信息、命名、提供分布式同步的集中式服務(也就是說主要用於分布式應用程序中)。它是一個分布式的協調服務。集群中節點個數最少是3個(必須為奇數個),同時集群是一致性的。
  • 1.2 作用
    zookeeper目的是將各種服務的復雜的核心功能封裝,形成一個個簡單的接口(對外提供服務),同時統一協調這些服務。
    功能:命名服務、配置管理、集群管理、分布式鎖、隊列管理
    優點:客戶端發起事務請求,請求的結果在整個Zookeeper集群中所有機器上的應用情況是一致的,同時zookeeper能夠保證客戶端請求的順序,每個請求zookeeper都會分配一個全局的且唯一的遞增編號,此編號反映了事務操作的先後順序。zookeeper將全量數據保存在內存中,並直接服務於所有的非事務請求,其中以讀的操作場景性能非常優秀。
  • 1.3 應用場景
    主要用於Hadoop、Storm、消息中間件、RPC服務框架、分布式數據庫同步系統,不適合存儲大量的數據,存儲key-value值
    1.4 etcd內部解剖
    使用的是zab協議,與raft協議很相似
    C/S架構,它由兩種語言寫的C+JAVA。
    zookeeper很像一個文件系統,zookeeper中的的每個znode都是一個路徑,同時很多znodes共享一個name space,name space 更像一個獨立的文件系統。znode都有一個父節點(最高為/,說白了類似於文件系統),同時如果這個znode有子節點那麽這個znode是不能被刪除的。但是它又不同於文件系統,每個znode都可以是目錄並且它存儲的數據是有限的。znode用於存儲協調數據(狀態信息、配置信息、位置信息等等),這些數據通常來以kilobyte為單位,所以很小,zookeeper會有內置的1M健康檢查,防止一個大的數據存儲進來。
    數據模型:
    技術分享圖片

架構模型:
技術分享圖片

zookeeper集群中,會自動復制到集群中的每個節點,是數據保持一致。同時數據保留在內存中,所以有很低的延遲和高吞吐量,zookeeper的數據庫的大小受宿主機的內存大小的限制,從而會限制znode的數量。
客戶端連接zookeeper服務,必須知道zookeeper服務的列表(ip list),客戶端只會連接一個zookeeper服務,當該服務掛了,就會找zookeeper服務列表裏的其他地址並連接。
讀請求---發送到客戶端連接的zookeeper服務,而寫請求會發送到所有的zookeeper服務,然後在這個寫請求在完成集群中協商一致性後才會有回應客戶端的行為。這裏就體現了讀和寫的區別了,這種情況導致讀取請求的吞吐量與服務器的數量成比例,寫入請求的吞吐量隨著服務器的數量增加而減少。

在zookeeper中順序是非常重要的,響應的執行的順序是強制的。它用的是一個唯一的zxid(ZooKeeper Transaction Id)來標記每一個請求,

2. Zookeeper安裝

系統要求
技術分享圖片
軟件要求:
zookeeper運行於Java環境下,需要JDK1.6及以上。3個節點是最小的(奇數個),但是生產環境中最好使用5個,同時最好不要將這5臺放到同一個交換機下,防止交換機宕機導致集群全部失效,以集群的形式運行,硬件要求2cpu/2G/80硬盤即可滿足需求。
這裏以集群形式講解(以三個節點為例)
下載地址:
jdk: http://java.sun.com/javase/downloads/index.jsp
zookeeper: https://www.apache.org/dyn/closer.cgi/zookeeper/
當然可以選擇就近的鏡像站下載zookeeper:http://mirror.bit.edu.cn/apache/zookeeper/
wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
tar xf zookeeper-3.4.12.tar.gz -C /data/
cd /data/
ln -s zookeeper-3.4.12 zookeeper
至此安裝完畢。

  • 2.1.1簡單配置文件講解:
    zookeeper有一個最小配置zoo_sample.cfg,這個一般就是最小配置。如下:

    [root@node1 conf]# grep -v ^# zoo_sample.cfg 
    tickTime=2000    #以ms為單位,心跳和超時時間。
    initLimit=10
    syncLimit=5
    dataDir=/tmp/zookeeper  #zookeeper存儲數據庫快照地方及事務日誌,生產中日誌最好別再此處。
    clientPort=2181    #客戶端連接的端口
  • 2.1.2 高級參數:
    以下參數是可選的,當然以下的有些參數可以在java系統屬性中設置,一般是zookeeper.keyword這種形式。
    dataLogDir #將zookeeper的事物日誌直接寫到這個目錄下而不是dataDir,生產中有條件最好是可以將日誌和快照分別存儲,日誌放到不繁忙的設備上(性能好的專有的設備)

globalOutstandingLimit (Java system property: zookeeper.globalOutstandingLimit.)
默認是1000的限制,它的作用主要是防止高並發場景zookeeper處理不了過多的客戶端連接,從而導致超出系統內存,進一步導致zookeeper異常。
preAllocSize (Java system property: zookeeper.preAllocSize)
默認block 大小為64M,如果快照頻繁,那麽需要調整該值,降低一些。
snapCount (Java system property: zookeeper.snapCount)
我們知道zookeeper使用的是snapshot和事務日誌來進行記錄事務的。在一次快照前,snapCount決定了多少次事務記錄到事務日誌中。
maxClientCnxns
最大連接數量,說白了就是防止Ddos×××用,默認是60,如果設置為0表示不限制。
minSessionTimeout
默認是 tickTime的2倍
maxSessionTimeout
默認是 tickTime的20倍
fsync.warningthresholdms (Java system property: zookeeper.fsync.warningthresholdms)
如果事務日誌在寫入日誌時調用fsync函數,如果超過此值會在日誌中顯示警告的信息。默認是1000ms,這個值最好設置為系統的時間。
autopurge.purgeInterval
自動清理日誌和快照的功能,默認是不開啟的,適用於3.4版本,指定清理頻率,單位是小時,默認是0,表示不清理。
autopurge.snapRetainCount
適用於3.4版本,當前面的開啟後,那麽zookeeper會保留多少文件來進行清除多余的快照和日誌。默認是3,最小也是3
syncEnabled (Java system property: zookeeper.observer.syncEnabled)
默認開啟,為了降低觀察者從故障中恢復的時間。

  • 2.1.3 集群的參數:
    electionAlg
    它的值:0、1、2、3,其中0表示,默認是3,官網表示0、1、2將會在未來的版本取消。這個參數涉及的是選舉基於哪個版本。
    initLimit
    跟ticktime有關,當集群中數據量變大時,最好調高該值(因為從的數量多了,leader同步數據時,時間會加長)
    leaderServes (Java system property: zookeeper.leaderServes)
    想讓Leader專註於集群中機器的協調,那麽可以將這個參數設置為no,默認情況下是leader可以接受client的連接,如果設置為no,這樣的leader會只負責集群中機器的調度,這樣會大大提高集群的讀寫能力,它不會接受client的連接。生產環境中不建議設置為no
    server.x=[hostname]:nnnnn[:nnnnn], etc
    這裏的x是一個數字,與myid文件中的id是一致的。右邊可以配置兩個端口,第一個端口用於F和L之間的數據同步和其它通信,第二個端口用於Leader選舉過程中投票通信。
    syncLimit
    同步時間,tickTime,允許F和L同步數據的時間,如果F過於落後,集群會將失敗。
    group.x=nnnnn[:nnnnn]
    對機器分組
    weight.x=nnnnn
    權重設置
    cnxTimeout
    默認是5s,leader選舉的超時時間。
    4lw.commands.whitelist
    命令的白名單,沒有在的會禁止。4lw.commands.whitelist=stat, ruok, conf, isro
    ipReachableTimeout (Java system property: zookeeper.ipReachableTimeout)
    ms為單位,ip到達的超時時間,
    tcpKeepAlive (Java system property: zookeeper.tcpKeepAlive)
    說白了就是集群中成員之間tcp的 keepalived。這個值是在操作系統層面的,首先設置操作系統,然後在設置這裏為true。但是NAT網絡和防火墻可能會終止這裏tpc連接。默認是false
  • 2.1.4 集群間的認證和授權參數
    zookeeper.DigestAuthenticationProvider.superDigest
    (Java system property only: zookeeper.DigestAuthenticationProvider.superDigest)
    默認是關閉的。
    這個是權限控制及認證控制。
  • 2.1.5 生產測試的配置及啟動:
    zoo.cfg配置文件如下:
    [root@node2 conf]# cat zoo.cfg 
    tickTime=2000
    initLimit=5
    syncLimit=2
    dataDir=/data/zookeeper/data
    clientPort=2181
    server.1=node1:2888:3888
    server.2=node2:2888:3888
    server.3=node3:2888:3888

註意:server.myid=host:port1:port2中,myid必須是唯一的,取值範圍為1-255
配置全局變量jdk及zookeeper:

[root@node3 data]# tail -n 4 /etc/profile
export JAVA_HOME=/data/jdk
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export ZOOKEEPER_HOME=/data/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
source /etc/profile

啟動:zkServer.sh start
查看狀態:zkServer.sh status
技術分享圖片
寫入數據並讀取:
任意個節點:
執行zkCli.sh 我們看到連接的是本地的2181端口
技術分享圖片
在其他節點也能查到該值。也就是說集群沒有問題。
遞歸刪除子節點
技術分享圖片
參考文章:
https://zookeeper.apache.org/
https://cwiki.apache.org/confluence/display/ZOOKEEPER/ProjectDescription
https://zookeeper.apache.org/doc/current/zookeeperAdmin.html

zookeeper簡介及安裝