centos安裝zookeeper及搭建叢集
centos安裝zookeeper及搭建叢集
ZooKeeper是一個分散式的,開放原始碼的分散式應用程式分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。它是一個為分散式應用提供一致性服務的軟體,提供的功能包括:配置維護、域名服務、分散式同步、組服務等。
ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。
ZooKeeper包含一個簡單的原語集,提供Java和C的介面。
ZooKeeper程式碼版本中,提供了分散式獨享鎖、選舉、佇列的介面,程式碼在$zookeeper_home\src\recipes。其中分佈鎖和佇列有Java和C兩個版本,選舉只有Java版本。
總結:Zookeeper負責服務的協調排程.當客戶端發起請求時,返回正確的伺服器地址.
centos安裝配置zookeeper
1. Zookeeper下載
網址: http://zookeeper.apache.org/releases.html
其他下載地址: http://mirrors.hust.edu.cn/apache/zookeeper/
2. Zookeeper安裝
安裝前提, 確保已經安裝了JDK環境 關於jdk的配置: [配置jdk]
上傳安裝檔案並解壓即可, 解壓命令 tar -xvf 包名.tar.gz
3. 修改配置檔案
在zookeeper解壓的根目錄下建立兩個目錄, data和log mkdir data log
進入conf目錄, 配置檔案就砸裡面, 裡面只有一個zoo_sample.cfg
的簡單位置檔案, 我們可以複製一份, 自己修改
假設複製檔名為zoo.cfg
, 編輯檔案如下
# 資料目錄, 即建立的data目錄
dataDir=/usr/local/src/zookeeper/data
# 日誌目錄, 即建立的log目錄
dataLogDir=/usr/local/src/zookeeper/log
# 埠號, 預設2181
clientPort=2181
4. 啟動zookeeper
跳轉到bin目錄中 zk啟動關閉命令如下.
# 可以在最後面跟上配置檔案的位置, 啟動指定配置檔案, 不加預設啟動zoo.cfg sh zkServer.sh start 或者 ./zkServer.sh start sh zkServer.sh stop sh zkServer.sh status
Zookeeper叢集搭建
為了方便測試, 在同一臺linux上使用不同埠號代表不同zookeeper主機, 埠號為2181, 2182, 2183
1. 準備資料夾
在zookeeper根目錄下建立zkCluster目錄, 此目錄為測試叢集目錄 mkdir zkCluster
在zkCluster目錄下, 建立zk1, zk2, zk3 目錄 mkdir zk1 zk2 zk3
分別在zk1, zk2, zk3 目錄中建立data和log目錄, 快捷指令 mkdir {zk1,zk2,zk3}/{data,log}
2. 新增myid檔案
關於myid檔案: myid的值是zoo.cfg檔案裡定義的server.A項A的值,Zookeeper 啟動時會讀取這個檔案,拿到裡面的資料與 zoo.cfg 裡面的配置資訊比較從而判斷到底是那個server,只是一個標識作用。
分別在zk1, zk3, zk2 中建立myid檔案, 檔案內容分別為 1, 2, 3 數字, 為服務的編號
3. 編輯配置檔案
我們首先建立一個配置檔案, 修改之後複製三份, 節省時間
進入conf目錄, 將zoo_sample.cfg複製為zoo1.cfg, 然後對其進行修改
使用vim等工具開啟zoo1.cfg, 修改內容如下:
# 資料目錄
dataDir=/usr/local/src/zookeeper/zkCluster/zk1/data
# 日誌目錄
dataLogDir=/usr/local/src/zookeeper/zkCluster/zk1/log
# 埠號
clientPort=2181
# 配置叢集
# server.myid檔案編號=ip地址:LF通訊埠:選舉埠
# 如果3個zookeeper不在同一臺伺服器, 通訊埠和選舉埠一樣也沒有關係, ip不同即可
server.1=192.168.126.129:2887:3887
server.2=192.168.126.129:2888:3888
server.3=192.168.126.129:2889:3889
修改完成之後, 我們把此檔案再次複製為zoo2.cfg和zoo3.cfg, 然後修改對應的dataDir
, dataLogDir
, clientPort
即可
關於配置檔案的詳細介紹如下:
①、tickTime:基本事件單元,這個時間是作為Zookeeper伺服器之間或客戶端與伺服器之間維持心跳的時間間隔,每隔tickTime時間就會發送一個心跳;最小 的session過期時間為2倍tickTime
②、dataDir:儲存記憶體中資料庫快照的位置,除非另有說明,否則指向資料庫更新的事務日誌。注意:應該謹慎的選擇日誌存放的位置,使用專用的日誌儲存裝置能夠大大提高系統的效能,如果將日誌儲存在比較繁忙的儲存裝置上,那麼將會很大程度上影像系統性能。
③、client:監聽客戶端連線的埠。
④、initLimit:允許follower連線並同步到Leader的初始化連線時間,以tickTime為單位。當初始化連線時間超過該值,則表示連線失敗。
⑤、syncLimit:表示Leader與Follower之間傳送訊息時,請求和應答時間長度。如果follower在設定時間內不能與leader通訊,那麼此follower將會被丟棄。
⑥、server.A=B:C:D
A:其中 A 是一個數字,表示這個是伺服器的編號;
B:是這個伺服器的 ip 地址;
C:Leader選舉的埠;
D:Zookeeper伺服器之間的通訊埠。
4. 啟動叢集
通過下面的命令按順序啟動zk叢集 (在bin目錄下, 其3個配置檔案都在conf目錄下)
sh zkServer.sh start ../conf/zoo1.cfg
sh zkServer.sh stop ../conf/zoo2.cfg
sh zkServer.sh status ../conf/zoo3.cfg
如果啟動失敗, 說明配置檔案有問題, 重新配置修改即可
然後使用 sh zkServer.sh status ../conf/zoo1.cfg
分別檢測執行狀態
結果如下:
[root@localhost bin]# sh zkServer.sh status ../conf/zoo1.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo1.cfg
Client port found: 2181. Client address: localhost.
Mode: follower
[root@localhost bin]# sh zkServer.sh status ../conf/zoo2.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo2.cfg
Client port found: 2182. Client address: localhost.
Mode: leader
[root@localhost bin]# sh zkServer.sh status ../conf/zoo3.cfg
ZooKeeper JMX enabled by default
Using config: ../conf/zoo3.cfg
Client port found: 2183. Client address: localhost.
Mode: follower
如圖:
可見, 按順序啟動後, 2為主機, 1和3為從機,
我們試著把第二臺主機關閉(假設宕機) sh zkServer.sh stop ,,/conf/zoo2.cfg
關閉後發現3為主機, 1為從機
這和zookeeper的選舉機制有關
zookeeper選舉機制
- zk選舉採用最大值(myid)優先的機制.
- 超過半數以上人數同意即可成為領導者(主機)
- 只有當主機宕機後(心跳檢測結果為宕機), 才會重新選舉, 即有領導者的時候, 即使新添加了主機, 也不會選舉
圖解
(按順序啟動1,2,3)
選舉案例
目前有5臺伺服器,每臺伺服器均沒有資料,它們的編號分別是1,2,3,4,5,按編號依次啟動,它們的選擇舉過程如下:
- 伺服器1啟動,給自己投票,然後發投票資訊,由於其它機器還沒有啟動所以它收不到反饋資訊,伺服器1的狀態一直屬於Looking(選舉狀態)。
- 伺服器2啟動,給自己投票,同時與之前啟動的伺服器1交換結果,由於伺服器2的編號大所以伺服器2勝出,但此時投票數沒有大於半數,所以兩個伺服器的狀態依然是LOOKING。
- 伺服器3啟動,給自己投票,同時與之前啟動的伺服器1,2交換資訊,由於伺服器3的編號最大所以伺服器3勝出,此時投票數正好大於半數,所以伺服器3成為領導者,伺服器1,2成為小弟。
- 伺服器4啟動,給自己投票,同時與之前啟動的伺服器1,2,3交換資訊,儘管伺服器4的編號大,但之前伺服器3已經勝出,所以伺服器4只能成為小弟。
- 伺服器5啟動,後面的邏輯同伺服器4成為小弟。
選舉結果: 伺服器3為主機
當3宕機, 5為主機,
當5宕機, 4為主機,
當4宕機, 叢集徹底崩潰,
1和2永遠無法成為主機