夜月 2017-06-19
Zookeeper有三种运行模式:单机模式、伪集群模式和集群模式。
安装zookeeper的先决条件是首先保证已安装Java运行环境。
zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件,是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper是以Fast Paxos算法为基础的,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader,只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。
zookeeper翻译成中文是”动物园管理员”,名字和他的功能十分相似,大家都去过动物园。动物园里有许多动物,游客可以通过动物园的提供的导航图到不同的馆参观各种类型的动物,比如大象馆、蟒蛇馆、熊猫馆等。而不是像走在原始森林丛林中一样,面对各种动物,惊胆颤的被动物所观赏。为了让不同的动物呆在他们应该呆的地方,而不是相互串门,相互厮杀。动物园需要选举出动物管理员,然后动物管理员按照动物的种类和动物的习性进行分类管理。把动物分配到不同的馆,然后提供动物园导航图给游客。这样游客才可以安心观赏动物。
回到我们企业的实际应用中。随着企业业务的不断增加,我们的企业级系统变得越来越庞大臃肿,性能急剧下降,客户抱怨频频。这时把臃肿的系统按照不同的业务拆分是目前目前我们可以解决系统的可扩展性、高可用性、和性能问题唯一行之有效的方法。但是拆分系统同时也带来了系统的复杂性。各子系统之间不是孤立的,而是彼此直接相互协作和交互。其实这就是我们说的分布式系统。如淘宝的一次购物体验不是一个系统全部完成的。而是多个系统协同合作,下单的动作需要用户系统的参与、支付需要支付宝参与、发货需要菜鸟网络参与等。各个系统好比动物园里的动物,为了使各个子系统能正常为用户提供统一的服务,必须需要一种机制来进行协调——这就是ZooKeeper“动物园管理员”。
ZooKeeper本质上是一个分布式的小文件存储系统。原本是Apache Hadoop的一个组件,现在被拆分为一个Hadoop的独立子项目,在Hbase(Hadoop的另外一个被拆分出来的子项目,用于分布式环境下的超大数据量的DBMS)中也用到了ZooKeeper集群。ZooKeeper有如下的特性:
ZooKeeper核心是一个精简的文件系统,它提供了一些简单的文件操作以及附加的功能,例如排序和通知。
ZooKeeper的数据结构原型是一棵znode树(类似Linux的文件系统),并且它们是一些已经被构建好的块,可以用来构建大型的协作数据结构和协议。
ZooKeeper可以运行在一组服务器上,同时它们被设计成高可用性,为你的应用程序避免单点故障。
ZooKeeper提供的Watcher机制使得各客户端与服务器的交互变得松耦合,每个客户端无需知晓其他客户端的存在,就可以和其他客户端进行数据交互。
ZooKeeper为开发人员提供了一套丰富的API,减轻了开发人员编写通用协议的负担。
# | os | hostname | ip | software | notes |
---|---|---|---|---|---|
1 | CentOS7 | apollo.dt.com | 192.168.56.181 | zookeeper | |
2 | CentOS7 | artemis.dt.com | 192.168.56.182 | zookeeper | |
3 | CentOS7 | uranus.dt.com | 192.168.56.183 | zookeeper |
[dtadmin@apollo~]$ sudo wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
#解压zookeeper [dtadmin@apollo~]$ sudo tar -zxvf zookeeper-3.4.10.tar.gz #把解压后的zookeeper移到目录/opt/zookeeper下 [dtadmin@apollo~]$ sudo mv zookeeper-3.4.10 /opt/zookeeper #拷贝/opt/zookeeper/conf/simple_zoo.cfg为 zoo.cfg [dtadmin@apollo~]$ sudo cp /opt/zookeeper/conf/simple_zoo.cfg zoo.cfg #编辑zoo.cfg [dtadmin@apollo~]$ sudo vim /opt/zookeeper/conf/zoo.cfg #修改内容如下 ticketTime=2000 #服务器之间或客户端与服务器之间维持心跳的时间间隔,每隔tickTime时间就会发送一个心跳。 initLimit=10 #配置 Zookeeper 接受客户端(此客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已超过initLimit个tickTime长度后 Zookeeper 服务器还没有收到客户端的返回信息,则表明客户端连接失败。总的时间长度就是 initLimit * tickTime 秒。 syncLimit=5 #配置 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 syncLimit * tickTime 秒。 clientPort=2181 #Zookeeper服务器监听的端口,以接受客户端的访问请求。 dataDir=/opt/zookeeper/data #Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。 #dataLogDir:若没提供的话则用dataDir。zookeeper的持久化都存储在这两个目录里。dataLogDir里是放到的顺序日志(WAL)。而dataDir里放的是内存数据结构的snapshot,便于快速恢复。为了达到性能最大化,一般建议把dataDir和dataLogDir分到不同的磁盘上,以充分利用磁盘顺序写的特性。 #server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,此端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。2888端口是zookeeper服务相互通信使用的,3888端口是zookeeper服务选举使用的 server.1=192.168.56.181:2888:3888 server.2=192.168.56.182:2888:3888 server.3=192.168.56.183:2888:3888
[root@apollo~]$ vim /etc/profile #添加如下内容 ZOOKEEPER_HOME=/opt/zookeeper PATH=$PATH:ZOOKEEPER_HOME/bin export ZOOKEEPER_HOME #保存修改 [root@apollo~]$ source /etc/profile
[root@apollo~]# scp -r /opt/zookeeper/ [email protected]:/opt/ [root@apollo~]# scp -r /opt/zookeeper/ [email protected]:/opt/
除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 上述dataDir 指定的目录下,这个文件里面就只有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是那个 server。
[root@apollo dtadmin~]# echo "1" >> /opt/zookeeper/data/myid [root@artemis dtadmin~]# echo "2" >> /opt/zookeeper/data/myid [root@uranus dtadmin~]# echo "3" >> /opt/zookeeper/data/myid
在ZooKeeper集群的每个结点上,执行启动ZooKeeper服务的脚本。
[root@apollo dtadmin~]# zkServer.sh start [root@artemis dtadmin~]# zkServer.sh start [root@uranus dtadmin~]# zkServer.sh start