Zookeeper分散式過程協同技術 - 部署及設定
Zookeeper支援單機模式、偽叢集模式、叢集模式三種部署方式。演示部署環境為CentOS、jdk版本為1.8、Zookeeper版本為3.4.9。
單機模式
單機模式適合入門學習使用,只需要一臺機器就可以輕鬆搭建Zookeeper服務用於學習和測試。
1. 進入官網下載Zookeeper的JAR包,下載地址:https://zookeeper.apache.org/releases.html。
2. 解壓壓縮包,命令:tar -zxvf zookeeper-3.4.9.tar.gz,解壓後目錄格式如下。
3. 進入conf目錄,複製zoo_sample.cfg檔案命名為zoo.cfg。這裡可以直接使用預設的引數,也可以根據自己的需要修改。
命令:cp zoo_sample.cfg zoo.cfg
主要配置引數說明
- clientPort
客戶端連線的伺服器所監聽的TCP埠,預設情況下,伺服器會監聽所有的網路連線的這個埠,除非設定了clientPortAddress引數。客戶埠可以設定為任何值,不同的伺服器可以設定不同的埠,預設埠號為2181。
- tickTime
tickTime的時長單位為毫秒,Zookeeper叢集中使用的超時時間單位通過tickTime指定。tickTime設定了超時時間的下限值,因為最小的超時時間為一個tick時間,客戶端最小會話超時時間為2個tick時間。
tickTime的預設值是3000毫秒,更低的tickTime值可以更快地發現超時問題,但也導致更高的網路流量和更高的CPU使用率。
- dataDir
dataDir用於配置記憶體資料庫儲存的模糊快照目錄,如果某個伺服器為叢集中的一臺,id檔案也儲存在該目錄下。
- dataLogDir
用於配置事務日誌的儲存目錄。服務端在確認一個事務前必須將資料同步到儲存中,如果寫入磁碟過於忙碌會影響到寫入的吞吐能力。因此,比較好的方案是使用專用的日誌儲存裝置,將dataLogDir目錄配置指向該裝置。
- maxClientCnxns
允許每個IP地址發起socket連線的最大數量。Zookeeper通過流量控制和限制值來避免過載情況的發生。當某個IP地址的客戶端建立的連線數大於此值時,伺服器會拒絕該IP地址新的連線。
- initLimit
對於追隨者最初連線到群首時的超時時間,單位為tick(tickTime)值的倍數。
當某個追隨者最初與群首建立連線時,它們之間會傳輸相當多的資料,尤其是追隨者落後整體很多時。配置initLimit引數值取決於群首與追隨者之間的網路傳輸速度以及傳輸資料量的大小。
但是如果設定值過高,在首次連線到故障的伺服器就會消耗更多的時間,同時還會消耗更多的恢復時間。因此在實際部署時,最好進行叢集間的網路基準測試來測試出你所期望的時間。
- syncLimit
對於追隨者與群首進行sync操作時的超時值,單位為tick(tickTime)值的倍數。
追隨者總是會稍落後於群首,如果群首與追隨者無法進行sync操作,而且超過了syncLimit的tick時間,就會放棄該追隨者。
- leaderServes
配置值為“yes”或“no”標誌,指示群首伺服器是否為客戶端提供服務。擔任群首的伺服器需要做很多工作,它需要與所有的追隨者進行通訊並會執行所有的變更操作,這意味著群首的負載會比追隨者高很多,如果群首過載,整個系統都有可能受到影響。
4. 進入bin目錄,可以看到很多sh指令碼檔案,通過zkServer.sh來啟動zookeeper。
操作命令:
啟動命令:.zkServer.sh start
停止命令:.zkServer.sh stop
重啟命令:.zkServer.sh restart
狀態檢視命令:.zkServer.sh status
啟動zookeeper服務後,通過status命令可以看到當前服務狀態、使用的配置檔案、執行模式。
這樣Zookeeper的單機部署模式就已經初步完成了。如果需要修改JVM配置,可以修改zkServver.sh檔案中的配置,在如下位置加入你需要的引數。
偽叢集部署
偽叢集部署指在一臺機器上部署多個Zookeeper服務。
1. 首先將之前配置好的Zookeeper服務目錄另外複製兩份,命名為zookeeper-2和zookeeper-3。
2. 然後分別修改三份的zoo.cfg配置項,新增配置 server.x=[hostname]:n:n[:observer],示例如下。
server.1=localhost:2887:3887
server.2=localhost:2888:3888
server.3=localhost:2889:3889
Zookeeper伺服器需要知道它們如何通訊,配置檔案中該形式的配置項就指定了伺服器x的配置資訊,其實x為伺服器的ID值(一個整數)。當一個伺服器啟動後,就會讀取data目錄下myid檔案中的值,之後伺服器就會使用這個值作為查詢server.x項,通過該項中的資料配置伺服器自己。如果需要連線到另外一個伺服器y,就會使用server.y項配置資訊來與這個伺服器進行通訊。
hostname為伺服器在網路中的名稱(ip或者主機名),同時後面跟著兩個埠號,第一個埠號用於事務的傳送,第二個埠號用於群首選舉。如果最後一個欄位標記了observer屬性(選填),伺服器就會進入觀察者模式。
三份配置檔案的myid和兩個配置埠號以及clientPort不可以重複,因為是在一臺機器上部署,生產環境叢集部署時可以忽略。最終的配置清單如下:
3. 分別新增myid檔案,在data目錄下新增myid檔案。
echo '1' > data/myid
4. 分別啟動三個Zookeeper服務,啟動成功後通過status命令可以檢視服務的狀態。可以看到目前叢集裡有一臺leader和兩臺follower。
叢集部署
生產環境的叢集部署步驟和偽叢集部署並無太多差異,同樣是修改zoo.cfg配置檔案並且新增Zookeeper叢集資訊,叢集部署時,客戶端埠號、事務埠號、選舉埠號都可以保持一致。另外叢集部署時需要充分考慮叢集機器間的網路情況來制定合理的超時時間設定。