Zookeeper 基礎學習
Zookeeper 官網: http://zookeeper.apache.org/ 注:以下操作在CentOS7環境操作。
Zookeeper 是 Apache 的一個分散式服務框架,是 Apache Hadoop 的一個子專案。官方文件上這麼解釋 Zookeeper,它主要是用來解決分散式應用中經常遇到的一些資料管理問題,如:統一命名服務、狀態同步服務、叢集管理、分散式應用配置項的管理等。簡單來說 zookeeper=檔案系統+監聽通知機制。
學前須知
Zoopeeker資料模型
https://zookeeper.apache.org/doc/r3.6.4/zookeeperOver.html
ZooKeeper 資料模型採用層次化的多叉樹形結構,每個節點上都可以儲存資料,這些資料可以是數字、字串或者是二進位制序列。並且。每個節點還可以擁有 N 個子節點,最上層是根節點以“/”來代表。每個資料節點在 ZooKeeper 中被稱為 Znode,它是 ZooKeeper 中資料的最小單元。並且,每個 znode 都有一個唯一的路徑標識。
Znode
https://javaguide.cn/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.html#znode-資料節點
在 Zookeeper 中,znode 是一個跟 Unix 檔案系統路徑相似的節點,可以向節點儲存資料或者獲取資料。Zookeeper 底層是一套資料結構。這個儲存結構是一個樹形結構,其上的每一個節點,我們稱之為 “Znode”。
其中每一個 Znode 預設能夠儲存 1MB 的資料(Zookeeper主要是協調服務的,而不是用來儲存業務資料的,所以不要放比較大的資料)
Znode 節點的 4 中不同的型別:
PERSISTENT-持久化目錄節點
客戶端與 zookeeper 斷開連線後,該節點依舊存在。
PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點
客戶端與 zookeeper 斷開連線後,該節點依舊存在,只是 Zookeeper 給該節點名稱進行順序編號。
EPHEMERAL-臨時目錄節點
客戶端與 zookeeper 斷開連線後,該節點被刪除。
EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點
客戶端與 zookeeper 斷開連線後,該節點被刪除,只是 Zookeeper 給該節點名稱進行順序編號。
監聽通知機制
ZooKeeper使用了一種類似於觀察者設計模式的方法來實現實時的資料變化通知機制。當客戶端註冊監聽它關心的目錄節點(ZNode)時,如果該目錄節點發生了變化(如資料改變、被刪除、子節點增加或刪除),ZooKeeper會透過Watcher機制通知客戶端
零、環境安裝
(一)、安裝單機版本
首先準備一個Linux作業系統,可以是雲伺服器或者是虛擬機器。
1、上傳Zookeeper對應版本的壓縮包並解壓
# 解壓
tar -zxf apache-zookeeper-3.6.0-bin.tar.gz
# 如果以前使用過其它版本可以檢視並停止
ps -ef | grep zookeeper
kill -9 (id)
2、目錄結構
bin:放置執行指令碼和工具指令碼,
conf:zookeeper 預設讀取配置的目錄,裡面會有預設的配置檔案
docs:zookeeper 相關的文件
lib:zookeeper 核心的 jar
logs(預設沒有這個目錄):zookeeper 日誌
3、配置Zookeeper
Zookeeper 在啟動時預設的去 conf 目錄下查詢一個名稱為 zoo.cfg 的配置檔案。在 zookeeper 應用目錄中有子目錄 conf。其中有配置檔案模板:zoo_sample.cfg。zookeeper 應用中的配置檔案為 conf/zoo.cfg。
# 使用複製指令先生成一個配置檔案
cp zoo_sample.cfg zoo.cfg
然後:修改配置檔案 zoo.cfg 中的 dataDir引數,指定了ZooKeeper例項的資料目錄,也就是ZooKeeper儲存其資料(如事務日誌和快照檔案)。
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/tmp/zookeeper # 修改為你建立的目錄 mkdir xxx
# 如
dataDir=/www/apache-zookeeper-3.6.0-bin/data
其餘引數:
clientPort:指定客戶端連線ZooKeeper服務埠。
tickTime:ZooKeeper的基本時間單位,以毫秒為單位。
initLimit:初始化階段允許的最大tick數。
syncLimit:同步階段允許的最大tick數。
4、啟動ZooKeeper
這裡可以使用預設啟動的方式,同時也可以透過指定配置檔案路徑來啟動。(該檔案在bin目錄下)
# 預設的會去 conf 目錄下載入 zoo.cfg 配置檔案
./zkServer.sh start
# 指定載入配置檔案
./zkServer.sh start 配置檔案的路徑。
啟動成功後logs目錄就會出現
5、停止ZooKeeper
./zkServer.sh stop
6、檢視ZooKeeper狀態
./zkServer.sh status
# 顯示資訊:
/usr/local/jdk1.8.0_144/bin/java
ZooKeeper JMX enabled by default
Using config: /www/apache-zookeeper-3.6.0-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: standalone
7、連線Zookeeper
注意配置檔案zoo.cfg中是否修改對應的客戶端連線埠號
# 連線成功輸出:
Welcome to ZooKeeper!
...
[zk: localhost:2181(CONNECTED) 0] [root@hcss-ecs-369d bin]#
連線方式一
當然呢,下面的檔案也在bin裡面,建議不知道的小夥伴可以自己找找,你只需要清楚是執行當前目錄下的sh所以找到就行了_
# 預設連線地址為本機地址,預設連線埠為 2181
./zkCli.sh
連線方式二
# 連線指定 IP 地址與埠
./zkCli.sh -server ip:port
檢視一下(後續會有指令介紹):
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper]
# Ctrl + C 退出
(二)、叢集安裝
1、基礎瞭解
首先Zookeeper 叢集中的角色主要有以下三類,這表示我們想要構建一個叢集是需要這些角色的即三個:
角色 | 說明 |
---|---|
Leader(領導者) | 為客戶端提供讀和寫的服務,負責投票的發起和決議,更新系統狀態。 |
Follower(跟隨者) | 為客戶端提供讀服務,如果是寫服務則轉發給 Leader。參與選舉過程中的投票。 |
Observer(觀察者) | 為客戶端提供讀服務,如果是寫服務則轉發給 Leader。不參與選舉過程中的投票,也不參與“過半寫成功”策略。在不影響寫效能的情況下提升叢集的讀效能。此角色於 ZooKeeper3.3 系列新增的角色。 |
2、叢集配置
(1)、首先
停止開始啟動的單體zookeeper,可以使用linux命令進行檢查,參考:1、上傳Zookeeper對應版本的壓縮包並解壓,或者確定啟動的情況下可以使用停止啟動的指令:./zkServer.sh stop
(2)、其次
使用 3 個 Zookeeper 應用搭建一個偽叢集(即透過不同部署在一臺伺服器上,使用不同埠區分)。客戶端監聽埠分別為:2181、2182、2183。投票選舉埠分別為 2881/3881、2882/3882、2883/3883。
這裡我們將已經解壓好的Zookeeper,複製三份放在一個新的目錄中,如叢集目錄(自己mkdir一個):zookeeperCluster
# 將 apache-zookeeper-3.6.0-bin 目錄 複製到對應的 ./zookeeperCluster 目錄中
cp -r apache-zookeeper-3.6.0-bin ./zookeeperCluster
為了利於叢集標識:
# 這裡我們透過移動的方式,將其改名為第一個 01,後續在複製 02 03
mv apache-zookeeper-3.6.0-bin zookeeper01
注意:如果是根據前面的單體複製過來的,已經建立的data還在,當然你可以刪除裡面的內容,如果直接看的叢集,就需要建立這個檔案,並且構建配置檔案 zoo.cfg
這裡和單體類似,我們先準備一個data目錄儲存 (參考:3、配置Zookeeper)
mkdir data # 我直接就在其根目錄下建立
# 複製準備配置檔案
cp zoo_sample.cfg zoo.cfg
# 複製另外兩個
cp -r zookeeper01 zookeeper02
cp -r zookeeper01 zookeeper03
(3)、再次
修改三個服務對應的配置檔案中的 dataDir 屬性地址為對應的路徑:
# 01
dataDir=/www/zookeeperCluster/zookeeper01/data
# 02
dataDir=/www/zookeeperCluster/zookeeper02/data
# 03
dataDir=/www/zookeeperCluster/zookeeper03/data
(4)、再次
在 Zookeeper 叢集中,每個節點需要一個唯一標識。這個唯一標識要求是自然數。且唯一標識儲存位置是:資料快取目錄(dataDir=/usr/local/zookeeper/data)的 myid 檔案中。
其中“資料快取目錄”為配置檔案 zoo.cfg 中的配置引數在 data 目錄中建立檔案 myid :
# 建立檔案
touch myid
# 為應用提供唯一標識。本環境中使用 1、2、3 作為每個節點的唯一標識。
vi myid
簡化方式為: echo [唯一標識] >> myid。 echo 命令為回聲命令,系統會將命令傳送的資料返回。 '>>'為定位,代表系統回聲資料指定傳送到什麼位置。 此命令代表系統回聲資料傳送到 myid 檔案中。 如果沒有檔案則建立檔案。
# 參考命令,即將內容 1 寫入 >> 後的檔案,如果檔案不存在則先建立檔案
echo 1 >> ./zookeeper01/data/myid
echo 2 >> ./zookeeper02/data/myid
echo 3 >> ./zookeeper03/data/myid
# 使用 cat 確定一下
cat ./zookeeper01/data/myid
(6)、最後
修改配置檔案 zoo.cfg - 設定監聽客戶端、投票、選舉埠
# 進行編輯
vim zoo.cfg
寫入下面內容(注意:server.[這裡的數字就是你對應myid中設定的值]):
注意:下面的服務所在的ip如果你是一臺伺服器部署就用localhost這樣不用設定安全組也可以測試是否成功,當然如果你使用的是對應的公網ip那就需要設定對應的安全組。
#服務埠根據應用做對應修改,zk01-2181,zk02-2182,zk03-2183
clientPort=2181
# 以下每一個服務都要加,相互之間要能找到對方,畢竟沒有使用nginx來找,只放在領導者,萬一領導者掛了=_=
server.1=服務所在的ip:2881:3881
server.2=服務所在的ip:2882:3882
server.3=服務所在的ip:2883:3883
檢查以下,沒有問題就可以啟動了:
# 啟動
zookeeper01/bin/zkServer.sh start
zookeeper02/bin/zkServer.sh start
zookeeper03/bin/zkServer.sh start
# 檢視狀態
zookeeper01/bin/zkServer.sh status
# 如果出現這個,看看是不是配置了公網ip沒有設定安全組
Error contacting service. It is probably not running.
可以看到下面效果就已經ok了:
(7)Observer 哪去了?
Observer 則需要進步修改配置,當然前提是你的版本 >= ZooKeeper3.3 。
# 修改配置檔案
server.1=localhost:2881:3881
server.2=localhost:2882:3882
server.3=localhost:2883:3883:observer # 這個表示你要將這個服務作為 觀察者
此時:
(8)、關於客戶端連線
前面提及了單體中有兩種連線方式,其中第二種方式發揮作用了,可以使用任何節點中的客戶端工具連線叢集中的任何節點:
# 這裡可以自行測試,比如使用第一個服務的客戶端連線第二個服務
./zkCli.sh -server 對應叢集中的一個服務的ip:對應埠
3、使用指令碼簡化叢集啟動和關閉
1、啟動
選擇一個合適的位置放置指令碼,這裡取決於檔案相對目錄
# 建立一個指令碼檔案
vim startall.sh
# 寫入內容
zookeeper01/bin/zkServer.sh start
zookeeper02/bin/zkServer.sh start
zookeeper03/bin/zkServer.sh start
# 賦予許可權,ll檢視許可權,並驗證
# 在 Linux 中可以使用 chmod 命令為檔案授權。
# 777 表示為檔案分配可讀,可寫,可執行許可權
chmod 777 startall.sh
# 使用ll命令檢視,檔案變綠一般就是可執行了
2、關閉
關閉同理
# 建立一個指令碼檔案
vim stopall.sh
# 寫入內容
zookeeper01/bin/zkServer.sh stop
zookeeper02/bin/zkServer.sh stop
zookeeper03/bin/zkServer.sh stop
# 賦予許可權,ll檢視許可權,並驗證
# 在 Linux 中可以使用 chmod 命令為檔案授權。
# 777 表示為檔案分配可讀,可寫,可執行許可權
chmod 777 stopall.sh
# 使用ll命令檢視,檔案變綠一般就是可執行了
# 驗證是否關閉
ps -ef | grep zookeeper