ZooKeeper集群部署-Openstack实例
(附Ansible批量部署,及云主机排错)
实验拓扑:
实验在Openstack上做,新建三台Centos7.2实例,绑定浮动IP,确保内外网通
系统配置
#修改每台节点的主机名
[root@centos7 ~]# hostnamectl set-hostname zookeeper3
[root@centos7 ~]# bash
[root@zookeeper3 ~]#
#配置hosts文件,将主机名对应IP
[root@zookeeper1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.4 zookeeper1
192.168.100.5 zookeeper2
192.168.100.6 zookeeper3
软件安装
#配置好yum文件,安装jdk1.8和devel
[root@zookeeper1 ~]# yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
#获取zookeeper软件,解压
[root@zookeeper1 ~]# wget ftp://192.168.1.100/soft/zookeeper-3.4.14.tar.gz
[root@zookeeper1 ~]# tar -zxvf zookeeper-3.4.14.tar.gz
#进入zookeeper下的conf文件,将配置范例文件sample复制为zoo.cfg
[root@zookeeper1 ~]# cd zookeeper-3.4.14/conf/
[root@zookeeper1 conf]# mv zoo_sample.cfg zoo.cfg
#修改zoo.cfg配置文件,添加server节点信息,如图
[root@zookeeper1 conf]# vim zoo.cfg
Server,id=host:port1:port2
其中id为一个数字,表示进程id,同时也是dataDir目录下myid文件的内容
Host为所在的ip地址
Port1表示follower和leader交换消息的端口
Port2表示leader所使用的端口
#创建文件夹/tmp/zookeeper,在文件下生成一个有本机对应id数字的文件myid
[root@zookeeper1 ~]# mkdir /tmp/zookeeper
[root@zookeeper1 ~]# echo 对应的id号 > /tmp/zookeeper/myid
#启动服务,查看服务状态
[root@zookeeper1 ~]# ./zookeeper-3.4.14/bin/zkServer.sh start
[root@zookeeper1 ~]# ./zookeeper-3.4.14/bin/zkServer.sh status
Mode显示为follower表明此服务器作为从节点
显示为leader则此服务器为主节点
启动后查看状态status报错ERROR:
环境:服务器为虚拟化云主机的情况下
显示 Error contacting service.It is probably not running.
首先查看端口,当前zookeeper服务只开启了2181这个端口
2181是zookeeper客户端连接的端口,正常情况下作为follower的时候是3888端口监听中,用于选举leader通讯
2888和3888端口并没有监听
查看bin/下面的zookeeper.out日志文件,当中就有ERROR报错问题,显示无法绑定端口
排错过程:
1.防火墙firewalld服务是否关闭,
或者正确规则让端口通过,然后通过一些端口扫描工具测试端口开放性
2.selinux是否关闭
3.查看网卡是否正常工作,ip是否显示正确
看到这里我突然想起,这次实验是在openstack上做的,开始按照云主机的特性排查
- 将openstack上的安全规则全部加入
5.在zoo.cfg配置文件中的server处,ip地址填写必须是云主机绑定的浮动IP,不可以写内网IP地址。
这玩意阿里云腾讯云管它叫弹性公网IP,在网上租用的云主机估计也是会有这个问题
6.最后!查询资料后,终于找到了原因,三台主机采用的Openstack中的云主机,
使用了虚拟化技术后,zookeeper无法查询绑定到真实网卡
解决方案就是用quorumListenOnAllIPs=true配置将监听到任何地址0.0.0.0
修改配置文件,将quorumListenOnAllIPs=true输入
[root@zookeeper1 bin]# vim ../conf/zoo.cfg
[root@zookeeper1 bin]# echo quorumListenOnAllIPs=true >> ../conf/zoo.cfg
建议将程序进程直接杀掉
重启服务
再次查询后就可以正常显示状态,此时zookeeper3为主节点
使用Ansible批量部署ZooKeeper集群
配置好hosts文件中的主机组
拷贝三台主机的密钥对
第一次编写的playbook剧本文件,还能再优化些
[root@server ansible]# cat zookeeper.yml
---
- hosts: all
remote_user: root
tasks:
- name: ==Disable firewalld==
service: name=firewalld state=stopped enabled=no
ignore_errors: True
- name: ==Disable Selinux==
shell: name= setenforce 0 && getenforce
ignore_errors: True
- name: ==Get&Copy ftp YUM file==
copy: src=./ftp.repo dest=/etc/yum.repos.d/ftp.repo force=yes
- name: ==Clean&Update the YUM file==
shell: rm -rf /etc/yum.repos.d/Cent*&&yum list update
ignore_errors: True
- name: ==Install JDK-1.8.0==
yum: name=java-1.8.0-openjdk,java-1.8.0-openjdk-devel,wget
ignore_errors: True
- name: ==Get&Release the ZooKeeper==
shell: rm -rf /usr/local/zookeeper&&wget ftp://192.168.1.100/soft/zookeeper-3.4.14.tar.gz&&tar -zxvf zookeeper-3.4.14.tar.gz&&rm -rf zookeeper-3.4.14.tar.gz&&mv ./zookeeper-3.4.14 /usr/local/zookeeper&&chown -hR root:root /usr/local/zookeeper
- name: ==Configure ZooKeeper==
shell: mv /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg&&echo 'server.1=192.168.100.4:2888:3888' >> /usr/local/zookeeper/conf/zoo.cfg&&echo 'server.2=192.168.100.5:2888:3888' >> /usr/local/zookeeper/conf/zoo.cfg&&echo 'server.3=192.168.100.6:2888:3888' >> /usr/local/zookeeper/conf/zoo.cfg&&echo 'quorumListenOnAllIPs=true' >> /usr/local/zookeeper/conf/zoo.cfg&&rm -rf /tmp/zookeeper&&mkdir /tmp/zookeeper&&echo `hostname|cut -c 20` > /tmp/zookeeper/myid
- name: ==Start Zookeeper==
shell: /usr/local/zookeeper/bin/zkServer.sh start
- name: ==Wait for the Nodes ON==
pause: seconds=20
- name: ==Service status==
shell: /usr/local/zookeeper/bin/zkServer.sh status
直接命令执行剧本,完成三台服务的部署
最后执行命令查询zookeeper服务状态
如图部署集群服务成功,一台为leader两台follower
[1]: