当前位置:   article > 正文

Zookeeper概述_zkctr

zkctr

Zookeeper概述

百度百科:
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是HadoopHbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

简单理解:
为分布式应用提供协调服务的Apache项目。
美团,饿了么,淘宝,58同城等等应用都是zookeeper的现实生活版。

工作机制

  • 从设计模式的角度来理解:Zookeeper是一个基于观察者模式(一个人干活,有人盯着他)设计的分布式服务管理框架。
  • 它负责存储管理大家都关心的数据,接收观察者的注册,这些数据一旦发生变化,Zookeeper就负责通知已经注册的那些观察者做出相应的反应,从而实现集群中类似Master/Slave的管理模式。
  • Zookeeper = 文件系统 + 通知机制

请添加图片描述

特点

分布式和集群的区别

  • 举个栗子:有一个饭店,生意越来越火爆,需要多招聘一些工作人员
    • 分布式:招聘1个服务员,1个厨师,1个前台(三个人负责的工作不一样
    • 集 群:招聘3个服务员(三个人负责的工作一样

Zookeeper的特点

  1. 是一个leader和多个follower来组成的集群。
  2. 集群中只要有半数以上(大于半数)的节点存活,Zookeeper就能正常工作(例如:5台服务器挂掉2台,继续运行;4台服务器挂掉2台,停止运行)。
  3. 全局数据一致性,每台服务器都保存一份相同的数据副本,无论client连接哪台server,数据都是一致的。
  4. 数据更新原子性,一次数据要么成功,要么失败。
  5. 实时性,在一定时间范围内,client能读取到最新数据。
  6. 更新的请求按照顺序执行,会按照发送过来的顺序,逐一执行(发来123,执行123)。

数据结构

请添加图片描述

ZooKeeper数据模型的结构与linux文件系统类似,整体上可以看作是一棵树,每个节点称做一个ZNode(ZookeeperNode)。

每一个ZNode默认能够存储1MB的数据(元数据),每个ZNode的路径都是唯一的。

元数据(Metadata):又称中介数据、中继数据,是一种描述数据的数据(data about data),主要作用是描述数据属性(property)的信息,用来支持指示存储位置、历史数据、资源查找、文件记录等功能。

应用场景

统一命名服务

  • 在分布式环境下,通常需要对应用或服务进行统一的命名,便于识别。
  • 举个栗子:服务器的IP地址不容易记住,但域名记忆起来十分容易。

统一配置管理

  • 在分布式环境下,配置文件做同步是必经之路。
  • 1000台服务器,如果需要对配置文件作出修改,逐台修改的话,运维人员肯定顶不住,所以我们需要做到修改一处就快速同步到每台服务器上。

请添加图片描述

将配置管理交给Zookeeper:

  1. 将配置信息写入到Zookeeper的某个节点上;
  2. 每个客户端都监听这个节点;
  3. 一旦节点中的数据文件被修改,Zookeeper就会自动通知每台客户端服务器。

服务器节点动态上下线

  • 即客户端能够实时获取到服务器上下线的变化。
  • 举个栗子:在美团APP上可以实时看到商家是否营业。

软负载均衡

  • Zookeeper会记录每台服务器的访问数,让访问数最少的服务器去处理最新的客户请求(雨露均沾)。

下载地址

下载地址:http://archive.apache.org/dist/zookeeper/

请添加图片描述
请添加图片描述
压缩包之间的区别:

  • 不含bin后缀的压缩包(如apache-zookeeper-3.6.0.tar.gz)需要安装maven,然后再运行mvn clean installmvnjavadoc:aggregate,前一个命令会下载安装大量jar包,花费时间较长。
  • bin后缀的压缩包(如apache-zookeeper-3.6.0-bin.tar.gz)已经自带所需要的各种jar包。【推荐下载】

Zookeeper本地模式安装

安装前的准备

  1. 安装jdk
  2. 拷贝apache-zookeeper-3.6.0-bin.tar.gzopt目录
  3. 解压安装包
 tar -xf apache-zookeeper-3.6.0-bin.tar.gz
  • 1
  1. 重命名
mv apache-zookeeper-3.6.0-bin zookeeper
  • 1

修改配置

  1. /opt/zookeeper/目录上创建zkDatazkLog目录
mkdir zkData zkLog
  • 1
  1. 进入/opt/zookeeper/conf路径,复制一份 zoo_sample.cfg 文件并命名为 zoo.cfg
cp zoo_sample.cfg zoo.cfg
  • 1
  1. 编辑zoo.cfg文件,修改dataDirdataLogDir路径
dataDir=/opt/zookeeper/zkData 
dataLogDir=/opt/zookeeper/zkLog
  • 1
  • 2

相关操作

# 启动Zookeeper
[root@localhost bin] ./zkServer.sh start

# 查看进程是否启动
[root@localhost bin] jps
# QuorumPeerMain:zookeeper集群的启动入口类,用来加载配置启动QuorumPeer线程

# 查看状态
[root@localhost bin] ./zkServer.sh status

# 启动客户端
[root@localhost bin] ./zkCli.sh

# 退出客户端
[zk: localhost:2181(CONNECTED) 0] quit
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

配置参数解读

配置文件zoo.cfg中各参数的含义解读:

配置参数说明
tickTime=2000通信心跳数,Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,单位毫秒
initLimit=10LF初始通信时限;
集群中的Follower跟随者服务器与Leader领导者服务器之间,启动时能容忍的最大心跳数;
10 * 2000initLimit * tickTime)个时间单位后若领导与跟随者仍未发出心跳通信,则视为连接已失效,领导者与跟随者彻底断开
syncLimit=5LF同步通信时限;
集群启动后,LeaderFollower之间的最大响应时间单位;
若响应超过syncLimit * tickTime个时间单位,Leader就会认为Follwer已经死掉,将Follwer从服务器列表中删除
dataDir数据文件目录 + 数据持久化路径;主要用于保存Zookeeper中的数据
dataLogDir日志文件目录
clientPort=2181客户端连接端口;监听客户端连接的端口

Zookeeper内部原理

选举机制

半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。

虽然在配置文件中并没有指定MasterSlave。但在Zookeeper工作时,会有一个节点作为Leader,其他作为FollowerLeader通过内部的选举机制临时产生。

请添加图片描述

  1. Server1:先投票,如果投给自己,自己为1票,没有超过半数,根本无法成为leader,所以顺水推舟将票数投给了id比自己大的Server2;
  2. Server2:也先把自己的票数投给自己,再加上Server1给的票数,总票数为2票,没有超过半数,也无法成为leader,所以也学习Server1,顺水推舟,将自己所有的票数给了id比自己大的Server3;
  3. Server3:得到了Server1和Server2的两票,再加上自己投给自己的一票。3票超过半数,顺利成为leader;
  4. Server4和Server5:都投给自己,但是无法改变Server3的票数,只好听天由命,承认Server3是leader。

节点类型

  • 持久型(persistent):
    • 持久化目录节点(persistent):客户端与zookeeper断开连接后,该节点依旧存在
    • 持久化顺序编号目录节点(persistent_sequential):客户端与zookeeper断开连接后,该节点依旧存在,创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护,例如:Znode001,Znode002…
  • 短暂型(ephemeral):
    • 临时目录节点(ephemeral):客户端和服务器端断开连接后,创建的节点自动删除
    • 临时顺序编号目录节点(ephemeral_sequential):客户端与zookeeper断开连接后,该节点被删除,创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护,例如:Znode001,Znode002…

序号相当于i++,与数据库中的主键自增类似。

监听器原理

请添加图片描述

  1. main方法中创建Zookeeper客户端的同时会创建两个线程,一个负责网络连接通信,一个负责监听
  2. 监听事件就会通过网络通信发送给zookeeper
  3. zookeeper获得注册的监听事件后,立刻将监听事件添加到监听列表里
  4. zookeeper监听到 数据变化 或 路径变化,就会将这个消息发送给监听线程
    • 常见的监听:
      • 监听节点数据的变化:get path [watch]
      • 监听子节点增减的变化:ls path [watch]
  5. 监听线程就会在内部调用process方法(需要我们手动实现process方法)

数据写入流程

请添加图片描述

  1. Client想向 ZooKeeper 的 Server1 上写入数据,必须先发送一个写入请求。
  2. 如果Server1不是Leader,那么Server1会把接收到的请求进一步转发给Leader。
  3. Leader会将写入请求广播给各个Server,各个Server写入成功后会通知Leader。
  4. 当Leader收到半数以上的 Server 数据写入成功后,就说明数据真正写入成功了。
  5. 随后,Leader会告诉Server1数据写入成功。
  6. Server1再反馈通知 Client 数据写入成功,整个流程结束。
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号