消息隊列之zookeeper

分布式協(xié)調(diào)技術----zookeeper

分布式協(xié)調(diào)技術是用來解決分布式環(huán)境中多個進程間的同步控制,使他們能有序的訪問某種臨界資源,防止造成“臟數(shù)據(jù)”的后果,分布式并不是一個簡單的調(diào)度算法就能輕易解決的,這是一種誤解。如果進程全部是在一臺機器上確實這么久好辦,但是出于分布式的環(huán)境下該怎么解決呢?


給大家分析一下這個圖,圖中的三臺機器,每個程序個跑一個應用程序,通過網(wǎng)絡圖將此連接起來,構(gòu)成一個系統(tǒng)為用戶提供服務,對用戶來說這是個透明的架構(gòu)的系統(tǒng),我們可以把這個系統(tǒng)稱之為分布式系統(tǒng)。

在分析一下這個分布式系統(tǒng)是如何對進程進行調(diào)度,假設在server1上掛載了一個資源,三個分布式的進程都要來競爭這個資源,但是又不希望他們同時訪問,此時就需要一個“協(xié)調(diào)器”,讓他們有序獲取資源,“協(xié)調(diào)器”則被稱為鎖。比如“進程-1”說明程序在使用該資源時會先獲取鎖,“進程1”獲取鎖就會對資源獨占,使用完將鎖釋放,讓其他進程來獲得鎖。這個鎖則是分布式鎖,也是分布式協(xié)調(diào)技術。

分布式做的比較好的就是Google的Chubby和Apache的Zookeeper,Chubby是非開源的,后來雅虎模仿Chubby開發(fā)出了Zookeeper,也實現(xiàn)了類似的分布式功能,并把zookeeper作為開源程序捐給了Apache。Zookeeper用來構(gòu)建我們的系統(tǒng),不僅Bug少而且節(jié)約成本。

Zookeeper的優(yōu)點是一種高可用、高性能且一直的開源協(xié)調(diào)工具。并且提供了“分布式鎖服務”,功能強大,可以配置維護、組服務、分布式通知及分布式消息隊列等。在性能方面它采用了Zab協(xié)議,數(shù)據(jù)結(jié)構(gòu)用的Znode,在數(shù)據(jù)結(jié)構(gòu)上定義了原語,通知機制用的Watcher機制,有嚴格的序列訪問控制,不會因為一個節(jié)點的錯誤而崩潰。

(1)給Zookeeper起了倆主節(jié)點,主節(jié)點-A master-00001,主節(jié)點-B master-00002,啟動后都像zookeeper注冊一個節(jié)點,主節(jié)點-A變成了主節(jié)點,主節(jié)點-B變成了備用節(jié)點,對倆Master進程進行調(diào)度。


(2)主節(jié)點-A掛了,它注冊的節(jié)點被自動刪除,感知節(jié)點發(fā)起選舉,經(jīng)過選舉后主節(jié)點-B變成了主節(jié)點,替代了主節(jié)點-A。


(3)Master恢復,它會在向zookeeper注冊一個節(jié)點master-00003,再次選舉后主節(jié)點-B依舊是主節(jié)點,主節(jié)點A變成了備用節(jié)點。


安裝配置步驟:

試驗機器:192.168.10.10 ? ? hostname:zk1

192.168.10.11 ?? hostname:zk2

192.168.10.12 ? ? hostname:zk3

1.安裝jdk

[^_^] ~# tar xf jdk-8u131-linux-x64.tar.gz -C /usr/local/

[^_^] ~# mkdir /usr/local/java

[^_^] java# mv jdk1.8.0_171 /usr/local/java

[^_^] ~# cat /etc/profile.d/java.sh

JAVA_HOME=/usr/local/java/jdk1.8.0_131

JRE_HOME=/usr/local/java/jdk1.8.0_131/jre

CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

export JAVA_HOME JRE_HOME CLASS_PATH

[^_^] ~# source /etc/profile.d/java.sh

驗證:java -version

2.安裝zookeeper

[^_^] ~# cat /etc/hosts

127.0.0.1? localhost localhost.localdomain localhost4 localhost4.localdomain4

::1? ? ? ? localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.36.10? zk1

192.168.36.11? zk2

192.168.36.12? zk3

[^_^] ~# cat /etc/profile.d/zk.sh

#Set Zookeeper Environment

export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.11

export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf

[^_^] ~# source /etc/profile.d/zk.sh

[^_^] ~#cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg

[^_^] ~#mkdir -p /usr/local/zookeeper/data/log

[^_^] ~#echo "1" >?/usr/local/zookeeper/data/myid ?? #三臺zookeeper的myid是不一樣的

[^_^] ~# egrep -v "^$|#" /usr/local/zookeeper-3.4.11/conf/zoo.cfg

tickTime=2000

initLimit=10

syncLimit=5

dataDir=/tmp/zookeeper

dataLogDir=/tmp/zookeeper/log

clientPort=2181 ? ?? #服務端口

server.1=zk1:2888:3888? #2888是follower連leader的端口,3888是選leader端口

server.2=zk2:2888:3888

server.3=zk3:2888:3888

[^_^] ~# cd /usr/local/zookeeper-3.4.11/bin/

[^_^] bin# ./zkServer.sh start? &

[^_^] bin#jps ? ? #查看是否啟動成功

1155 Jps

1093 QuorumPeerMain? #QuorumPeerMain是zookeeper進程

[^_^] bin# ./zkServer.sh status ? #查節(jié)點狀態(tài)

[^_^] bin#zkCli.sh -server zk1:2181,zk2:2181,zk3.:2181 ? #可以創(chuàng)建zk集群

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容