Stories

Detail Return Return

Ubuntu上進行Zookeeper集羣部署 - Stories Detail

目錄
  • 1.zookeeper下載
  • 2.zookeeper安裝與使用
  • 3.zookeeper啓動
  • 4.zookeeper是什麼?為什麼要用它?為什麼不用Hbase自帶的?

1.zookeeper下載

版本無特別要求,一般最新穩定版即可。

這裏給出3.8.4的下載鏈接。(點擊即可直接下載)

zookeeper官網:https://zookeeper.apache.org/

2.zookeeper安裝與使用

(0)!!! 在開始之前,確保你所有機器的用户名相同,即hadoop@masterhadoop@salve01hadoop@salve02 等,要確保@ 前的用户名相同,避免後續不必要的錯誤

準備工作,所有機器上都要有
配置好hosts文件
安裝JAVA(儘量JDK8)
安裝SSH
所有機器上可以互相ping通
master可以免密連接slave節點
用户名都相同

(1)在自己電腦下載好zookeeper之後,粘貼到虛擬機的Downloads裏,鼠標右鍵,點Paste即可粘貼。
注:打開左邊第二個圖標,打開之後點Downloads,再粘貼
(也可以複製鏈接到虛擬機的瀏覽器,直接在虛擬機下載,省的再複製粘貼)

image

(2)解壓文件、重命名、授權

sudo tar -zxvf ~/Downloads/apache-zookeeper-3.8.4-bin.tar.gz -C /usr/local
cd /usr/local
sudo mv ./apache-zookeeper-3.8.4-bin ./zookeeper    //如果你的不是3.8.4,根據實際修改
sudo chown -R hadoop ./zookeeper

(3)配置環境變量

sudo vim ~/.bashrc

進入文件後,按上下方向鍵,翻到最後,插入下面語句(Ctrl+Shift+v 粘貼)

#Zookeeper
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=${ZOOKEEPER_HOME}/bin:$PATH

之後執行source ~/.bashrc 命令刷新環境變量,使配置生效。

(4)新建data和logs目錄(data目錄用來存放數據庫快照,logs目錄用來存放日誌文件)

cd /usr/local/zookeeper
mkdir logs
mkdir data

注:logs目錄中的.out文件為運行日誌,可以查看報錯信息

(5)配置文件zoo.cfg與myid

注:因為zookeeper使用的配置文件為zoo.cfg,但是自帶的是zoo_sample.cfg模板文件,因此可以使用mv 命令重命名,或者直接vim編寫新文件。
image

cd /usr/local/zookeeper/conf/
vim zoo.cfg

粘貼下列內容,之後根據自己的實際機器,修改最後幾行的內容

注:最後三行, = 後面的master、slave01名字等與hosts文件中配置的相同,即Hadoop@slave01,@後面的slave01.

# The number of milliseconds of each tick
# zookeeper時間配置中的基本單位 (毫秒)
# Zookeeper 服務器之間或客户端與服務器之間維持心跳的時間間隔,單位為毫秒
tickTime=2000  

# The number of ticks that the initial synchronization phase can take
# 允許follower初始化連接到leader最⼤時⻓,它表示tickTime時間倍數
# 表示允許從服務器連接到 leader 並完成數據同步的時間,總的時間長度就是 initLimit * tickTime 秒
initLimit=10

# The number of ticks that can pass between sending a request and getting an acknowledgement
# 允許follower與leader數據同步最⼤時⻓,它表示tickTime時間倍數
# 配置 Leader 與 Follower 之間發送消息、請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 syncLimit * tickTime 秒 
syncLimit=5

# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just example sakes.
#zookeper 數據存儲⽬錄及⽇志保存⽬錄(如果沒有指明dataLogDir,則⽇志也保存在這個⽂件中)
# Zookeeper 保存數據的數據庫快照的位置
dataDir=/usr/local/zookeeper/data

# 事務日誌路徑,若沒提供的話則用 dataDir
dataLogDir=/usr/local/zookeeper/logs

# the port at which the clients will connect
# Zookeeper 服務器監聽的端口,以接受客户端的訪問請求
#對客户端提供的端⼝號
clientPort=2181

# the maximum number of client connections.
# increase this if you need to handle more clients
# 限制連接到 ZK 上的客户端數量,並且限制併發連接數量,值為 0 表示不做任何限制
#單個客户端與zookeeper最⼤併發連接數
#maxClientCnxns=60

# Be sure to read the maintenance section of the administrator guide before turning on autopurge.
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance

