zookeeper源碼 — 一、單機啟動


說明:zookeeper系列是基於3.6.0版本的
zookeeper一般使用命令工具啟動,啟動主要就是初始化所有組件,讓server可以接收並處理來自client的請求。本文主要結構:

  • main入口
  • 配置解析
  • 組件啟動

main入口

我們一般使用命令行工具來部署zk server,zkServer.sh,這個腳本用來啟動停止server,通過不同的參數和選項來達到不同的功能。該腳本最后會通過Java執行下面的main方法

org.apache.zookeeper.server.quorum.QuorumPeerMain#main

不管單機還是集群都是使用zkServer.sh這個腳本來啟動,只是參數不同,所以main方法入口也是一樣的。所以這個入口方法主要是根據不同的入參判斷是集群啟動還是單機啟動。

該main方法主要做了以下幾件事

  1. 解析配置,如果傳入的是配置文件(參數只有一個),解析配置文件並初始化QuorumPeerConfig
  2. 啟動清理文件的線程
  3. 判斷是單機還是集群
    1. 集群:只有一個參數,並且配置了多個server
    2. 單機:上面的條件不滿足,一般在啟動的使用了以下兩種配置的一種
      1. 使用的是文件配置,但是沒有配置多台server
      2. 命令行配置多個(2-4)參數:port dataDir [tickTime] [maxClientCnxns]

配置解析

配置解析主要有兩種情況

  1. 使用配置文件
  2. 使用命令行參數

使用配置文件

使用配置文件的時候是使用QuorumPeerConfig來解析配置的

  1. 先校驗文件的合法性
  2. 配置文件是使用Java的properties形式寫的,所以可以通過Properties.load來解析
  3. 將解析出來的key、value賦值給對應的配置

使用命令行參數

直接在命令指定對應的配置,這種情況只有在單機的時候才會使用,包含以下幾個參數

  • port,必填,sever監聽的端口
  • dataDir,必填,數據所在的目錄
  • tickTime,選填
  • maxClientCnxns,選填,最多可處理的客戶端連接數

組件啟動

zookeeper包含的主要組件有

  • FileTxnSnapLog:管理FileTxLog和FileSnap
  • ZooKeeperServer:維護一個處理器鏈表processor chain
  • NIOServerCnxnFactory:管理來自客戶端的連接
  • Jetty,用來通過http管理zk

zookeeper維護了自己的數據結構和物理文件,而且要接收並處理client發送來的網絡請求,所以在zookeeper啟動的時候,要做好下面的准備工作

  1. 初始化FileTxnSnapLog,創建了FileTxnLog實例和FIleSnap實例,並保存剛啟動時候DataTree的snapshot
  2. 啟動adminServer
  3. 啟動NIOServerCnxnFactory
    1. 從解析出的配置中配置NIOServerCnxnFactory
    2. 初始化網絡連接管理類:NIOServerCnxnFactory
      1. 初始化:WorkerService:用來業務處理的線程池
      2. 線程啟動:
        SelectorThread(有多個):處理網絡請求,write和read
        AcceptThread:用來接收連接請求,建立連接,zk也支持使用reactor多線程,accept線程用來建立連接,selector線程用來處理read、write
        ConnectionExpirerThread:關閉超時的連接,所有的session都放在org.apache.zookeeper.server.ExpiryQueue#expiryMap里面維護,這個線程不斷從里面拿出超時的連接關閉
    3. 啟動ZookeeperServer,主要是用來創建SessionTrackerImpl,這個類是用來管理session的

總結

單機模式部署較為簡單,一般在開發、測試環境使用,由於單機環境需要的組件少,啟動過程也較為簡單,主要是解析傳入的參數,然后啟動對應的網絡組件和請求處理組件,后面緊接着我們看下zk的集群啟動流程。


免責聲明!

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



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