ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。由于ZooKeeper的开源特性,后来我们的开发者在分布式锁的基础上,摸索了出了其他的使用方法:配置维护、组服务、分布式消息队列、分布式通知/协调等。
注意:ZooKeeper性能上的特点决定了它能够用在大型的、分布式的系统当中。从可靠性方面来说,它并不会因为一个节点的错误而崩溃。除此之外,它严格的序列访问控制意味着复杂的控制原语可以应用在客户端上。ZooKeeper在一致性、可用性、容错性的保证,也是ZooKeeper的成功之处,它获得的一切成功都与它采用的协议——Zab协议是密不可分的。
ZooKeeper在实现这些服务时,首先它设计一种新的数据结构——Znode,然后在该数据结构的基础上定义了一些原语,也就是一些关于该数据结构的一些操作。有了这些数据结构和原语还不够,因为我们的ZooKeeper是工作在一个分布式的环境下,我们的服务是通过消息以网络的形式发送给我们的分布式应用程序,所以还需要一个通知机制——Watcher机制。那么总结一下,ZooKeeper所提供的服务主要是通过:数据结构+原语+watcher机制,三个部分来实现的。
我们今天要搭建的zookeeper服务想需要用三台虚拟机来进行搭建;
Zookeeper 的工作原理 zookeeper 的核心是原子广播,使用这个机制保证各个 Server 间的同步,实现原子广播的协议叫做 Zab 协议 Zab 协议有两种模式:恢复模式(选主)和广播模式(同步),当服务启动或 Leader 宕机,Zab 就进入恢复模式,一旦 Leader 被选举出来,且大多数 Server 完成 Leader 状态同步后,即进入广播模式 每个工作中的 Server 都有三种工作状态: LOOKING -- 搜寻 Leader LEADING -- 当前 Server 是集群 Leader FOLLOWING -- Leader 已经选举出,当前 Server 节点与 Leader 同步
1.软件的准备;jdk搭建java环境;
[root@01 zookeeper]# ls jdk-8u66-linux-x64.rpm zookeeper-3.4.10.tar
2.查看java环境是否处在 java-version,没有的话需要安装jdk软件包;
3.解压zookeeper包,并移动到usr下生成相关文件;
[root@01 zookeeper]# tar xf zookeeper-3.4.10.tar ^C [root@01 zookeeper]# mv zookeeper-3.4.10 /usr/local/zookeeper
4.为了标准化管理,我们在opt目录下创建zookeeper相关的配置文件、日志文件、数据文件;
进入到usr/local/zookeeper目录
mkdir -p /opt/zookeeper/{conf,logs,data}
cp conf/zoo_sample.cfg /opt/zookeeper/conf/zoo.cfg 拷贝usr文件到我们的opt文件里生成配置文件
5.修改日志文件
[root@vlnx251104 zookeeper]# vim conf/log4j.properties
6.修改其他配置文件
[root@vlnx251104 zookeeper]# vim bin/zkEnv.sh
#if [ "x$ZOOCFG" = "x" ]
#then
# ZOOCFG="zoo.cfg"
#fi
47 ZOOCFG="/opt/zookeeper/conf/zoo.cfg" 48 49 if [ -f "$ZOOCFGDIR/java.env" ] 50 then 51 . "$ZOOCFGDIR/java.env" 52 fi 53 54 if [ "x${ZOO_LOG_DIR}" = "x" ] 55 then 56 ZOO_LOG_DIR="/opt/zookeeper/logs" 57 fi 58 59 if [ "x${ZOO_LOG4J_PROP}" = "x" ] 60 then 61 ZOO_LOG4J_PROP="INFO,ROLLINGFILE" 62 fi
7.注释掉bin/zkServer.sh里面的部分内容
82 #fi 83 # 84 #if [ "x$2" != "x" ] 85 #then 86 # ZOOCFG="$ZOOCFGDIR/$2" 87 #fi 88 # 89 ## if we give a more complicated path to the config, don't screw around in $ZOOC FGDIR 90 #if [ "x$(dirname "$ZOOCFG")" != "x$ZOOCFGDIR" ] 91 #then 92 # ZOOCFG="$2" 93 #fi
8.创建一个编号文件
9. ./bin/zkServer.sh start 启动zookeeper
[root@01 zookeeper]# echo 1 > /opt/zookeeper/data/myid
到这里我们单台的zookeeper就完成了,接下来我们要做的就是把这台虚拟机的配置文件拷给另外两台虚拟机
[root@vlnx251104 zookeeper]# echo 1 > /opt/zookeeper/data/myid [root@vlnx251104 zookeeper]# scp -r /usr/local/zookeeper/ 192.168.251.105:/usr/local/ [root@vlnx251104 zookeeper]# scp -r /usr/local/zookeeper/ 192.168.251.106:/usr/local/ [root@vlnx251104 zookeeper]# scp -r /opt/zookeeper/ 192.168.251.105:/opt/ [root@vlnx251104 zookeeper]# scp -r /opt/zookeeper/ 192.168.251.106:/opt/
[root@vlnx251104 zookeeper]# echo 1 > /opt/zookeeper/data/myid [root@vlnx251105 ~]# echo 2 > /opt/zookeeper/data/myid [root@vlnx251106 ~]# echo 3 > /opt/zookeeper/data/myid
测试:
[root@01 zookeeper]# ./bin/zkCli.sh Connecting to localhost:2181 Welcome to ZooKeeper! JLine support is enabled WATCHER:: WatchedEvent state:SyncConnected type:None path:null [zk: localhost:2181(CONNECTED) 0]