本文主要介绍zookeeper的一些常用命令、单机的安装、集群的安装等操作
版本:3.3.6
操作系统:centos 6.5
机器:虚拟机三台,分别为192.168.182.129(以下简称129)、192.168.182.130(以下简称130)、192.168.182.131(以下简称131)
要求:先安装jdk1.6+版本(笔者安装的是这个版本的http://download.oracle.com/otn/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz?AuthParam=1524624574_878b94fbb46adb5877f41f23084e9f5f)
说明:zk是zookeeper的简称
[root@vm129 local]#gzip -d zookeeper-3.3.6.tar.gz
[root@vm129 local]#tar -xf zookeeper-3.3.6.tar
[root@vm129 local]#mv zookeeper-3.3.6 /usr/local
创建zoo.cfg文件并进行配置
[root@vm129 local]#cd /usr/local/zookeeper-3.3.6/conf
[root@vm129 local]#cp zoo_sample.cfg zoo.cfg
注:解压后,系统本身是带有zoo_sample.cfg这个文件的,但是zookeeper启动会寻找zoo.cfg,所以需要将zoo_sample.cfg改个名字,里面的参数根据需要修改:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper
clientPortAddress=192.168.182.129
clientPort=2181
maxClientCnxns=100
参数解释:
tickTime:是一个时间单位,默认是2000毫秒,也就是2秒
initLimit:#leader服务器等待Follower启动并完成数据同步的时间,默认值10,表示tickTime的10倍
dataDir:zookeeper数据存储目录,里面包含zookeeper日志输出文件
clientPortAddress:客户端连接时使用哪个ip连接(线上服务可以指定内网地址,避免外网地址直接连到zk服务)
maxClientCnxns:最大客户端并发连接数
clientPort:客户端连接zookeeper的端口
[root@vm129 local]#./bin/zkServer.sh start
bin/zkCli.sh -server 192.168.182.129:2181
注:从外部连接时,需要在/etc/sysconfig/iptables中开放2181端口,且ip地址需要使用配置文件中clientPortAddress指定的ip地址
vi /etc/sysconfig/iptables
增加如下内容:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT
create /zk_test my_data #创建节点名为zk_test的节点,并存储值为my_data
get /zk_test
set /zk_test junk
delete /zk_test
ls /
注:2.2到2.6的内容都需要在连接zk后进行操作
本次集群安装一共安装3台虚拟机,ip分别为129、130、131,三台机器全部按照上面1、2点进行安装配置。官方推荐最好是奇数台机器做zookeeper集群,因为zookeeper集群只有在半数以上机器可用时,整体集群才可用,比如3台机器的集群,只有2台或2台以上都可用整个集群才可用,也就是允许挂掉一台的情况。当集群为4台,半数以上的机器(不包括半数)就是3台以上机器可用时,整个集群才可用,允许挂掉一台机器,可见,3台机器的zk集群和4台机器的zk集群效果是一样的。
129、130、131三台机器的zoo.cfg(三台机器配置文件除了clientPortAddress之外,其他都相同,以下皆为官方推荐配置):
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/tmp/zookeeper
clientPortAddress=192.168.182.129
clientPort=2181
maxClientCnxns=100
server.1=192.168.182.129:2888:3888
server.2=192.168.182.130:2888:3888
server.3=192.168.182.131:2888:3888
配置说明:
从上面的配置可以看出,相比于单机模式,集群模式多了 server.id=host:port1:port2 的配置, host 为机器 IP,port1 用于指定 Follower 服务器与 Leader 服务器进行通信和数据同步的端口,port2 用于进行 Leader 选举过程中的投票通信。为了三台机器的能正常通信,port1和port2必须在各自机器的
/etc/sysconfig/iptables中开放端口。
这个server.1、server.2、server.3,其中这个数字1、2、3,对应的是dataDir目录下的一个myid文件中的内容,该文件需要自己新建,并输入内容。该值必须是1到255之间的一个值,且集群内唯一。
[root@vm129 local]#vi /etc/sysconfig/iptables
增加如下内容:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2888 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3888 -j ACCEPT
重启服务,让防火墙修改生效:
[root@vm129 local]#service iptables restart
[root@vm129 local]#cd /tmp/zookeeper
[root@vm129 local]#touch myid
[root@vm129 local]#echo 1 > myid #129机器的myid文件内容为1、130机器的myid内容为2、131为3
[root@vm129 local]#sh /usr/local/zookeeper-3.3.6/bin/zkServer.sh start
至此,集群搭建成功,测试一下在140的set操作和create节点的操作能否同步到141、142吧
需要避免的问题:
a)、客户端、服务端的zk机器列表必须一致,比如说三台机器129、130、131,那么配置文件里也需要指定这三台机器,客户端调用时也必须指定这三台机器列表,不能几个zk集群串着调用
b)、事务日志存放需要正确,zk性能最重要的部分是事务日志,最好将日志存放到单独的设备上,比如固态硬盘(此为zk优化的重要一步)。默认事务日志跟数据存储目录(dataDir指定的目录)一致,如果需要单独设置,需要设置dataLogDir参数
第二问题,一般访问量不是巨大的话,应该都不需要可以考虑,默认即可,注意服务器列表别写错就行。
[root@vm129 init.d]# cd /etc/rc.d/init.d/
[root@vm129 init.d]# touch zookeeper
[root@vm129 init.d]# chmod u+x zookeeper
[root@vm129 init.d]# vi zookeeper
增加以下内容
#!/bin/bash
#chkconfig:2345 20 90
#description:zookeeper
#processname:zookeeper
export JAVA_HOME=/usr/local/jdk1.8.0_162
ZOOKEEPER_HOME=/usr/local/zookeeper-3.3.6
case $1 in
start) su root $ZOOKEEPER_HOME/bin/zkServer.sh start;;
stop) su root $ZOOKEEPER_HOME/bin/zkServer.sh stop;;
status) su root $ZOOKEEPER_HOME/bin/zkServer.sh status;;
restart) su root $ZOOKEEPER_HOME/bin/zkServer.sh restart;;
*) echo "require start|stop|status|restart" ;;
esac
增加完内容,测试一下服务是否能正常启动、停止、重启
[root@vm129 ~]#service zookeeper start
[root@vm129 ~]#service zookeeper restart
[root@vm129 ~]#service zookeeper stop
测试没问题再将zookeeper服务加入开机启动列表
[root@vm129 ~]#chkconfig --add zookeeper
重启机器就会看到zookeeper服务已经启动
#ps -ef|grep zookeeper
4、jdk安装(已安装的可以忽略)
http://download.oracle.com/otn/java/jdk/8u162-b12/0da788060d494f5095bf8624735fa2f1/jdk-8u162-linux-x64.tar.gz?AuthParam=1524624574_878b94fbb46adb5877f41f23084e9f5f
并上传到系统/usr/local/src目录
[root@vm129 local]#tar -zxvf jdk-8u162-linux-x64.tar.gz
[root@vm129 local]#mv jdk1.8.0_162 /usr/local/
[root@vm129 local]#vi /etc/profile
在文件最后增加如下内容:
export JAVA_HOME=/usr/local/jdk1.8.0_162
export PATH=$JAVA_HOME/bin:$PATH
让文件生效:[root@vm129 local]#source /etc/profile
查看jdk版本确认已生效:[root@vm129 local]# java -version