理解Zookeeper(二):Zookeeper安裝和運行


安裝環境:

CentOS 7   內存1GB

JDK版本:1.8.0_112

為JDK配置如下環境變量:

編輯/etc/profile.d/jdk.sh

#!/bin/bash
 
JAVA_HOME=/usr/local/jdk1.8.0_112
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

之后運行下面的命令:

ec5b373c7d6f237ca56d4185af66d844.png

注意:在生產環境中為了避免內存頻繁的換進換出,建議將JAVA堆大小設置的更大一點,這取決於你的物理內存大小。

關於集群可用:如果能忍受N台ZK宕機,那么你的集群就需要有2N+1台ZK服務器。3台組成的集群則允許1台失敗,5台組成的集群則允許2台失敗。集群中ZK數量要保持奇數,當然偶數也可以,只是3台組成的ZK和4台組成的允許失敗的台數是一樣的。

單機安裝

下載穩定版zookeeper,我這里使用的是3.4.11,我把它解壓在了/usr/local下面,其實任何路徑都可以

配置ZK的環境變量,編輯/etc/profile.d/zk.sh文件

#!/bin/bash
 
ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.11
export PATH=$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf:$PATH

執行下面的命令

3677679982d635b2dbe29da6439dcd65.png

准備配置文件

bda64edd44b8ff198cc1e687554f732a.png

在程序目錄中的conf目錄中創建zoo.cfg配置文件,zoo_sample.cfg是模板文件,直接復制一下修改名稱,然后再修改里面的內容。

d6e2e81d610319f800fb84887db20450.png

這個配置文件可以設置很多參數,默認只有最基本的。其他參數后面再說

參數 說明
tickTime 基本事件單元,單位毫秒。用來設置心跳,最小的session過期時間為tickTime的兩倍,ZK中的其他時間都是以這個為倍數的。
dataDir

存儲內存中數據庫快照的位置,默認是/tmp/zookeeper,這個只是例子,我們修改為ZK家目錄下的data,這個data其實也沒有,我們需要手動建立。快照文件並不是實時的,運行一段時間才會有。

dataLogDir

日志路徑,也就是事務日志。我們知道對ZK的讀和寫都是在內存中完成,所以速度非常快,但是如果停止ZK再啟動數據還是需要保證的,所以就會有這樣一個路徑用來保存事務日志,當ZK再次啟動時加載到內存重演過程來恢復數據。這個目錄會有一個叫做version-2的目錄,這個目錄確定了當前事務日志的版本號,當下次某個版本的ZK對其進行修改時,版本號發生變化。日志文件大小為64M,如果數據比較多就會有多個這樣大小的文件。

建議將事物日志保存到單獨的磁盤而且是高速磁盤。因為為了一致性,ZK對於客戶端的寫入請求在返回之前就要把本次操作寫入到事物日志中。logDir

logDir zookeeper服務的日志路徑
clientPort 監聽客戶端連接的端口

修改一下zkEnv.sh腳本,zk啟動后會有一個zookeeper.out文件,這個文件隨着時間會越來越大,默認會在執行zkServer.sh的位置生成,所以我們要修改為指定路徑。

0451561500e0ff06f6bb9f4aa932953c.png

配置好上面的設置就可以啟動了。

95b11b89570a001db7bb7240017d1fa3.png

測試連接

2c7a28a0d03eca00d92f467b5e128b6b.png

nc是網絡命令,全稱是netcat,其實使用telnet也一樣

21196e8d73c4999a4b914fb5d52d5124.png

ZK客戶端

zkCli.sh -server IP:PORT

也可以不輸入IP和端口,默認就會連接127.0.0.1:2181

3cdc92bab76946dc4743674b4afe7d5a.png

查看事務日志:

java -classpath /usr/local/zookeeper-3.4.11/zookeeper-3.4.11.jar:../../lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.LogFormatter log.1

Snip20171125_112.png

集群安裝

集群配置和單機安裝一樣,只是配置文件內容會多一部分內容,內容如下:

7a2986e44948a7985fcdbc9c9c7c7360.png

"server.id=host:port:port" 表示不同ZK服務器的配置。id表示不同服務器 

host 主機名稱或者IP地址
第一個port 群中從服務器(follower)連接到主服務器(leader)的端口,也就是作為leader時使用的,其他從服務器都連接到主服務器的這個端口
第二個port 進行leader選舉時使用的端口

 

 

 

集群啟動和單機啟動一樣,使用同樣的命令,需要注意的是集群不可用那么你將無法連接到ZK服務器,也就是說3台你只啟動1台是無法Telnet到ZK的,至少你要啟動2台才行。

在服務器配置文件的dataDir所設置的目錄里需要手動創建一個叫做myid的文件,這個文件只有一行內容,標識自己的身份也就是自己的ID值,該值范圍可以是1-255之間。當然0是可以的,但是最好不要用0,另外新加入集群的節點的myid一定要比現有的myid大。

echo 1 > /usr/local/zookeeper3.4.11/data/myid

啟動集群

zkServer.sh start
# 啟動集群有可能需要運行下面命令清理防火牆規則,有可能某種安全機制影響集群啟動,主要是選舉過程
iptables -F

集群啟動日志說明

Srv01的日志

Snip20180421_8.png

如果對端沒有准備好它會一直反復這樣的提示

Snip20180421_9.png

Snip20180421_10.png

Snip20180421_12.png

Srv02的日志

Snip20180421_13.png

Srv03的日志

Snip20180421_15.png

服務器狀態

狀態 說明
LOOKING 尋找Leader,當服務器出現這個狀態時,它會認為當前集群沒有Leader,因此需要進入選舉
FOLLOWING 跟隨者狀態,表示當前是Follower角色
LEADING 領導者狀態,表示當前為Leader角色
OBSERVING 觀察者狀態,表示當前服務器是Observer角色

如下為選舉信息,其中 (my state) 為當前服務器的狀態,最后一次表示它的最終狀態,通過看這個前后變化可以知道該服務器在狀態變化。

Snip20180421_16.png

 配置Zookeeper

基本配置:運行ZK最少需要配置的內容
clientPort 監聽客戶端連接的端口
dataDir 數據庫快照存儲位置
tickTime 客戶單到服務器之間的心跳頻率,也叫做基本時間單元,單位毫秒,客戶端連接ZK之后彼此要發送心跳信息,這個發送頻率就是這個時間。配置中所有用到時間地方都會以這個為基礎,也就是它的倍數,或者可以理解為能夠容忍多少個心跳時間。

 

 

 

 

 

 

 