# The number of snapshots to retain in dataDir
# 自動清理日誌,該參數設置保留多少個快照文件和對應的事務日誌文件,默認為 3,如果小於 3 則自動調整為 3
# 保存的數據快照數量,之外的將會被清除
#autopurge.snapRetainCount=3

# Purge task interval in hours
# Set to "0" to disable auto purge feature
#自動觸發清除任務時間間隔,⼩時為單位。默認為0,表示不⾃動清除。
#autopurge.purgeInterval=1

# server.n n是一個數字,表示這個是第幾號服務器,“=”後面可跟主機地址或者IP地址,2888為集羣中從服務器(follower)連接到主服務器(leader)的端口,為主服務器(leader)使用;3888為進行選舉(leader)的時使用的端口
server.1=master:2888:3888
server.2=slave01:2888:3888
server.3=slave02:2888:3888

🚨再次提醒!!!集羣部署,需要自行配置最後幾行的server,哪個機器需要zookeeper服務,就填哪個機器名。

注1:配置文件時,註釋單獨一行寫,不能寫在參數後面,否則在解析時,會把註釋內容也識別為參數,導致報錯,日誌內容如下
image

注2:配置文件時,dataDirdataLogDir的配置路徑,不要用環境變量來代替絕對路徑,例如dataDir=$ZOOKEEPER_HOME/data 是錯誤的。 ZooKeeper 的配置文件(zoo.cfg)本身不支持解析環境變量(如 $ZOOKEEPER_HOME),會把它當作普通字符串處理,導致無法正確識別路徑。導致報錯,日誌內容如下
image

(6)壓縮文件,併發送到其他機器上

cd /usr/local
tar -zcvf ~/zookeeper.tar.gz ./zookeeper/
scp ~/zookeeper.tar.gz hadoop@slave01:/home/hadoop/
scp ~/zookeeper.tar.gz hadoop@slave02:/home/hadoop/

(7)在slave01和slave02進行解壓縮,並配置環境變量

sudo tar -zxvf ~/zookeeper.tar.gz -C /usr/local/
sudo vim ~/.bashrc

粘貼下面的環境變量

#Zookeeper
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=${ZOOKEEPER_HOME}/bin:$PATH

之後執行source ~/.bashrc 命令刷新環境變量,使配置生效。

(8)配置myid文件(所有機器上都要做,包括master、slave)

vim /usr/local/zookeeper/data/myid

myid填寫數字,就是zoo.cfg文件中填寫的主機名前的數字。只填一個數字就行。
image

image

(9)常用命令

zkServer.sh start    //啓動zookeeper
zkServer.sh stop   	 //停止zookeeper
zkServer.sh status   //查看zookeeper運行狀態(至少啓動兩個節點再去查看,不然選舉失敗,狀態也是不正常)
zkServer.sh version  //查看zookeeper版本
zkServer.sh restart  //重啓zookeeper

zookeeper客户端:
zkCli.sh			//進入zookeeper客户端
quit			    //退出客户端
deleteall 			//刪除文件夾及其子文件夾(例:deleteall /hbase)

3.zookeeper啓動

在每個機器上都單獨輸入 zkServer.sh start ,來啓動zookeeper。

至少啓動兩個,然後輸入zkServer.sh status 查看啓動狀態。

注:Hmaster與leader不在同一機器上,是正常現象。實際生產環境中,甚至會刻意將 HMaster 和 ZooKeeper Leader 部署在不同機器。

  1. 避免 “單點故障放大”
    如果二者在同一台機器,一旦該機器宕機,會同時導致 HBase 失去主管理節點、ZooKeeper 集羣失去 Leader(需重新選舉),雙重故障會大幅延長集羣恢復時間;分開部署則只會影響單一組件,風險更可控。
  2. 減少資源競爭
    HMaster 需處理 HBase 的 Region 分配、元數據更新等計算;ZooKeeper Leader 需處理大量分佈式鎖請求(如 HBase 依賴 ZooKeeper 實現 Master 選舉、RegionServer 心跳)。二者分開部署可避免 CPU、內存、網絡資源的相互搶佔,提升各自性能。
  3. 符合 “組件解耦” 設計
    分佈式架構的核心原則是 “組件解耦”,HBase 本身就是依賴 ZooKeeper 提供的分佈式協調能力(而非依賴其物理節點),只要 HMaster 能通過網絡正常連接 ZooKeeper 集羣(配置 hbase.zookeeper.quorum 指向 ZooKeeper 集羣地址),就無需關心 ZooKeeper Leader 具體在哪台機器。

示例如下

master節點

image

slave01節點

image

slave02節點

image

4.zookeeper是什麼?為什麼要用它?為什麼不用Hbase自帶的?

(1)ZooKeeper 是一款開源的分佈式協調服務,核心作用是幫分佈式系統(由多個獨立服務組成的系統)解決配置同步、節點管理、分佈式鎖等協調問題,讓系統運行更穩定、有序。

(2)

  1. 分佈式數據庫 HBase 用它管理集羣節點 ——ZooKeeper 實時監控 HBase 的主節點(Master)和從節點(RegionServer)狀態,若主節點故障,能快速從備用節點中選新主節點,避免數據庫服務中斷;
  2. 電商秒殺場景中,多個服務同時搶庫存易超賣,此時用 ZooKeeper 實現 “分佈式鎖”—— 同一時間只允許一個服務操作庫存,確保庫存數據準確。

可以類似於:學校運動會的總調度員”
學校運動會有多個項目(對應分佈式系統裏的多個服務),每個項目需要知道比賽時間、場地安排(對應服務需要的配置信息),還要避免不同項目搶同一跑道(對應服務搶同一資源),且得實時掌握每個項目是否正常進行(對應監控服務節點狀態)。
這時總調度員(ZooKeeper)的作用就是:提前把統一的賽程表(配置)發給所有項目組,協調好各項目的場地使用(分佈式鎖),一旦某個項目出問題(比如裁判缺席),立刻通知替補人員頂上(節點故障切換),確保整個運動會(分佈式系統)不混亂、不中斷。

(3)HBase 自帶 ZooKeeper與獨立zookeeper的區別

簡單來説就是單獨的zookeeper更加靈活、高效、安全

對比維度 HBase 自帶 ZooKeeper 單獨的 ZooKeeper
部署與維護成本 低:無需單獨下載部署,依賴 HBase 腳本啓動 / 停止,配置簡化(僅需在 HBase 配置文件中指定 ZooKeeper 參數)。 高:需單獨下載、配置(如zoo.cfg)、啓動,需獨立監控和運維,新增組件學習成本。
獨立性與生命週期 弱綁定:ZooKeeper 隨 HBase 啓動而啓動、隨 HBase 停止而停止,無法單獨重啓或升級;HBase 故障可能直接影響 ZooKeeper。 完全獨立:ZooKeeper 可單獨啓動、停止、升級,生命週期與 HBase 無關;HBase 重啓 / 故障不影響 ZooKeeper 運行。
擴展性 有限:僅支持單機模式或小規模偽集羣(默認不支持 ZooKeeper 集羣,需手動修改配置但兼容性差),無法滿足大規模集羣需求。 靈活:支持單機、偽集羣、完全分佈式集羣(3 + 節點,滿足高可用),可根據業務規模擴容 ZooKeeper 節點。
穩定性與可靠性 較低:ZooKeeper 與 HBase 共享資源(CPU、內存、磁盤),HBase 高負載時可能導致 ZooKeeper 響應緩慢;無獨立監控,故障排查困難。 較高:資源隔離(獨立服務器 / 容器),避免 HBase 負載影響;可單獨配置監控(如 Zabbix、Prometheus),故障定位更高效。
多組件兼容性 差:僅為 HBase 服務,無法被其他分佈式組件(如 Kafka、Spark)複用,導致集羣中存在多個 “孤立” ZooKeeper 實例,資源浪費且管理複雜。 好:可作為 “全局協調服務”,為 HBase、Hadoop、Kafka 等多個組件提供統一協調,減少資源冗餘,簡化集羣管理。
版本與升級靈活性 低:ZooKeeper 版本與 HBase 綁定(如 HBase 2.5.0 默認自帶 ZooKeeper 3.5.9),升級 ZooKeeper 需先升級 HBase,無法單獨適配高版本 ZooKeeper 的新特性(如動態配置)。 高:ZooKeeper 版本可獨立選擇(需與 HBase 兼容,如 HBase 2.x 支持 ZooKeeper 3.4.x/3.5.x),可單獨升級 ZooKeeper,無需依賴 HBase 版本迭代。
適用場景 小規模測試、開發環境、單機偽集羣(追求快速搭建,無需高可用)。 生產環境、大規模 HBase 集羣、多組件協同的分佈式集羣(需高可用、穩定性和擴展性)。

Add a new Comments

Some HTML is okay.