zookeeper

  • 什么是zookeeper?
    • 配置管理
    • 名字服务
    • 分布式锁
    • 集群管理
  • Zookeeper核心概念
    • 文件系统数据结构Znode
    • 监听通知机制 Watch
  • zookeeper安装
  • 可以通过 bin/zkServer.sh 来查看都支持哪些参数

在了解Zookeeper之前,需要对分布式相关知识有一定了解,什么是分布式系统呢?通常情况下,单个物理节点很容易达到性能,计算或者容量的瓶颈,所以这个时候就需要多个物理节点来共同完成某项任务,一个分布式系统的本质是分布在不同网络或计算机上的程序组件,彼此通过信息传递来协同工作的系统,而Zookeeper正是一个分布式应用协调框架,在分布式系统架构中有广泛的应用场景。

什么是zookeeper?

官方文档上这么解释zookeeper,它是一个分布式协调框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。

继续说:

配置管理

在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们都是使用配置文件的方式,在代码中引入这些配置文件。但是当我们只有一种配置,只有一台服务器,并且不经常修改的时候,使用配置文件是一个很好的做法,但是如果我们配置非常多,有很多服务器都需要这个配置,而且还可能是动态的话使用配置文件就不是个好主意了。这个时候往往需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更。比如我们可以把配置放在数据库里,然后所有需要配置的服务都去这个数据库读取配置。但是,因为很多服务的正常运行都非常依赖这个配置,所以需要这个集中提供配置服务的服务具备很高的可靠性。一般我们可以用一个集群来提供这个配置服务,但是用集群提升可靠性,那如何保证配置在集群中的一致性呢? 这个时候就需要使用一种实现了一致性协议的服务了。Zookeeper就是这种服务,它使用Zab这种一致性协议来提供一致性。现在有很多开源项目使用Zookeeper来维护配置,比如在HBase中,客户端就是连接一个Zookeeper,获得必要的HBase集群的配置信息,然后才可以进一步操作。还有在开源的消息队列Kafka中,也使用Zookeeper来维护broker的信息。在Alibaba开源的SOA框架Dubbo中也广泛的使用Zookeeper管理一些配置来实现服务治理。

名字服务

名字服务这个就很好理解了。比如为了通过网络访问一个系统,我们得知道对方的IP地址,但是IP地址对人非常不友好,这个时候我们就需要使用域名来访问。但是计算机是不能是别域名的。怎么办呢?如果我们每台机器里都备有一份域名到IP地址的映射,这个倒是能解决一部分问题,但是如果域名对应的IP发生变化了又该怎么办呢?于是我们有了DNS这个东西。我们只需要访问一个大家熟知的(known)的点,它就会告诉你这个域名对应的IP是什么。在我们的应用中也会存在很多这类问题,特别是在我们的服务特别多的时候,如果我们在本地保存服务的地址的时候将非常不方便,但是如果我们只需要访问一个大家都熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。

分布式锁

Zookeeper是一个分布式协调服务。这样我们就可以利用Zookeeper来协调多个分布式进程之间的活动。比如在一个分布式环境中,为了提高可靠性,我们的集群的每台服务器上都部署着同样的服务。但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我们只让一个服务进行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即fail over到另外的服务。这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫Leader Election(leader选举)。比如HBase的Master就是采用这种机制。但要注意的是分布式锁跟同一个进程的锁还是有区别的,所以使用的时候要比同一个进程里的锁更谨慎的使用

集群管理

在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其他机器需要感知到这种变化,然后根据这种变化做出对应的决策。比如我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现在集群目前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态。还有,比如一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制)。还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理。

Zookeeper核心概念

主要有如下两个核心的概念:文件系统数据结构+监听通知机制。

文件系统数据结构Znode

ZooKeeper的视图数据结构,很像Unix文件系统,也是树状的,这样可以确定每个路径都是唯一的。zookeeper的节点统一叫做「znode」,它是可以通过「路径来标识」,结构图如下:

