說明:zookeeper系列是基於3.6.0版本的
zookeeper通常使用命令工具啓動,啓動主要就是初始化全部組件,讓server能夠接收並處理來自client的請求。本文主要結構:java
main入口
咱們通常使用命令行工具來部署zk server,zkServer.sh,這個腳本用來啓動中止server,經過不一樣的參數和選項來達到不一樣的功能。該腳本最後會經過Java執行下面的main方法react
org.apache.zookeeper.server.quorum.QuorumPeerMain#main
無論單機仍是集羣都是使用zkServer.sh
這個腳原本啓動,只是參數不一樣,因此main方法入口也是同樣的。因此這個入口方法主要是根據不一樣的入參判斷是集羣啓動仍是單機啓動。apache
該main方法主要作了如下幾件事網絡

- 解析配置,若是傳入的是配置文件(參數只有一個),解析配置文件並初始化QuorumPeerConfig
- 啓動清理文件的線程
- 判斷是單機仍是集羣
- 集羣:只有一個參數,而且配置了多個server
- 單機:上面的條件不知足,通常在啓動的使用瞭如下兩種配置的一種
- 使用的是文件配置,可是沒有配置多臺server
- 命令行配置多個(2-4)參數:port dataDir [tickTime] [maxClientCnxns]
配置解析
配置解析主要有兩種狀況session
- 使用配置文件
- 使用命令行參數
使用配置文件
使用配置文件的時候是使用QuorumPeerConfig
來解析配置的數據結構

- 先校驗文件的合法性
- 配置文件是使用Java的properties形式寫的,因此能夠經過Properties.load來解析
- 將解析出來的key、value賦值給對應的配置
使用命令行參數
直接在命令指定對應的配置,這種狀況只有在單機的時候纔會使用,包含如下幾個參數多線程
- port,必填,sever監聽的端口
- dataDir,必填,數據所在的目錄
- tickTime,選填
- maxClientCnxns,選填,最多可處理的客戶端鏈接數
組件啓動
zookeeper包含的主要組件有工具
- FileTxnSnapLog:管理FileTxLog和FileSnap
- ZooKeeperServer:維護一個處理器鏈表processor chain
- NIOServerCnxnFactory:管理來自客戶端的鏈接
- Jetty,用來經過http管理zk
zookeeper維護了本身的數據結構和物理文件,並且要接收並處理client發送來的網絡請求,因此在zookeeper啓動的時候,要作好下面的準備工做測試

- 初始化FileTxnSnapLog,建立了FileTxnLog實例和FIleSnap實例,並保存剛啓動時候DataTree的snapshot
- 啓動adminServer
- 啓動NIOServerCnxnFactory
- 從解析出的配置中配置NIOServerCnxnFactory
- 初始化網絡鏈接管理類:NIOServerCnxnFactory
- 初始化:WorkerService:用來業務處理的線程池
- 線程啓動:
SelectorThread(有多個):處理網絡請求,write和read
AcceptThread:用來接收鏈接請求,創建鏈接,zk也支持使用reactor多線程,accept線程用來創建鏈接,selector線程用來處理read、write
ConnectionExpirerThread:關閉超時的鏈接,全部的session都放在org.apache.zookeeper.server.ExpiryQueue#expiryMap
裏面維護,這個線程不斷從裏面拿出超時的鏈接關閉
- 啓動ZookeeperServer,主要是用來建立SessionTrackerImpl,這個類是用來管理session的
總結
單機模式部署較爲簡單,通常在開發、測試環境使用,因爲單機環境須要的組件少,啓動過程也較爲簡單,主要是解析傳入的參數,而後啓動對應的網絡組件和請求處理組件,後面緊接着咱們看下zk的集羣啓動流程。命令行