Zookeeper安裝和運行
安裝環境:
CentOS 7 內存1GB
JDK版本:1.8.0_112
為JDK配置如下環境變量:
編輯/etc/profile.d/jdk.sh
JAVA_HOME=/usr/local/jdk1.8.0_112 export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
之後運行下面的命令:
註意:在生產環境中為了避免內存頻繁的換進換出,建議將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文件
ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.11 export PATH=$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf:$PATH
執行下面的命令
準備配置文件
在程序目錄中的conf目錄中創建zoo.cfg配置文件,zoo_sample.cfg是模板文件,直接復制一下修改名稱,然後再修改裏面的內容。
這個配置文件可以設置很多參數,默認只有最基本的。其他參數後面再說
參數 | 說明 |
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的位置生成,所以我們要修改為指定路徑。
配置好上面的設置就可以啟動了。
測試連接
nc是網絡命令,全稱是netcat,其實使用telnet也一樣
ZK客戶端
1 zkCli.sh -server IP:PORT
也可以不輸入IP和端口,默認就會連接127.0.0.1:2181
查看事務日誌:
1 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
集群安裝
集群配置和單機安裝一樣,只是配置文件內容會多一部分內容,內容如下:
"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臺才行。
1 zkServer.sh start 2 # 啟動集群有可能需要運行下面命令清理防火墻規則,有可能某種安全機制影響集群啟動,主要是選舉過程 3 iptables -F
集群啟動日誌說明
Srv01的日誌
如果對端沒有準備好它會一直反復這樣的提示
Srv02的日誌
Srv03的日誌
服務器狀態
狀態 | 說明 |
LOOKING | 尋找Leader,當服務器出現這個狀態時,它會認為當前集群沒有Leader,因此需要進入選舉 |
FOLLOWING | 跟隨者狀態,表示當前是Follower角色 |
LEADING | 領導者狀態,表示當前為Leader角色 |
OBSERVING | 觀察者狀態,表示當前服務器是Observer角色 |
如下為選舉信息,其中 (my state) 為當前服務器的狀態,最後一次表示它的最終狀態,通過看這個前後變化可以知道該服務器在狀態變化。
配置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相關的路徑 |
Zookeeper安裝和運行