zookeeper 的偽集群搭建
瘋狂創客圈 Java 分布式聊天室【 億級流量】實戰系列之 -22【 博客園 總入口 】
源碼IDEA工程獲取鏈接: Java 聊天室 實戰 源碼
寫在前面
大家好,我是作者尼恩。目前和幾個小伙伴一起,組織了一個高並發的實戰社群【瘋狂創客圈】。正在開始高並發、億級流程的 IM 聊天程序 學習和實戰
前面,已經完成一個高性能的 Java 聊天程序的四件大事:
-
完成了協議選型,選擇了性能更佳的 Protobuf協議。具體的文章為: Netty+Protobuf 整合一:實戰案例,帶源碼
-
介紹了 通訊消息數據包的幾條設計准則。具體的文章為: Netty +Protobuf 整合二:protobuf 消息通訊協議設計的幾個准則
-
解決了一個非常基礎的問題,這就是通訊的 粘包和半包問題。具體的文章為:Netty 粘包/半包 全解 | 史上最全解讀
-
前一篇文件,已經完成了 系統三大組成模塊的組成介紹。 具體的文章為:Netty聊天程序(實戰一):從0開始實戰100w級流量應用
接下來,需要進入到分布式開發的環節了。 分布式的中間件,瘋狂創客圈的小伙伴們,一致的選擇了zookeeper,不僅僅是由於其在大數據領域,太有名了。更重要的是,很多的著名框架,都使用了zk。
1.1. zookeeper 安裝&配置
現在,我們開始使用三台機器來搭建一個Zookeeper集群。由於沒有多余的服務器,這里就將三個Zk都安裝到本地機器上,故稱謂偽集群模式。
偽集群模式只是便於開發、普通測試,不能用於生產環境。當然,如果了解了偽集群模式下的安裝和配置,生產環境下的配置,也是大致差不多的。
首先是下載。在apache的官方網站提供了好多鏡像下載地址,然后找到對應的版本,目前最新的是3.4.13。
下載地址:
http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
Windows下安裝
把下載的zookeeper的文件解壓到指定目錄
C:\devtools\zookeeper-3.4.13>
1.1.1. 創建數據目錄和日志目錄:
提前為每一個偽節點創建日志目錄、數據目錄。
在安裝目錄下,為每一個偽節點創建一個日志目錄,分別為 log/zoo-1、 log/zoo-2、 log/zoo-3:

為每一個偽節點創建一個數據目錄,分別為 data/zoo-1、 data/zoo-2、 data/zoo-3。
1.1.2. 創建myid文件
myid文件的主要作用,是記錄(偽)節點的編號。
myid文件是一個文本文件,文件名稱為myid。
myid文件內容為一個數字,表示節點的編號。
在第一個(偽)節點數據目錄 C:\devtools\zookeeper-3.4.13>data\zoo-1\ 文件夾下創建內容為 "1" 的myid文件。表示第一個節點的編號為1。
在第二個(偽)節點數據目錄 C:\devtools\zookeeper-3.4.13>data\zoo-2\ 文件夾下創建內容為 "2" 的myid文件。表示第二個節點的編號為2。
在第三個(偽)節點數據目錄 C:\devtools\zookeeper-3.4.13>data\zoo-3\ 文件夾下創建內容為 "3" 的myid文件。表示第三個節點的編號為3。
強調一下:myid文件中只有一個數字,即一個Server ID,id的范圍是1~255,表示集群最多的節點個數為255個。
1.1.3. 創建和修改配置文件
在zookeeper的配置目錄conf 目錄下,有一個官方的配置文件樣例——zoo_sample.cfg。
將配置文件的樣例zoo_sample.cfg文件復制3分,為每一個節點復制一份,分別命名為zoo-1.cfg、zoo-2.cfg、zoo-3.cfg,應用於3個節點。
然后,需要修改每一個節點的配置文件,將前面建立的編號(Server ID)、日志目錄、數據目錄,配置進去。
首先,配置 (Server ID)編號、IP、端口。格式為:
server.id=host:port:port
在zookeeper集群中,每個節點都需要感知到整個集群是哪些節點組。在配置文件中,可以按照這樣的格式進行配置,每一行都代表一個節點。
三個節點,配置的實例如下:
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
配置ID的時候,注意四點:
(1)清確保每個節點的myid文件中的id值不同,不能有相同id的節點;
(2)server.id=houst:port:port的id值,需要與所對應的節點數據目錄下的myid中的di值保持一致。
(3)每一個節點的配置文件中,不僅僅是配置自己的那份,而是需要所有節點的id、ip、端口配置。
(4)Id配置中,需要配置兩個端口。前一個端口(如上的2888)用於節點之間的通訊使用,后一個端口(如上的3888)用於選舉leader主節點使用。在偽集群的模式下,兩個端口必須修改每一個節點都不一樣。在分布式集群模式下,不同節點的ip不同,可以不同節點的端口相同。
其次,配置數據目錄dataDir。
每一個節點,都有自己的數據目錄。數據目錄是沒有默認值的,必須配置。dataDir用於存儲節點快照文件的目錄。
每個節點只需要配置自己的數據目錄。案例中zoo-1.conf的數據目錄如下:
dataDir=C:\devtools\zookeeper-3.4.13\data\zoo-1
第三,配置服務端口
clientPort:參數clientPort用於配置當前節點的服務端口,客戶端會通過該端口和Zk服務器創建連接,一般設置為2181。不同的節點,clientPort不能相同,可以按照編號,進行累加。
第四,配置時間相關選項
tickTime:配置單元時間。單元時間是Zookeeper的時間計算單元,其他的時間間隔都是使用tickTime的倍數來表示的。單元時間默認值為3000,單位是毫秒(ms),所以,可以不配置。
initLimit:節點的初始化時間。該參數用於Follower(從節點)啟動,並完成從Leader(主節點)同步數據的時間。Follower服務器在啟動過程中,會與Leader建立連接並完成對數據的同步,從而確定自己的起始狀態。leader服務器允許Follower在initLimit時間內完成這個工作。該參數默認值:10,表示是參數tickTime值的10倍,必須配置,且為正整數。
syncLimit:心跳最大延遲周期。該參數用於配置Leader服務器和Follower之間進行心跳檢測的最大延時時間。在Zk集群運行的過程中,Leader服務器會通過心跳檢測來確定Follower服務器是否存活。如果Leader服務器在syncLimit時間內無法獲取到Follower的心跳檢測響應,那么Leader就會認為該Follower已經脫離了和自己的同步。該參數默認值:5,表示是參數tickTime值的5倍,必須配置,且為正整數。
1.1.4. 配置文件實例
為了給出一個完整的直觀體驗,下面給出三份配置文件實際的代碼。
第一個節點的配置文件zoo-1.conf
tickTime=4000
initLimit = 10
syncLimit = 5
dataDir = C:/devtools/zookeeper-3.4.13/data/zoo-1/
clientPort = 2181
server.1 = 127.0.0.1:2888:3888
server.2 = 127.0.0.1:2889:3889
server.3 = 127.0.0.1:2890:3890
第二個節點的配置文件zoo-2.conf
tickTime=4000
initLimit = 10
syncLimit = 5
dataDir = C:/devtools/zookeeper-3.4.13/data/zoo-2/
clientPort = 2182
server.1 = 127.0.0.1:2888:3888
server.2 = 127.0.0.1:2889:3889
server.3 = 127.0.0.1:2890:3890
第三個節點的配置文件zoo-3.conf
tickTime=4000
initLimit = 10
syncLimit = 5
dataDir = C:/devtools/zookeeper-3.4.13/data/zoo-3/
clientPort = 2183
server.1 = 127.0.0.1:2888:3888
server.2 = 127.0.0.1:2889:3889
server.3 = 127.0.0.1:2890:3890
通過三個配置文件,可以看出,每個節點的server id 的配置,都是全量配置。每一個節點的數據目錄dataDir 和對外服務端口clientPort,則僅僅負責自己的那份。
1.1.5. 修改啟動命令
在bin目錄下,通過復制zkServer.cmd文件,為每一個偽節點創建一個啟動文件,分別為 zkServer-1.cmd、zkServer-2.cmd、zkServer-3.cmd。
主要是為每一個節點增加配置文件(ZOOCFG)、日志目錄ZOO_LOG_DIR的設置。
修改之后,第一個節點的啟動命令 zkServer-1.cmd代碼如下:
setlocal
call "%~dp0zkEnv.cmd"
set ZOOCFG=C:\devtools\zookeeper-3.4.13\conf\zoo-1.cfg
set ZOO_LOG_DIR=C:\devtools\zookeeper-3.4.13\log\zoo-1
set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
echo on
call %JAVA% "-Dzookeeper.log.dir=%ZOO_LOG_DIR%" "-Dzookeeper.root.logger=%ZOO_LOG4J_PROP%" -cp "%CLASSPATH%" %ZOOMAIN% "%ZOOCFG%" %*
endlocal
1.1.6. 啟動偽集群
打開一個window的命令控制台,進入到bin目錄,並且啟動zkServer-1.cmd,這個腳本中會啟動第一個節點的java服務進程:
C:\devtools\zookeeper-3.4.13>cd bin
C:\devtools\zookeeper-3.4.13\bin>
C:\devtools\zookeeper-3.4.13\bin > zkServer-1.cmd
zookeeper集群需要有1/2以上的節點啟動,才能完成集群的啟動,對外提供服務。所以,至少需要再啟動一個節點。
打開另外一個window的命令控制台,進入到bin目錄,並且啟動zkServer-2.cmd,這個腳本中會啟動第一個節點的java服務進程:
C:\devtools\zookeeper-3.4.13>cd bin
C:\devtools\zookeeper-3.4.13\bin>
C:\devtools\zookeeper-3.4.13\bin > zkServer-2.cmd
由於這里沒有使用后台服務啟動的模式,所以,這兩個節點服務的窗口,在服務期間,不能關閉。
如何驗證集群已經成功啟動呢?
方法一:
可以通過jps命令,可以看到QuorumPeerMain的進程的數量。
C:\devtools\zookeeper-3.4.13\bin > jps
方法二:
啟動zookeeper 客戶端,運行查看一下,是否能連接集群。如果能夠成功連接,這個時候zookeeper已經安裝成功了,
C:\devtools\zookeeper-3.4.13\bin> ./zkCli.cmd -server 127.0.0.1:2181
windows下,Zookeeper是通過.cmd的批處理命令運行的,默認沒有提供以windows服務的方式運行的方案。
避免每次關閉后,再啟動還需要使用cmd,十分的不方便,可以通過工具prunsrv 來將zookeeper做成 windows 服務,將zookeeper服務化管理。
1.1.7. zk的客戶端常用命令
用zkCli.sh連接上Zookeeper服務后,用help能列出所有命令:
zk的客戶端常用命令 | 功能簡介 |
---|---|
create | 創建路徑結點 |
ls | 查看路徑下的所有結點 |
get | 獲得結點上的值 |
set | 修改結點上的值 |
delete | 刪除結點 |
寫在最后
下一篇:開啟zk的客戶端開發。
瘋狂創客圈 億級流量 高並發IM 實戰 系列
- Java (Netty) 聊天程序【 億級流量】實戰 開源項目實戰
- Netty 源碼、原理、JAVA NIO 原理
- Java 面試題 一網打盡
- 瘋狂創客圈 【 博客園 總入口 】