ZooKeeper集群操作及集群Master選舉搭建啟動
ZooKeeper介紹
ZooKeeper
是一個為 分布式應用 提供的 分布式 、開源的 協(xié)調(diào)服務 。
它公開了一組簡單的 原語 ,分布式應用程序可以根據(jù)這些原語來實現(xiàn)用于 同步 、配置維護 以及 命名 的更高級別的服務。
怎么理解協(xié)調(diào)服務呢?比如我們有很多應用程序,他們之間都需要讀寫維護一個 id ,那么這些 id 怎么命名呢,程序一多,必然會亂套,ZooKeeper
能協(xié)調(diào)這些服務,解決命名、配置、同步等問題,而做到這些,只需要一組簡單的 原語 即可:
create : 在樹中的某個位置創(chuàng)建一個節(jié)點
delete : 刪除一個節(jié)點
exists : 測試節(jié)點是否存在于某個位置
get data : 從節(jié)點讀取數(shù)據(jù)
set data : 往一個節(jié)點里寫入數(shù)據(jù)
get children : 檢索節(jié)點的子節(jié)點列表
sync : 等待數(shù)據(jù)被傳播
從這些 ZooKeeper
(以下簡稱ZK)的 API 可以看到,都是圍繞 Node 來操作,下文實操看一下怎么操作 Node 。
ZooKeeper特征
- 簡單
ZooKeeper
允許分布式進程通過 共享的層級命名空間 相互協(xié)調(diào),該命名空間的組織類似于標準文件系統(tǒng)。
命名空間由數(shù)據(jù)寄存器組成,在 ZooKeeper
稱為 znodes ,它們類似于文件和目錄。
與典型的文件系統(tǒng)不同,它是為 存儲 而設計的,ZooKeeper
數(shù)據(jù)保存在 內(nèi)存 中,這意味著ZooKeeper
可以實現(xiàn) 高吞吐量 和 低延遲數(shù) 。
ZooKeeper
很重視 高性能,高可用性 ,嚴格有序訪問 :性能高意味著它可以在大型分布式系統(tǒng)中使用;而他又具備可靠性,這使它不會成為單點故障;嚴格的排序意味著可以在客戶端上實現(xiàn)復雜的同步原語。
- 可被復制(高可用)
像它協(xié)調(diào)的分布式進程一樣,ZooKeeper
本身也可以在稱為集合的一組主機上進行復制。
組成ZooKeeper
服務的服務器都必須彼此了解。它們維護內(nèi)存中的狀態(tài)鏡像,以及持久存儲中的事務日志和快照。只要大多數(shù)服務器可用,ZooKeeper
服務將可用。
客戶端連接到單個 ZooKeeper
服務器。客戶端維護一個 TCP連接 ,通過該連接發(fā)送請求,獲取響應,獲取監(jiān)視事件并發(fā)送心跳。如果與服務器的 TCP連接 斷開,則客戶端將連接到其他服務器。
- 有序的
ZooKeeper
用一個反映所有 ZooKeeper
事務順序 的數(shù)字標記每個更新。后續(xù)操作可以使用該命令來實現(xiàn)更高級別的抽象,例如 同步 、 分布式鎖 。
- 快
在 讀取為主 的工作負載中,它特別快。
ZooKeeper
應用程序可在數(shù)千臺計算機上運行,并且在讀取比寫入更常見的情況下,其性能最佳,比率約為10:1。
分層命名空間
ZooKeeper提供的名稱空間與標準文件系統(tǒng)的名稱空間非常相似。
名稱是由 斜杠 (/
)分隔的一系列路徑元素。ZooKeeper
命名空間中的每個節(jié)點均由路徑標識。
一個 ZK Node 可以存儲 1M 數(shù)據(jù),Node分為 持久節(jié)點 和 臨時性節(jié)點 。
- 持久節(jié)點
與標準文件系統(tǒng)不同,ZooKeeper
命名空間中的每個節(jié)點都可以具有與其關聯(lián)的 數(shù)據(jù) 以及 子節(jié)點 。就像擁有一個文件系統(tǒng)一樣,該文件系統(tǒng)也允許文件成為目錄。
ZooKeeper旨在存儲協(xié)調(diào)數(shù)據(jù):狀態(tài)信息,配置,位置信息等,因此存儲在每個節(jié)點上的數(shù)據(jù)通常很小,在字節(jié)到千字節(jié)范圍內(nèi)。
Znodes
維護一個統(tǒng)計信息結(jié)構(gòu),其中包括用于 數(shù)據(jù)更改 ,ACL更改(權(quán)限控制) 和 時間戳的版本號 ,以允許進行 緩存驗證
和 協(xié)調(diào)更新
。
Znode
的數(shù)據(jù)每次更改時,版本號都會增加。例如,每當客戶端檢索數(shù)據(jù)時,它也會接收數(shù)據(jù)的版本。
原子地讀取和寫入存儲在名稱空間中每個 Znode
上的數(shù)據(jù)。讀取將獲取與znode關聯(lián)的所有數(shù)據(jù)字節(jié),而寫入將替換所有數(shù)據(jù)。每個節(jié)點都有一個訪問控制列表(ACL),用于限制誰可以做什么。
- 臨時節(jié)點
只要創(chuàng)建 Znode
的會話處于 活動狀態(tài) ,這些 Znode
就一致存在。會話結(jié)束時,將刪除 Znode
,這就是臨時節(jié)點。
類比于web容器比如tomcat的session,創(chuàng)建臨時節(jié)點的session存在,則node存在,session結(jié)束,刪除node。
以上是理論知識,還是實際操作一遍比較靠譜,理解一下zk創(chuàng)建連接、node、session這些概念,以及看看zk集群的leader出故障后,選出leader的速度。
搭建ZK集群
首先準備 4 臺 CentOS 7 虛擬機,都安裝好了JDK 8(JDK版本最好不要小于8)。
這四臺虛擬機主機名稱分別設置為:zknode01
、zknode02
、zknode03
、zknode04
。
hostnamectl set-hostname zknode01
主機名在配置 ZooKeeper
集群的時候有用。
主機名稱配置好之后,還需要配置主機名和IP地址的映射關系,每臺主機均編輯 /etc/hosts
文件,末尾添加如下內(nèi)容:
192.168.242.11 zknode01
192.168.242.12 zknode02
192.168.242.13 zknode03
192.168.242.14 zknode04
保證每臺主機都能互相 ping 通:
接下來,先安裝配置好其中一臺服務器的 ZooKeeper
,然后用 scp
分發(fā)到各個服務器,再分別修改 zk server
的 id ,這樣不用每臺虛擬機都執(zhí)行一遍相同的操作。
下載zk,注意一定要是apache-zookeeper-3.7.1-bin.tar.gz
這個帶bin
的,否則如果不是帶bin的,啟動的時候會報如下錯誤:
Error: Could not find or load main class org.apache.zookeeper.server.quorum.QuorumPeerMain Caused by: java.lang.ClassNotFoundException: org.apache.zookeeper.server.quorum.QuorumPeerMain
保姆式安裝zk步驟:
將下載好的 apache-zookeeper-3.7.1-bin.tar.gz 放到/opt目錄下
1. cd /opt
2. tar xf apache-zookeeper-3.7.1-bin.tar.gz
3. mv apache-zookeeper-3.7.1-bin zookeeper
4. vi /etc/profile
export JAVA_HOME=/usr/local/java
export ZK_HOME=/opt/zookeeper
export PATH=$PATH:$JAVA_HOME/bin:$ZK_HOME/bin
5. source /etc/profile
6. cd /opt/zookeeper/conf
7. cp zoo_sample.cfg zoo.cfg
8. vi zoo.cfg
設置 dataDir=/var/zookeeper
末尾添加:
server.1=zknode01:2888:3888
server.2=zknode02:2888:3888
server.3=zknode03:2888:3888
server.4=zknode04:2888:3888
9. mkdir -p /var/zookeeper
10. echo 1 > /var/zookeeper/myid
這樣 zknode01
的 zkserver 就搭建好了,現(xiàn)在將 ZooKeeper目錄 和 配置文件 分發(fā)到其余三臺服務器:
# 傳到 zknode02 scp -r /opt/zookeeper/ root@zknode02:/opt/ scp /etc/profile root@zknode02:/etc # 傳到 zknode03 scp -r /opt/zookeeper/ root@zknode03:/opt/ scp /etc/profile root@zknode03:/etc # 傳到 zknode04 scp -r /opt/zookeeper/ root@zknode04:/opt/ scp /etc/profile root@zknode04:/etc
別忘了 ,每臺主機都需要執(zhí)行 source /etc/profile
和創(chuàng)建 /var/zookeeper/myid
文件,myid 的內(nèi)容分別為 2,3,4 。
這樣 zk集群 就搭建好了。
啟動zk集群
按順序啟動 zknode01
,zknode02
,zknode03
,zknode04
的zk服務:
zkServer.sh start-foreground
zk默認后臺啟動,start-foreground
表示前臺啟動,方便看日志。
啟動zknode01的zk server:
會報錯,因為 zoo.cfg
配置了4臺主機,其余三臺還未啟動,接著啟動 zknode02
的:
現(xiàn)象同 zknode01
,繼續(xù)啟動第三臺:
這個時候也會報 zknode04
連接不上(因為還沒啟動),但是整個zk集群已經(jīng)啟動了,并且選擇了 zknode03
這個為leader。
把 zknode04
也啟動一下:
啟動完成后,開一個 zknode01
的zk客戶端:
zkCli.sh [zk: localhost:2181(CONNECTED) 0] help ZooKeeper -server host:port -client-configuration properties-file cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth close config [-c] [-w] [-s] connect host:port create [-s] [-e] [-c] [-t ttl] path [data] [acl] delete [-v version] path deleteall path [-b batch size] delquota [-n|-b] path get [-s] [-w] path getAcl [-s] path getAllChildrenNumber path getEphemerals path history listquota path ls [-s] [-w] [-R] path printwatches on|off quit
用上面的命令操作一波:
[zk: localhost:2181(CONNECTED) 1] ls ls [-s] [-w] [-R] path [zk: localhost:2181(CONNECTED) 2] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 3] [zk: localhost:2181(CONNECTED) 3] create /laogong Created /laogong [zk: localhost:2181(CONNECTED) 4] ls / [laogong, zookeeper] [zk: localhost:2181(CONNECTED) 5] get /laogong null [zk: localhost:2181(CONNECTED) 6] create /laogong "laogong" Node already exists: /laogong [zk: localhost:2181(CONNECTED) 7] delete /laogong [zk: localhost:2181(CONNECTED) 8] ls / [zookeeper] [zk: localhost:2181(CONNECTED) 9] create /laogong "laogong" Created /laogong [zk: localhost:2181(CONNECTED) 10] ls / [laogong, zookeeper] [zk: localhost:2181(CONNECTED) 11] get /laogong laogong [zk: localhost:2181(CONNECTED) 12] create /laogong/laopo "laopo" Created /laogong/laopo [zk: localhost:2181(CONNECTED) 13] ls / [laogong, zookeeper] [zk: localhost:2181(CONNECTED) 14] ls /laogong [laopo] [zk: localhost:2181(CONNECTED) 15] get /laogong/laopo laopo [zk: localhost:2181(CONNECTED) 16]
上面的操作我都是在 zknode01
上面連接zk進行操作的,來看一下,在其他zkserver上有沒有同步過來數(shù)據(jù):
發(fā)現(xiàn)數(shù)據(jù)已經(jīng)同步,zknode03
和 zknode04
數(shù)據(jù)也同步了。
再來看一下連接 zknode02
的連接狀態(tài):
[root@zknode02 ~]# netstat -natp | egrep '(2888|3888)' tcp6 0 0 192.168.242.12:3888 :::* LISTEN 9530/java tcp6 0 0 192.168.242.12:3888 192.168.242.13:47474 ESTABLISHED 9530/java tcp6 0 0 192.168.242.12:37804 192.168.242.13:2888 ESTABLISHED 9530/java tcp6 0 0 192.168.242.12:3888 192.168.242.14:47530 ESTABLISHED 9530/java tcp6 0 0 192.168.242.12:39666 192.168.242.11:3888 ESTABLISHED 9530/java
連接狀態(tài)分析:
上圖是從 zknode02
服務器查看的,通過查看每臺服務器,最終,zk集群的服務器每臺都 互相通信 。
這個 3888
端口就是選舉master用的,而 2888
端口是leader接受write請求用的。
zk集群master選舉
前面演示了有 4 個服務器的 zk集群 ,其中 zknode03
是 leader 。
現(xiàn)在我把 zknode03
服務干掉:
^C[root@zknode03 conf]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Client SSL: false. Error contacting service. It is probably not running. [root@zknode03 conf]# [root@localhost ~]#
再來分別看一下 zknode01
~ zknode04
的 zk server 狀態(tài):
可以看到 zknode04
自動成了 leader !
事實上,zk集群 選舉 leader 采用的是 謙讓
的辦法,誰的 id 大,選舉誰。
那么前面為什么zknode3是leader呢?
因為我啟動的順序是 zknode01
~ zknode04
啟動的,當 zknode03
的zk server 啟動的時候,已經(jīng) 滿足集群的最少節(jié)點數(shù) 了,而且 zknode03
的 id 是 當時
最大的,所以 zknode03
的 server自動成了 leader 。
以上就是ZooKeeper集群操作及集群Master選舉搭建啟動的詳細內(nèi)容,更多關于ZooKeeper集群操作選舉的資料請關注腳本之家其它相關文章!
相關文章
springboot實現(xiàn)全局異常處理及自定義異常類
這篇文章主要介紹了springboot實現(xiàn)全局異常處理及自定義異常類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02Spring?Aop+Redis實現(xiàn)優(yōu)雅記錄接口調(diào)用情況
通常情況下,開發(fā)完一個接口,無論是在測試階段還是生產(chǎn)上線,我們都需要對接口的執(zhí)行情況做一個監(jiān)控,所以本文為大家整理了Spring統(tǒng)計接口調(diào)用的多種方法,希望對大家有所幫助2023-06-06IntelliJ-Idea導出可執(zhí)行Jar流程解析
這篇文章主要介紹了IntelliJ-Idea導出可執(zhí)行Jar流程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-12-12Android應用開發(fā)的一般文件組織結(jié)構(gòu)講解
這篇文章主要介紹了Android應用開發(fā)的一般文件組織結(jié)構(gòu)講解,同時附帶介紹了一個獲取Android的文件列表的方法,需要的朋友可以參考下2015-12-12Spring Boot 項目創(chuàng)建的詳細步驟(圖文)
這篇文章主要介紹了Spring Boot 項目創(chuàng)建的詳細步驟(圖文),這里我們有兩種創(chuàng)建Spring Boot項目的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05