zookeeper集群环境搭建

535 阅读5分钟

一. zookeeper简述

作用

zookeeper是一个开源的为分布式框架提供协调服务的Apache项目

工作机制

zookeeper是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据发生变化,zookeeper就将负责通知已经在zookeeper上注册的哪些观察者做出相应的反应。

特点

  1. zookeeper:一个领导者,多个跟随者组成的集群

  2. 集群中只要有半数以上的节点存活,zookeeper集群就可以正常服务,zookeeper适合安装奇数台服务器

  3. 全局数据一致性:每一个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的。

  4. 更新请求顺序执行,来自同一个client的更新请求按其发送顺序依次执行

  5. 数据更新原子性,一次更新要么成功,要么失败

  6. 实时性,在一定时间范围内,client能读到最新数据

数据结构

zookeeper数据模型的结构与unix文件系统很类似,整体上看作一棵树,每个节点称作一个ZNode。每一个ZNode默认能够存储1MB数据,每个ZNode都可以通过其路径唯一标识。

二. 使用场景

统一命名服务

统一配置管理

统一集群管理

服务器动态上下线

软负载均衡

三. 单机环境搭建

我这里使用的是ubuntu非root用户安装的,直接用我写的脚本就可以直接安装单节点zookeeper。

#!/bin/bash
name=zookeeper-3.5.9
home=$(pwd)/${name}
db=${home}/zkData

case $1 in
    install)
        echo "开始安装单节点zookeeper"
        echo "开始下载zookeeper包......"
        wget https://downloads.apache.org/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz
        echo "安装包正在解压......"
        tar -zxvf apache-zookeeper-3.5.9-bin.tar.gz
        mv apache-zookeeper-3.5.9-bin ${name}
        cp ${home}/conf/zoo_sample.cfg ${home}/conf/zoo.cfg
        echo "创建数据目录,并修改配置......"
        mkdir ${db}
        sed -i "/dataDir=/{s:/tmp/zookeeper:${db}:g;}" ${home}/conf/zoo.cfg

        isUse=`netstat -tlpn | grep 8080`
        if [ -n "$isUse" ]; then
            echo "admin.serverPort使用的端口8080被占用"
            sed -i '$a\admin.serverPort=2882' ${home}/conf/zoo.cfg
        fi
        chown -R ${USER}:${USER} ${home}
        echo "安装单节点zookeeper完毕"
    ;;
    start)
        echo "开始启动单节点zookeeper"
        ${home}/bin/zkServer.sh start
    ;;
    status)
        echo "查看单节点zookeeper状态"
        ${home}/bin/zkServer.sh status
    ;;
    stop)
        echo "开始停止单节点zookeeper"
        ${home}/bin/zkServer.sh stop
    ;;
    remove)
        rm -rf ${home}
    ;;
 esac

使用方式:

./install.sh install   # 启动之前先执行安装
./install.sh start     # 启动
./install.sh status    # 查看状态
./install.sh stop      # 停止
./install.sh remove    # 移除(先停止)

四. 常用参数

备注名备注
clientPort=2181向外提供服务的端口号
maxClientCnxns=60单个客户端和单台服务器之间的连接数量,默认是60;如果设置0这说明不做任何限制。(这里需要注意这个限制仅仅是单台客户端和单台服务器之间的连接限制)
dataDir数据目录(数据目录/tmp/zookeeper)
dataLogDir事务日志存储目录,默认是64M,建议设置单独的磁盘和挂载点,这将提高zk的性能。
tickTime=2000zookeeper中最小的时间单位长度(毫秒),zk中所有的时间都是以这个为基础进行整数倍配置的。
initLimit=10从节点从主节点上同步最新数据的时间。
syncLimit=5leader节点和follower节点进行心跳检测的最大延时时间
admin.serverPort查看zk系统信息的web页面

这里需要注意admin.serverPort的配置默认端口是8080,这个是zk携带的一个web的系统接口页面,

启动zk之后我们在浏览器中输入:IP:8080/commands 在这里插入图片描述 其他的一些配置可以在官网看到: zookeeper.apache.org/doc/r3.7.0/…

五. 集群安装

