ZooKeeper集群部署-Openstack实例

(附Ansible批量部署,及云主机排错)
实验拓扑:
61558-9y803nobg8j.png
实验在Openstack上做,新建三台Centos7.2实例,绑定浮动IP,确保内外网通
12583-lg2bkw739p.png

系统配置

#修改每台节点的主机名
[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

27268-bcc2re2r7h.png

#修改zoo.cfg配置文件,添加server节点信息,如图
[root@zookeeper1 conf]# vim zoo.cfg

61759-l88tknl095.png
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

48127-z0aptdo5y2e.png
Mode显示为follower表明此服务器作为从节点
显示为leader则此服务器为主节点

启动后查看状态status报错ERROR:

环境:服务器为虚拟化云主机的情况下

显示 Error contacting service.It is probably not running.
43510-qj20y0gcekg.png

首先查看端口,当前zookeeper服务只开启了2181这个端口
2181是zookeeper客户端连接的端口,正常情况下作为follower的时候是3888端口监听中,用于选举leader通讯
2888和3888端口并没有监听
79006-c8hdpodb4kp.png

查看bin/下面的zookeeper.out日志文件,当中就有ERROR报错问题,显示无法绑定端口
16315-72lskqbjimy.png
排错过程:
1.防火墙firewalld服务是否关闭,
08138-2xgd5xxm81c.png
或者正确规则让端口通过,然后通过一些端口扫描工具测试端口开放性
15607-68902js41ji.png

2.selinux是否关闭
29582-tayugvl9aq.png

3.查看网卡是否正常工作,ip是否显示正确
68484-hevxbbs8quc.png
看到这里我突然想起,这次实验是在openstack上做的,开始按照云主机的特性排查

  1. 将openstack上的安全规则全部加入
    42168-zypj7dag5v.png

5.在zoo.cfg配置文件中的server处,ip地址填写必须是云主机绑定的浮动IP,不可以写内网IP地址。
这玩意阿里云腾讯云管它叫弹性公网IP,在网上租用的云主机估计也是会有这个问题
17564-i0lwqw97bwf.png
56342-bao8t0eg3ub.png
97877-m669kx4s1t.png

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

69835-1fxv41xyksxi.png

建议将程序进程直接杀掉
89809-92ogrfln0bo.png

重启服务
18164-76gq7c04nzd.png

再次查询后就可以正常显示状态,此时zookeeper3为主节点
36082-r3936b0xlks.png

使用Ansible批量部署ZooKeeper集群

配置好hosts文件中的主机组
23662-awia5o2ren5.png
拷贝三台主机的密钥对
04749-lsfrdmo77ne.png

第一次编写的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

直接命令执行剧本,完成三台服务的部署
74817-f4uhuqi01v.png

最后执行命令查询zookeeper服务状态
18273-icdhtoiisuq.png
如图部署集群服务成功,一台为leader两台follower

[1]: