zookeeper curator ( 實戰一)


zookeeper 的偽集群搭建

瘋狂創客圈 Java 分布式聊天室【 億級流量】實戰系列之 -22【 博客園 總入口



源碼IDEA工程獲取鏈接Java 聊天室 實戰 源碼

寫在前面

​ 大家好,我是作者尼恩。目前和幾個小伙伴一起,組織了一個高並發的實戰社群【瘋狂創客圈】。正在開始高並發、億級流程的 IM 聊天程序 學習和實戰

​ 前面,已經完成一個高性能的 Java 聊天程序的四件大事:

  1. 完成了協議選型,選擇了性能更佳的 Protobuf協議。具體的文章為: Netty+Protobuf 整合一:實戰案例,帶源碼

  2. 介紹了 通訊消息數據包的幾條設計准則。具體的文章為: Netty +Protobuf 整合二:protobuf 消息通訊協議設計的幾個准則

  3. 解決了一個非常基礎的問題,這就是通訊的 粘包和半包問題。具體的文章為:Netty 粘包/半包 全解 | 史上最全解讀

  4. 前一篇文件,已經完成了 系統三大組成模塊的組成介紹。 具體的文章為: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:

![img](file:///C:\Users\qinglin\AppData\Local\Temp\ksohtml\wps2376.tmp.jpg)

為每一個偽節點創建一個數據目錄,分別為 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) 聊天程序【 億級流量】實戰 開源項目實戰



免責聲明!

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



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