每个子目录项都被称作为 znode(目录节点),和文件系统类似,我们能够自由的增加、删除znode,在一个znode下增加、删除子znode。
有四种类型的znode:
1.persistent-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只要不手动删除该节点,他将永远存在
2.persistent_sequential-持久化顺序编号目录点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
3.ephemeral-临时目录节点
客户端与zookeeper断开连接后,该节点被删除
4.ephemeral_sequential-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
5. Container 节点(3.5.3 版本新增,如果Container节点下面没有子节点,则Container节点在未来会被Zookeeper自动清除,定时任务默认60s 检查一次)
6. TTL 节点( 默认禁用,只能通过系统配置zookeeper.extendedTypesEnabled=true 开启,不稳定)
过了TTL指定的时间时,被服务器删除
Znode
Znode数据节点的代码如下

public class DataNode implements Record {byte data[];      // 存储数据              Long acl;          //访问权限    public StatPersisted stat;  // 节点状态信息   包含Znode节点的状态信息,比如「事务id、版本号、时间戳」private Set<String> children = null;  //子节点引用
}


为了保证高吞吐和低延迟,以及数据的一致性,znode只适合存储非常小的数据,不能超过1M,最好都小于1K。

监听通知机制 Watch

Zookeeper 允许客户端向服务端的某个Znode注册一个Watcher监听,当服务端的一些指定事件触发了这个Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,然后客户端根据 Watcher通知状态和事件类型做出业务上的改变。

  1. 如果注册的是对某个节点的监听,则当这个节点被删除,或者被修改时,对应的客户端将被通知
  2. 如果注册的是对某个目录的监听,则当这个目录有子节点被创建,或者有子节点被删除,对应的客户端将被通知
  3. 如果注册的是对某个目录的递归子节点进行监听,则当这个目录下面的任意子节点有目录结构的变化(有子节点被创建,或被删除)或者根节点有数据变化时,对应的客户端将被通知。
    **注意:**所有的通知都是一次性的,及无论是对节点还是对目录进行的监听,一旦触发,对应的监听即被移除。递归子节点,监听是对所有子节点的,所以,每个子节点下面的事件同样只会被触发一次。
    工作原理

    1.Zookeeper的watch机制主要包括客户端线程,客户端watcherManager,Zookeeper服务器三部分。
    2.客户端向Zookeeper服务器注册watch的同时,会将watcher对象存储在客户端的watchmanager。
    3.当Zookeeper服务器触发watcher事件后,会向客户端发送通知,客户端线程从watchmanager中取出对应的watcher对象来执行回调逻辑。

zookeeper安装

Step1:配置JAVA环境,检验环境:
java -version
Step2: 下载解压 zookeeper
wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz
cd apache-zookeeper-3.5.8-bin
Step3: 重命名配置文件 zoo_sample.cfg
cp zoo_sample.cfg zoo.cfg
Step4: 启动zookeeper

可以通过 bin/zkServer.sh 来查看都支持哪些参数

bin/zkServer.sh start conf/zoo.cfg
Step5: 检测是否启动成功
echo stat | nc 192.168.109.200 // 前提是配置文件中中讲 stat 四字命令设置了了白名单
如:
4lw.commands.whitelist=stat
Step6: 连接服务器

bin/zkCli.sh -server ip:port

Step7: 使用命令行操作zookeeper
[zk: localhost:2181(CONNECTED) 80] help
ZooKeeper -server host:port cmd argsaddauth scheme authclose config [-c] [-w] [-s]connect host:portcreate [-s] [-e] [-c] [-t ttl] path [data] [acl]delete [-v version] pathdeleteall pathdelquota [-n|-b] pathget [-s] [-w] pathgetAcl [-s] pathhistory listquota pathls [-s] [-w] [-R] pathls2 path [watch]printwatches on|offquit reconfig [-s] [-v version] [[-file path] | [-members serverID=host:port1:port2;port3[,...]*]] | [-add serverId=host:port1:port2;port3[,...]]* [-remove serverId[,...]*]redo cmdnoremovewatches path [-c|-d|-a] [-l]rmr pathset [-s] [-v version] path datasetAcl [-s] [-v version] [-R] path aclsetquota -n|-b val pathstat [-w] pathsync path

Zookeeper基础知识(一)相关推荐

  1. ZooKeeper基础知识笔记(含3节点伪分布式安装配置流程)

    本笔记涉及代码:https://github.com/hackeryang/Hadoop-Exercises/tree/master/src/main/java/ZooKeeper 一.ZooKeep ...

  2. zookeeper基础知识整理

    http://blog.csdn.net/pelick/article/details/7269670 http://zookeeper.apache.org/doc/trunk/javaExampl ...

  3. 学习zookeeper基础知识

    定义: Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目. 工作机制: zookeeper从设计模式角度理解,是一个基于观察者模式设计的分布式服务管理框架,他负责存储 ...

  4. zookeeper基础知识以及常用命令

    zookeeper简介 1.中间件,提供协调服务. 2.作用于分布式系统,发挥其优势,可以为大数据服务. 3.支持java,提供Java和c语言的客户端API. 什么是分布式系统 1.很多台计算机组成 ...

  5. zookeeper 进入客户端_Zookeeper基础知识简单介绍

    (一)Zookeeper基础知识.体系结构.数据模型 1.zookeeper是一个类似hdfs的树形文件结构,zookeeper可以用来保证数据在(zk)集 群之间的数据的事务性一致. 2.zooke ...

  6. java培训基础知识都学哪些

    很多人都开始学习java技术,觉得java语言在未来的发展前景空间非常大,事实却是如此,那么针对于零基础的同学, 学习java技术需要学哪些呢?下面我们就来看看java培训基础知识都学哪些? java ...

  7. TCP/IP 基础知识总结

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 要说我们接触计算机网络最多的协议,那势必离不开 TCP/I ...

  8. Spark基础知识解答

    Spark基础知识解答 一. Spark基础知识 1. Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架. Spark基于mapred ...

  9. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

最新文章

  1. Linux 网卡驱动 PHY Mac MDIO kernel 驱动讲解 (未完待续)
  2. 全flash站制作剖析
  3. 厉害的壁纸,亲测有效
  4. Java开发技巧:Java如何编译运行?
  5. CM: How is attachment version implemented
  6. 语言 高速公路超速处罚_880关注 拆除!高速公路不合理限速标志!
  7. iBaits中,关于insert返回值的问题(注意!!!不必写resultClass= java.lang.Integer,方法的返回值就是int)
  8. 报错:fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle解决
  9. 企微主页_企业微信名片对外怎么显示官网和小程序?
  10. JDBC简介,JDBC API,,MySQL连接、SQL语句
  11. erp采购总监个人总结_ERP沙盘实训采购总监总结,学到了很多知识,受益匪浅
  12. pppd详解_PPPD
  13. Vivo手机获取文件管理器里的文件路径为空
  14. 计算机c盘可以删除的文件,电脑C盘上的文件哪些可以大胆删除的?
  15. 响应式布局以及提交网站
  16. Snipaste截图工具
  17. 金链盟中国区块链应用大赛正式启动,200万奖金花落谁家?
  18. 微信公众号模板消息申请开通流程
  19. 巴菲特五度减持中石油 共回笼资金30亿
  20. html 去掉边框阴影

热门文章

  1. iphone X 越狱笔记
  2. 什么叫做真正的学习能力!
  3. JS获取当前日期,获取上个月的日期,一个月有多少天
  4. Python正则表达式\W+和\W*匹配过程的深入分析
  5. MySQL窗口函数—分布函数- CUME_DIST和PERCENT_RANK
  6. 互联网基础结构发展的三个阶段及其特点
  7. Android 10 来袭
  8. 向下保留两位小数以及精度计算
  9. linux安装rpm提示nokey,Linux rpm安装问题解决
  10. linux设置文件为不可访问权限,Centos给文件设置了777权限仍不能访问解决方案