高級配置
dataLogDir 事務日志保存路徑,生產環境中建議把日志路徑和快照路徑分別保存在獨立磁盤上,避免出現磁盤IO繁忙從而導致性能下降,必要時也可以關閉日志功能
maxClientCnxns 限制連接到ZK上的客戶端數量,並且限制並發連接數量,它通過IP來區分不同客戶端。值為0表示不做任何限制。注意這里的限制是針對單台客戶端到服務器的,並不是控制所有客戶端連接的。默認60.
minSessionTimeout 最小會話超時時間,默認為tickTime的2倍。不建議把這個值設置的比tickTime小。客戶端連接到ZK時如果在這個最小時間內沒有和ZK聯系則標記為超時,也就是說會斷開。
maxSessionTimeout 最大會話超時時間,默認為20倍的最小會話超時時間。不建議把這個值設置的比tickTime小。客戶端連接到ZK時如果在這個最大時間內沒有和ZK聯系則標記為超時。所以上面的參數和這個參數組成了一個時間范圍,也就是客戶端連接ZK時如果在這個時間范圍內沒有成功連接則會標記為超時。如果客戶端設置的時間范圍不在這個服務器設置的范圍內,則會被強制應用服務器設置的范圍。
autopurge.snapRetainCount 自動清理日志,該參數設置保留多少個快照文件和對應的事務日志文件,默認為3,如果你設置的小於3則會被自動的調整為3.
autopurge.purgeInterval 自動清理日志,該參數設置自動清理頻率,上面的參數配套使用。客戶端在和ZK服務器交互中服務器會產生很多日志,而且ZK會將內存中的數據作為快照保存起來,而且這些數據不會自動刪除,那么磁盤空間就會被占用,可以設置這2個參數來自動清理,不過如果ZK服務器比較繁忙而且趕上刪除日志任務就會影響性能,所以一般不設置這個自動清理,而是在ZK訪問量少的時候通過Linux的定時任務來處理。0表示不開啟自動清理功能。
globalOutstandingLimit ZK的最大請求堆積數,客戶端請求比較多,為了防止客戶端資源過度消耗,服務器必須限制同時處理的請求數量。
preAllocSize 用於配置ZK事務日志預先分配的空間,默認是64M
snapCount 用於配置相鄰兩次快照之間的事物日志次數,默認是10萬。也就是10萬條事務之后做一次快照同時結轉事務日志。
clientPortAddres 這個參數針對多網卡的ZK服務器,允許為每個IP地址指定不同的監聽端口。
fsync.warningthresholdms 用於設置ZK服務器事物日志同步操作時消耗時間的報警閾值,如果實際消耗時長超過這個時間日志就會記錄。
electionAlg 用於配置Leader選舉算法,目前只有一種選舉算法,所以不用配置。
cnxTimeout 用於Leader選舉時各個服務器之間進行的TCP連接創建超時時間,默認為5.
forceSync 這個參數用於配置ZK服務器是否在事物提交時是否強制寫入磁盤(LINUX的延遲寫入),默認是YES。
jute.maxbuffer 用於配置單個數據節點上最大數量,默認是1MB。通常不需要改動該參數,但是因為Zookeeper不適合存放太多數據所以有時候需要把值改小。
skipACL 是否跳過ACL檢查,默認是no,也就是會對所有客戶端連接進行acl檢查。

 

 

集群配置
initLimit 表示允許從服務器(相對於leader來說的客戶端)連接到leader並完成數據同步的時間,它是以tickTime的倍數來表示的,也就是從服務器與主服務器完成初始化連接和數據同步是能夠容忍多少個心跳時間,如果超過這個時間不能完成初始化連接的建立則表示連接失敗。默認是10.如果你的數據量過大而且從服務器數量也多那么這個值可以設置大一點。
syncLimit 表示主服務器(leader)和從服務器(follower)之間發送心跳請求和應答的頻率,如果在這個時間內從服務器不能與主服務器通信,則表示該從服務器失敗。默認為5.如果集群環境網絡不佳可以調整大一點。
LeaderServes 用於配置Leader服務器是否接受客戶端的連接,是否允許Leader向客戶端直接提供服務,默認是可以的。
server.x= 用於配置集群服務器列表

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Zookeeper服務狀態和配置等查詢命令

命令 說明
conf 顯示當前加載的配置文件信息
cons 列出當前連接到服務器的客戶端會話信息,包括接收和發送的包數量、會話ID等
dump 列出集群中所有會話信息,以及未經處理的會話和每個會話創建臨時節點
envi 列出當前環境信息,比如使用的JAVA版本、OS信息、主機名等
reqs 列出未經處理的請求
ruok 測試服務器是否正常,正常則放回“imok”,不正常則什么也不現實
stat 顯示和性能以及客戶端列表,包括Zookeeper版本、運行模式也就是角色、最新ZXID,連接數,節點數量
srvr 和stat命令一樣,只是不會列出客戶端連接信息,而是僅列出服務器信息
mntr 用於輸出比stat更加詳細的服務器統計信息,請求延遲、內存數據庫大小、集群同步狀態等。
wchs 列出服務器watch的詳細信息
wchc 通過session列出服務器的watch的詳細信息,它的輸出是一個與watch相關的會話列表
wchp 通過路徑列出服務器watch的詳細信息,它的輸出是一個與session相關的路徑

 

bc8f1eac25393f8462e86be72a1e351a.png

3152ceb7ea651034a682bf4ffad2c005.png

如何查看服務器角色,包括ZXID?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM