分布式協調技術是用來解決分布式環境中多個進程間的同步控制,使他們能有序的訪問某種臨界資源,防止造成“臟數據”的後果,分布式並不是壹個簡單的調度算法就能輕易解決的,這是壹種誤解。如果進程全部是在壹臺機器上確實這麽久好辦,但是出於分布式的環境下該怎麽解決呢?
給大家分析壹下這個圖,圖中的三臺機器,每個程序個跑壹個應用程序,通過網絡圖將此連接起來,構成壹個系統為用戶提供服務,對用戶來說這是個透明的架構的系統,我們可以把這個系統稱之為分布式系統。
在分析壹下這個分布式系統是如何對進程進行調度,假設在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集群