集群安装需要在数据目录(dataDir)下面创建一个myid文件,配置文件需要增加节点信息,这里的节点配置信息需要注意一下:

# 集群配置
server.1=0.0.0.0:2889:3889
server.2=0.0.0.0:2890:3890
server.3=0.0.0.0:2891:3891

这里的配置:server.A=B:C:D

A:是一个数字,表示这是个第几号服务器

B:是服务器地址

C:这个从节点(follower)与集群中主节点(leader)服务器交换信息的端口

D:是集群中主节点(leader)服务器挂了之后,需要一个端口来重新进行选举,选出一个新的主节点(leader),而这个端口是用来执行选举时对服务器相互通信的端口。

安装脚本:

#!/bin/bash
home=$(pwd)/zookeeper/node-

case $1 in
    install)
        echo "开始安装单节点zookeeper"
        echo "开始下载zookeeper包......"
        wget https://downloads.apache.org/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz
        echo "安装包正在解压......"
        for ((i=1; i<=3; i++))
        do
            itemPath=${home}$i
            dbPath=${itemPath}/zkData
            logPath=${itemPath}/logData
            mkdir -p ${itemPath}/{zkData,logData}
            echo $i > ${dbPath}/myid
            tar -zxvf apache-zookeeper-3.5.9-bin.tar.gz --strip-components 1 -C ${itemPath}
            cp ${itemPath}/conf/zoo_sample.cfg ${itemPath}/conf/zoo.cfg
            sed -i "/clientPort=/{s:2181:218$i:g;}" ${itemPath}/conf/zoo.cfg
            sed -i "/dataDir=/{s:/tmp/zookeeper:${dbPath}:g;}" ${itemPath}/conf/zoo.cfg
      echo 'admin.serverPort=808'$i >> ${itemPath}/conf/zoo.cfg
            echo "dataLogDir=${logPath}" >> ${itemPath}/conf/zoo.cfg
            echo '# cluster config' >> ${itemPath}/conf/zoo.cfg
            echo 'server.1=0.0.0.0:2889:3889' >> ${itemPath}/conf/zoo.cfg
            echo 'server.1=0.0.0.0:2890:3890' >> ${itemPath}/conf/zoo.cfg
            echo 'server.1=0.0.0.0:2891:3891' >> ${itemPath}/conf/zoo.cfg
            chown -R ${USER}:${USER} ${itemPath}
        done
        echo "安装单节点zookeeper完毕"
    ;;
    start)
        echo "开始启动单节点zookeeper"
        for ((i=1; i<=3; i++))
        do
      cd ${home}${i} && ./bin/zkServer.sh start
        done
    ;;
    status)
        echo "查看单节点zookeeper状态"
        for ((i=1; i<=3; i++))
        do
            cd ${home}${i} && ./bin/zkServer.sh status
        done
    ;;
    stop)
        echo "开始停止单节点zookeeper"
        for ((i=1; i<=3; i++))
        do
      cd ${home}${i} && ./bin/zkServer.sh stop
        done
    ;;
    remove)
        rm -rf ${home}*
    ;;
esac

如果需要多台的话,修改一下参数很容易实现多台zk集群,相对docker-compose来说,简单多了。

六. 容器安装

官方有相关的文章介绍:hub.docker.com/_/zookeeper

官方的docker-compose文件没有设置data和log目录这样话,数据不安全,所以我们简单修改一下。

version: '3.1'

services:
  zoo1:
    image: zookeeper
    restart: always
    hostname: zoo1
    ports:
      - 2181:2181
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
    volumes:
      - ./node-1/zkData:/data
      - ./node-1/logData:/datalog

  zoo2:
    image: zookeeper
    restart: always
    hostname: zoo2
    ports:
      - 2182:2181
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
    volumes:
      - ./node-2/zkData:/data
      - ./node-2/logData:/datalog

  zoo3:
    image: zookeeper
    restart: always
    hostname: zoo3
    ports:
      - 2183:2181
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
    volumes:
      - ./node-3/zkData:/data
      - ./node-3/logData:/datalog

启动

docker-compose up -d # 后台启动
docker-compose ps    # 查看启动情况

在这里插入图片描述 这个如果增加集群数据就比shell脚本麻烦了。