分布式協(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集群