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

logDirzookeeper服務的日誌路徑
clientPort
監聽客戶端連接的端口

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

0451561500e0ff06f6bb9f4aa932953c.png

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

95b11b89570a001db7bb7240017d1fa3.png

測試連接

2c7a28a0d03eca00d92f467b5e128b6b.pngnc是網絡命令,全稱是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表示不同服務器,在服務器配置文件的dataDir所設置的目錄裏需要手動創建一個叫做myid的文件,這個文件只有一行內容,標識自己的身份也就是自己的ID值,該值範圍可以是1-255之間。 

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

host:主機名

第一個port:集羣中從服務器(follower)連接到主服務器(leader)的端口,也就是作爲leader時使用的,其他從服務器都連接到主服務器的這個端口

第二個port:進行leader選舉時使用的端口

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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章