准备工作

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(非必须):
  1. 通过命令:cd /etc/sysconfig/network-scripts/ 把目录切换到network-scripts目录下.

  2. 通过命令: cp ifcfg-eno16777736 ifcfg-back对ifcfg-eno16777736文件进行备份.

  3. 通过命令: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

  4. 通过命令: 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:
  1. 通过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.
  2. 解压缩:tar –zxvf zookeeper-3.4.10.tar.gz
  3. 把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
    
  4. 使刚刚的配置生效:source ~/.bash_profile

Zookeeper的配置

  1. 在zookeeper home目录下( /root/zookeeper-3.4.10)创建一个tmp目录:mkdir tmp
  2. 把zookeeper home /conf目录中zoo_sample.cfg文件命名为zoo.cfg: cp zoo_sample.cfg zoo.cfg
  3. 配置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
    
    1. dataDir的值为zookeeper home目录(/root/training/zookeeper-3.4.9)下的tmp目录.
    2. 2888为通信端口,3888为选举端口.
  4. 在tmp目录下新建一个myid文件,并配置:vi myid
    1
    

    myid文件里面只需配置一个阿拉伯数字,各个集群节点间myid文件里面配置的数字是不同的,zk2 zk3分别配置为2和3.

  5. zk1机器上的zookeeper已经配置好了,接下来需要把配置好的zookeeper-3.4.10复制到另外两台机器zk2和zk3,记得修改myid文件中的数字,zk2应该是2,zk3应该是3
  6. zk32和zk33的环境配置(重要).
    按照以上的步骤把zk2和zk3的环境都配置好.配置的信息都相同

启动Zookeeper

  1. 通过命令脚本zkServer.sh start分别启动每一个Zookeeper节点.

  2. 验证是否启动成功(此处必须保证防火墙关闭,否则执行不成功).

    [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.
    

    这里需要按照本文最开始的步骤“关闭防火墙”

  3. 三台机器有一台为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
    

操作总结

  1. 关闭一个节点后,zookeeper集群还能存活,当关闭了两个节点的话, zookeeper集群就存活不了.集群存活的节点数必须大于集群总数的一半.
  2. 碰到问题重启很管用,有些问题排查后感觉都没有错,这时候可以考虑下重启.

docker 镜像基础地址:

registry.cn-hangzhou.aliyuncs.com/aliware2018/

etcd

镜像名称:alpine-etcd
docker pull registry.cn-hangzhou.aliyuncs.com/aliware2018/alpine-etcd
docker启动:
docker run -p 2379:2379 -d 5ffcbbfee207 /usr/local/bin/etcd -advertise-client-urls http://172.17.0.1:2379 --name etcd
验证:

localhost:2379/v2/members

agent-demo

镜像名称:agent-demo
docker pull registry.cn-hangzhou.aliyuncs.com/aliware2018/agent-demo

docker启动:

provider-agent:
docker run -d -p 30000:30000 -p 20889:20889 --name provider-small-agent registry.cn-hangzhou.aliyuncs.com/aliware2018/agent-demo provider-small
consumer-agent:
docker run -d -p 20000:20000 --name consumer-agent registry.cn-hangzhou.aliyuncs.com/aliware2018/agent-demo consumer


services

镜像名称:services
docker pull registry.cn-hangzhou.aliyuncs.com/aliware2018/services

docker启动:

provider:
docker run -d -p 20089:20089 --name provider-small registry.cn-hangzhou.aliyuncs.com/aliware2018/services provider-small
consumer:
docker run -d -p 8087:8087 --name consumer registry.cn-hangzhou.aliyuncs.com/aliware2018/services


进入容器

docker exec -ti provider-small-agent /bin/bash

复制文件

从主机复制到容器:
docker cp host_path containerID:container_path
从容器复制到主机:
docker cp containerID:container_path host_path
docker cp provider-small-agent:/root/dists/mesh-consumer.jar C:\Users\default

根据dockerfile制作镜像

需要进入到dockerfile所在的文件夹:docker build -t agent .
启动provider:
docker run -d -p 30000:30000 -p 20889:20889 --name provider-small-agent agent provider-small
启动consumer:
docker run -d -p 20000:20000 --name consumer-agent agent consumer

Agent Dockerfile

FROM registry.cn-hangzhou.aliyuncs.com/aliware2018/debian-jdk8

COPY mesh-provider-1.0-SNAPSHOT.jar /root/dists/mesh-provider.jar
COPY mesh-consumer-1.0-SNAPSHOT.jar /root/dists/mesh-consumer.jar
COPY mesh-agent-1.0-SNAPSHOT.jar /root/dists/mesh-agent.jar

COPY docker-entrypoint.sh /usr/local/bin
COPY start-agent.sh /usr/local/bin

RUN set -ex && mkdir -p /root/logs

ENTRYPOINT ["docker-entrypoint.sh"]
  1. 设置ali的docker镜像库,在https://cr.console.aliyun.com/#/accelerator可以看到.
  2. 用docker build命令制作镜像时需要将mesh-provider.jar、mesh-consumer.jar、mesh-agent.jar、docker-entrypoint.sh、start-agent.sh这5个文件复制到Dockerfile所在的目录下。
  3. docker build -t agent .