1.zookeeper是分布式系统中必不可少的组件,主要有以下四大优势:
1.名字服务
zookeeper名字服务可分为两个应用:
1.类似JNDI功能,利用zookeeper的分层结构可以把分布式系统中各种服务器的名称、地址以及目录信息存放在zookeeper中,当我们需要是可以从zookeeper中读取。
2.可以利用zookeeper循环节点的特性,在分布式环境下,可以生成有规律的唯一id编号。
2.配置管理
简单来说就是可以保证,配置文件在集群中的一致性。比如,当我们修改某一台服务器的配置文件时,zookeeper会监听到这个操作,把集群中其它服务器的配置文件也一块修改,从而实现集群配置文件的一致性。
3.分布式锁
在一个分布式系统环境中,集群中的每台服务器都提供着相同的服务,若一个工作需要由多个服务器去做的话,服务器之前就必须要协调,就会增加编程的复杂程度,但若是只用一个服务器来做的话,又可能会发生单点故障。因此比较好的做法就是使用zookeeper提供的分布式锁,先让某一个服务器做这件事情,当这台服务器宕机的时候释放锁,由其他服务器完成。这种方法也叫leader选举
4.集群管理
简单来说就是在分布式集群中,zookeeper会检测新老节点的增加和退出。
2.zookeeper的工作流程
简单来说就是:zookeeper集群启动后,client会连接到其中的一个节点,这个节点可以是leader或follower,连通后,节点会分配一个sessionId给client,发送ack回复消息给client,若客户端没有收到ack消息,则会连接下一个节点。client会周期性发送心跳给当前节点,保证与当前节点的链接不会丢失。若client需要读取数据,发送请求给节点,节点会返回数据给client,若client修改数据,需将数据和路径发给service,service转发给leader,leader再发给所有的follower,只有当follower节点超过半数响应成功,则会操作成功。
3.zookeeper环境安装及使用
一、单机安装
1.1 下载
进入要下载的版本的目录,选择.tar.gz文件下载
下载链接:http://archive.apache.org/dist/zookeeper/
1.2 安装
使用tar解压要安装的目录即可,以3.4.5版本为例
这里以解压到/usr/myapp,实际安装根据自己的想安装的目录修改(注意如果修改,那后边的命令和配置文件中的路径都要相应修改)
tar -zxf zookeeper-3.4.5.tar.gz -C /usr/myapp
1.3 配置
在主目录下创建data和logs两个目录用于存储数据和日志:
cd /usr/myapp/zookeeper-3.4.5 mkdir data mkdir logs
在conf目录下新建zoo.cfg文件,写入以下内容保存:
tickTime=2000 dataDir=/usr/myapp/zookeeper-3.4.5/data dataLogDir=/usr/myapp/zookeeper-3.4.5/logs clientPort=2181
1.4 启动和停止
进入bin目录,启动、停止、重启分和查看当前节点状态(包括集群中是何角色)别执行:
./zkServer.sh start ./zkServer.sh stop ./zkServer.sh restart ./zkServer.sh status
二、集群模式
集群模式就是在不同主机上安装zookeeper然后组成集群的模式;下边以在192.168.220.128/129/130三台主机为例。
将第1.1到1.3步中安装好的zookeeper打包复制到129和130上,并都解压到同样的目录下。
2.1 conf/zoo.cfg文件修改
三个zookeeper的conf/zoo.cfg修改如下:
tickTime=2000 dataDir=/usr/myapp/zookeeper-3.4.5/data dataLogDir=/usr/myapp/zookeeper-3.4.5/logs clientPort=2181 initLimit=5 syncLimit=2 server.1=192.168.220.128:2888:3888 server.2=192.168.220.129:2888:3888 server.3=192.168.220.130:2888:3888
对于129和130,由于安装目录都是zookeeper-3.4.5所以dataDir和dataLogDir不需要改变,又由于在不同机器上所以clientPort也不需要改变
所以此时129和130的conf/zoo.cfg的内容与128一样即可。
2.2 data/myid文件修改
128 data/myid修改如下:
echo '1' > data/myid
129 data/myid修改如下:
echo '2' > data/myid
130 data/myid修改如下:
echo '3' > data/myid