准备工作
Zookeeper可以安装到各个系统中,但作为正式项目的部署,一般会选择将其部署在Ubuntu server或者CentOS等Linux系统上。这里就以CentOS 7为例,其他系统也可按照本文的方法在部分地方进行修改并部署。
环境安装配置
通过VMware可以快速地实现分布式环境,这比真机部署要更方便,也更实际。作为分布式环境,我们需要3台虚拟机(奇数),同时要保证每一台虚拟机都能互相ping通。这里推荐使用NAT模式作为虚拟机的网络连接方式,同时,记得修改真机的网络适配器中的“VMware Network Adapter VMnet8”适配器的ip地址,使其与虚拟机的ip地址在同一网段,这样在真机中也可以ping通虚拟机,虚拟机也可以连上外网。
关闭防火墙(重要):
默认情况下每次重新启动linux的时候防火墙都是打开的,所以每次重启linux,要安装集群的时候都要把防火墙关闭。
关闭防火墙可以通过以下命令实现:
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
如果系统中有安装iptables,那么可以编辑它的配置文件,打开所需要的端口:
vi /etc/sysconfig/iptables #编辑防火墙配置文件
# sampleconfiguration for iptables service
# you can edit thismanually or use system-config-firewall
# please do not askus to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT[0:0]
:OUTPUT ACCEPT[0:0]
-A INPUT -m state--state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -jACCEPT
-A INPUT -i lo -jACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2181 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 2888 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3888 -j ACCEPT
-A INPUT -j REJECT--reject-with icmp-host-prohibited
-A FORWARD -jREJECT --reject-with icmp-host-prohibited
COMMIT
:wq! #保存退出
备注:这里使用2181/2888/3888是Zookeeper需要用到的端口号,22端口是用来远程的端口,可以不用添加。一般将需要开放的端口号添加到“-A INPUT -p tcp -m state --state NEW -m tcp--dport 22 -j ACCEPT”行的上面或者下面,切记不要添加到最后一行,否则防火墙重启后不生效。
systemctl restart iptables.service #最后重启防火墙使配置生效
systemctl enable iptables.service #设置防火墙开机启动
配置静态ip(非必须):
通过命令:
cd /etc/sysconfig/network-scripts/
把目录切换到network-scripts目录下.通过命令:
cp ifcfg-eno16777736 ifcfg-back对ifcfg-eno16777736
文件进行备份.通过命令:
vi ifcfg-eno16777736
配置ifcfg-eno16777736文件中的静态ip.TYPE=Ethernet BOOTPROTO=static #dhcp改为static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=eno16777736 UUID=3c1a02bb-c3e0-4538-9170-b4dcd613a3f2 DEVICE=eno16777736 ONBOOT=yes #开机启用本配置 IPADDR=192.168.49.134 #静态IP NETMASK=255.255.255.0 #子网掩码 GATEWAY=192.168.49.1 #默认网关 DNS1=114.114.114.114 #DNS 配置 DNS2=114.114.115.115
说明:将
BOOTPROTO
修改成static,ONBOOT
修改成yes;在文档结尾追加IPADDR
(静态ip地址:按照实际填写),NETMASK
(子网掩码:一般是255.255.255.0),GATEWAY
(网关:按照实际填写),DNS1/DNS2
(域名服务器);
修改后按Esc
键,再输入:wq
保存修改的内容并退出vi通过命令:
service network restart
重启网卡, 网卡重启后ip没有改变,系统重启也不会改变Ip地址.
配置hosts文件:
为集群中的节点命名一个主机名,使得节点间可以相互通信.
命令脚本: vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.49.134 zk1
192.168.49.135 zk2
192.168.49.136 zk3
注意: zk31,zk32,zk33是命名的主机名,它们前面是对应的ip地址,每个集群中的节点都要配置hosts文件,而且配置的内容是一样的
安装jdk:
jdk可以安装oracle的jdk,也可以是openjdk,但版本需要是1.8以上。这里安装的是openjdk。在命令行里输入yum install java-1.8.0-openjdk
即可,如果是ubuntu系统,那么需要输入sudo apt-get install openjdk-8-jdk
通过上面的方式安装jdk的好处是不需要去配置环境变量。
安装zookeeper:
- 通过
cd /root
回到root的主目录下,通过wget的方式下载zookeeper的tar包:wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.10.tar.gz
下载的是stable稳定版中的最新版3.4.10. - 解压缩:
tar –zxvf zookeeper-3.4.10.tar.gz
把zookeeper配置到环境变量中:
vi ~/.bash_profile
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin ZOOKEEPER_HOME=/root/zookeeper-3.4.10 export ZOOKEEPER_HOME PATH=$ZOOKEEPER_HOME/bin:$PATH export PATH
- 使刚刚的配置生效:
source ~/.bash_profile
Zookeeper的配置
- 在zookeeper home目录下( /root/zookeeper-3.4.10)创建一个tmp目录:
mkdir tmp
- 把zookeeper home /conf目录中zoo_sample.cfg文件命名为zoo.cfg:
cp zoo_sample.cfg zoo.cfg
配置zoo.cfg:vi zoo.cfg
# sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/root/zookeeper-3.4.10/tmp # the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1 server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888
- dataDir的值为zookeeper home目录(/root/training/zookeeper-3.4.9)下的tmp目录.
- 2888为通信端口,3888为选举端口.
在tmp目录下新建一个myid文件,并配置:
vi myid
1
myid文件里面只需配置一个阿拉伯数字,各个集群节点间myid文件里面配置的数字是不同的,zk2 zk3分别配置为2和3.
- zk1机器上的zookeeper已经配置好了,接下来需要把配置好的zookeeper-3.4.10复制到另外两台机器zk2和zk3,记得修改myid文件中的数字,zk2应该是
2
,zk3应该是3
- zk32和zk33的环境配置(重要).
按照以上的步骤把zk2和zk3的环境都配置好.配置的信息都相同
启动Zookeeper
通过命令脚本
zkServer.sh start
分别启动每一个Zookeeper节点.验证是否启动成功(此处必须保证防火墙关闭,否则执行不成功).
[root@zk3 conf]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /root/zookeeper-3.4.10/bin/../conf/zoo.cfg Mode: follower
如果不关闭防火墙,可能会出现以下错误:
[root@zk3 conf]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /root/zookeeper-3.4.10/bin/../conf/zoo.cfg Error contacting service. It is probably not running.
这里需要按照本文最开始的步骤“关闭防火墙”
三台机器有一台为leader 其它两台为follower
[root@zk2 network-scripts]# zkServer.sh status ZooKeeper JMX enabled by default Using config: /root/zookeeper-3.4.10/bin/../conf/zoo.cfg Mode: leader
操作总结
- 关闭一个节点后,zookeeper集群还能存活,当关闭了两个节点的话, zookeeper集群就存活不了.集群存活的节点数必须大于集群总数的一半.
- 碰到问题重启很管用,有些问题排查后感觉都没有错,这时候可以考虑下重启.