ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,也是Hadoop和Hbase的重要组件 。ZooKeeper的选主过程是以Fast Paxos算法为基础的。前面我有文章写过Paxos算法,Paxos 算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos对Paxos进行了优化。通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos 。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解 。因为此算法的特性,所以要求Zookeeper集群的节点数最好为奇数个,而且算法保证如果集群中Leader宕机,只要剩余节点在总节点数的半数以上,就会重新选主,继续对外提供服务。也正是由于这个原因,使得Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理、命名、分布式同步、集群管理、数据库切换等服务,被广泛应用于分布式应用场景中。本人在工作中也使用了很久,故此记录一下。
首先准备环境:三个虚拟机,jdk1.8。
ip地址 | 系统 |
---|---|
192.168.31.135 | CentOS 7 |
192.168.31.136 | CentOS 7 |
192.168.31.137 | CentOS 7 |
1 . JDK安装
(1) . jdk 1.8下载地址:jdk-8u181-linux-x64.tar.gz 。进入官网后选择Linux 64位下载
创建一个用户文件夹
1 | mkdir /user/java |
将要下载好的jdk包上传到这个目录下,然后进入到这个目录执行如下命令
1 | tar -zxvf jdk-8u181-linux-x64.tar.gz |
解压缩包后 /user/java 会多出一个 jdk1.8.0_181文件夹。
(2) . 配置环境变量
使用vi命令编辑profile文件即可。如下
1 | vi /etc/profile |
下拉直文件底部,然后添加如下内容
1 | JAVA_HOME=/user/java/jdk1.8.0_181 |
然后保存退出。为验证是否安装成功,可输入两个命令 javac,java -version。在输入javac出现如下信息,而不是出现command not found 。
1 | [root@centos1 java]# javac |
然后再输入 java -version 出现如下信息则表示jdk已安装成功
1 | [root@centos1 java]# java -version |
(2) . Zookeeper下载
下载地址:zookeeper 。如下图
选择合适的版本,这里我下载的是3.4.10。点击即可下载
也可在CentOS中通过shell命令下载。命令如下
1 | wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz |
通过如下镜像网址,可选择合适的版本下载
下载完成后将tar包放到 /user/zookeeper下,此目录可自行定义
进入到该目录,解压缩
1 | tar -zxvf zookeeper-3.4.10.tar.gz |
再定义两个目录用于存放日志和数据
图中3.3.6是我之前安装的版本。具体命令如下
1 | mkdir zkdata #存放快照日志 |
(3) . 修改配置文件
进入到zookeeper的解压目录中,找到conf目录,查看
1 | [root@centos1 /]# cd /user/zookeeper/zookeeper-3.3.6/conf |
zoo_sample.cfg 这个文件是官方给我们的zookeeper的样板文件,给他复制一份命名为zoo.cfg,zoo.cfg是官方指定的文件命名规则。 这里我已经创建好了。zoo.cfg中配置信息如下
1 | # The number of milliseconds of each tick |
配置文件属性解释
1 | #tickTime: |
这个配置需要在每个zookeeper节点上配置,接下来在每个节点上分别创建myid文件
1 | server1 |
注意这里的1,2,3一定要和zoo.cfg配置文件中保持一致。
(4) . 日志配置
作为开发人员,日志对于我们来说重要性不言而喻了,一旦出现问题首先就要去查看日志。那么zookeeper的日志配置在哪呢。同样在conf下有个log4j.properties文件。内容如下
1 | [root@centos1 conf]# cat log4j.properties |
我们写代码时往往也会配置log4j ,因此会与zookeeper共用log4j的配置文件。所以需要修改这个配置文件,如下
1 | # Define some default values that can be overridden by system properties |
修改完成后,会发现日志文件输出目录不起作用。需修改zkEnv.sh 脚本,如下
1 | [root@centos1 conf]# cat /user/zookeeper/zookeeper-3.3.6/bin/zkEnv.sh |
找到配置ZOO_LOG_DIR以及ZOO_LOG4J_PROP的位置(大概在Line50,Line55) 。修改如下
1 | if [ "x${ZOO_LOG_DIR}" = "x" ] |
这样zookeeper的日志配置就完成了。
(5) . 启动Zookeeper
执行如下命令
1 | 进入到Zookeeper的bin目录下 |
查看服务状态
1 | ./zkServer.sh status |
通过该命令能看到如下信息则表示zookeeper已经成功启动
1 | 192.168.31.136 |
1 | 192.168.31.135 |
(6) . 常见问题
执行 ./zkServer.sh start 命令未出现异常,但是在执行./zkServer.sh status 命令时报
1 | ./zkServer.sh status |
可去bin目录吗,执行cat zookeeper.out查看日志
(1) . 错误信息:没有找到主机路由
该错误是没有关闭防火墙导致的,关闭即可。CentOS中防火墙程序主要是firewall和iptables,CentOS7中firewall服务已经默认安装好了,而iptables服务需要安装,CentOS中 iptables通过控制端口来控制服务,而firewalld则是通过控制协议来控制端口 。命令如下:
1 | yum install iptabes-services |
firewall 相关的操作
1 | 查看防火墙状态 |
iptables 相关的操作
1 | 开启iptables防火墙 |
至此zookeeper安装启动全部完成,可以愉快的玩耍了。
打赏一个呗