13 2 2019

分布式调度——zookeeper

为什么需要zookeeper

  • 大部分分布式应用需要一个主控、协调器或控制器来管理物理分布的子进程(如资源、任务分配等)
  • 大部分应用需要开发私有的协调程序,缺乏一个通用的机制
  • 协调程序的反复编写浪费,且难以形成通用、伸缩性好的协调器
  • 协调服务

zookeeper简介

zookeeper是什么

  • zookeeper是Google的Chubby一个开源的实现,是开源的分布式协调服务
  • 它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等
  • zookeeper是一个高性能的分布式数据一致性解决方案,它将那些复杂的,容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并提供一系列简单易用的接口给用户使用
  • 它的架构如下图:

zookeeper能帮我们做什么

  • 分布式系统协调:多个节点一起完成一个动作

    • 修改文件
    • 管理集群成员,及时发现解决一些故障问题
    • 选主
    • 发布/订阅
  • 负载均衡

zookeeper的数据模型

  • 层次化的目录结构,命名符合常规文件系统规范
  • 每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
  • znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本
  • 节点不支持部分读写,而是一次性完整读写
  • 知道zk存储数据是树的结构

zookeeper的下载地址

zookeeper基本概念

集群角色

leader:集群核心,提供是读写操作,负责投票发起,决议

follower:提供读的服务,写的操作转交给leader,参与选举

observer:提供读的服务,不参与选举,只同步leader的状态,增强了zk集群的读写并发能力

zookeeper节点类型

  • persistent:persistent节点不和特定的session绑定,不会随着创建该节点的session的结束而消失,而是一直存在,除非该节点被显式删除
  • ephemeral:ephemeral节点是临时性的,如果创建该节点的session结束了,该节点就会被自动删除,ephemeral节点不能拥有子节点,虽然ephemeral节点与创建它的session绑定,但只要该该节点没有被删除,其他session就可以读写该节点中关联的数据,使用-e参数指定创建ephemeral节点
  • sequence:严格的说,sequence并非节点类型中的一种,sequence节点既可以是ephemeral的,也可以是persistent的,创建sequence节点时,ZooKeeper server会在指定的节点名称后加上一个数字序列,该数字序列是递增的,因此可以多次创建相同的sequence节点,而得到不同的节点,使用-s参数指定创建sequence节点

版本

  • Version:当前Znode的版本
  • Cversion:当前Znode的子节点的版本
  • Aversion:当前Znode的ACL(访问控制)版本

watcher

  • 作用于Znode节点
  • watcher设置后,一旦触发一次就会失效,如果需要一直监听,就需要再次注册
  • 多种事件通知:数据更新,子节点状态等
  • watcher会监控目录节点的数据变化以及子目录的变化,一旦发送改变,则通知所有设置在这个目录节点的watcher,从而做出相应的反应

zookeeper节点和配置常识

  • zookeeper 提供了创建/修改/删除节点的功能,如果父节点没有创建,子节点会创建失败。如果父节点还有子节点,父节点不可以被删除
  • zookeeper 和客户端之间以 socket 形式进行双向通讯,客户端可以主动调用服务器,服务器也可以主动向客户端推送事件
  • zookeeper 的事件有传递机制,子节点的增删改触发的事件会向上层依次传播,所有的父节点都可以收到子节点的数据变更事件,所以层次太深/子节点太多会给服务器的事件系统带来压力,节点分配要做好周密的规划
  • zookeeper 的读性能随着节点数量的提升能不断增加,但是写性能会随着节点数量的增加而降低,所以节点的数量不宜太多,一般配置成 3 个或者 5 个就可以了

zookeeper的安装

单机版

检查JDK有没有问题

上传文件

解压

创建后面会用到的目录

复制一个可以自定义的配置

修改配置文件

启动zk服务端

关闭zk

伪分布式(用于学习)

复制前面单机版的,复制3份

分别写入标识序号

3个zk都修改配置

data目录改成自己的,端口号3个zk别重复2181 2182 2183

文件最后,都加上如下内容

2881是通信端口,3881是选举端口

server.1=192.168.198.135:2881:3881

server.2=192.168.198.135:2882:3882

server.3=192.168.198.135:2883:3883

分别启动3个zk

start stop status

完全分布式

多台机器,同时运行一个集群

准备了3台centos7系统

搭建完全分布式的准备工作(通用):

3台都要有JDK

3台防火墙都要关

查防火墙状态:systemctl status firewalld.service

关闭防火墙:systemctl stop firewalld.service

3台机器都永久禁用防火墙

systemctl disable firewalld.service

3台都关掉SElinux

3台机器修改主机名:后面2台一样的操作,改成node02 node03

3台机器配置hosts映射文件,根据自己IP去改,后面2台,一样的配置

3台都重启

配置SSH免密登录,交互免去输密码,一路回车

将生成的密钥,分别拷贝到3台机器

正式开始:

将单机版的复制3份

给3个机器,写入具体标识

分别修改3台机器配置文件

修改以下内容

最后加入如下内容,3台都一样

把zk2和3,传到另外2台机器

scp -r /usr/local/zookeeper02/ root\@node02:/usr/local/zookeeper02

scp -r /usr/local/zookeeper03/ root\@node03:/usr/local/zookeeper03

启动3台

zookeeper详解

解压后目录结构

配置文件

运行脚本

连接客户端

命令行操作

  • help
  • ls path [watch]

查看根目录

创建节点

创建watch

触发watch事件,知道节点有什么改变

  • create [-s] [-e] path data acl
  • get path [watch]
  • set path data [version]
  • delete path [version]
  • stat path [watch]
  • setAcl path
延伸阅读
    < /body> < /html>