1. 程式人生 > >zookeeper curator(實戰一):安裝&配置

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) 聊天程式【 億級流量】實戰 開源專案實戰