當前位置:名人名言大全網 - 短信平臺 - 消息隊列之zookeeper

消息隊列之zookeeper

分布式協調技術----zookeeper

分布式協調技術是用來解決分布式環境中多個進程間的同步控制,使他們能有序的訪問某種臨界資源,防止造成“臟數據”的後果,分布式並不是壹個簡單的調度算法就能輕易解決的,這是壹種誤解。如果進程全部是在壹臺機器上確實這麽久好辦,但是出於分布式的環境下該怎麽解決呢?

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

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

分布式做的比較好的就是Google的Chubby和Apache的Zookeeper,Chubby是非開源的,後來雅虎模仿Chubby開發出了Zookeeper,也實現了類似的分布式功能,並把zookeeper作為開源程序捐給了Apache。Zookeeper用來構建我們的系統,不僅Bug少而且節約成本。

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

(1)給Zookeeper起了倆主節點,主節點-A master-00001,主節點-B master-00002,啟動後都像zookeeper註冊壹個節點,主節點-A變成了主節點,主節點-B變成了備用節點,對倆Master進程進行調度。

(2)主節點-A掛了,它註冊的節點被自動刪除,感知節點發起選舉,經過選舉後主節點-B變成了主節點,替代了主節點-A。

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

安裝配置步驟:

試驗機器: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 ? #查節點狀態

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