分布式协调技术----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集群