热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[大数据系列之Hadoop][2]Zookeeper学习笔记

2019独角兽企业重金招聘Python工程师标准Zookeeper是Hadoop的高可用高性能的分布式协调服务。1PartialFailure部分失败即:我们不

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Zookeeper 是Hadoop的高可用高性能的分布式协调服务。

 

1 Partial Failure 部分失败

即:我们不知道一个操作是否已经失败。分布式应用经常出现这个问题,比如:网络错误导致不知道对方是否收到,或者接受者进程死掉。解决方法:发送者重新连接接受者并且询问。

Zookeeper 不能避免这个问题,也不会隐藏部分失败。提供一组工具可以处理部分失败。

zookeeper特点

  • 简单:非常简单的文件系统,一个znode限制1MB
  • 丰富的building block实现多种协调数据结构和协议,例如:分布式队列,分布式锁,和领导选举 。

image

  • 高可用
  • 松耦合:进程可以在Zookeeper留下消息,另一个进程去读取。
  • 高性能:10000操作/s
  • ACID性:
    • 每个node原子性读写
    • 一旦更新成功,无roll back
    • 顺序一致性:客户端看到的是一个操作序列,有顺序的
    • node之间互相隔离
    • 用过commit log和replication 来保证durable(持久性)
  • CAP性:
    • Consistency:线性化写入,有全局序
    • 可能无法被写:严格的quorum(仲裁)机制(基于replication数)
    • Partion Tolerance
  • 例子:
    • 领导选举: 保证任何时刻只有一个active 的master
    • 配置管理: 存储bootstrap location
    • 成员管理: 发现服务器并且及时通知服务器挂掉的情况
  • 为何需要Zookeeper?
    • 自己写分布式协议来协调太烦了,容易错。
    • 分布式系统架构很难
    • races, deadlocks, inconsistency, reliability
    • 而 ZK 可以帮助解决上述问题。

2 安装和运行Zookeeper

解压zookeeper-.x.y.z.tar.gz 后 export PATH,然后设置 zoo.cfg

tickTime=2000 // zookeeper的基本时间单元,毫秒单位 

dataDir=/Users/tom/zookeeper // zookeeper数据存储目录 

clientPort=2181

启动 : zkServer.sh start

echo ruok | nc localhost 2181 查看Zookeeper服务是否完好。其他管理功能详见: http://zookeeper.apache.org/doc/trunk/zookeeperAdmin.html#sc_zkCommands 

Zookeeper服务

3.1 数据模型

  • 树形层次。znode与ACL关联,是一个小数据文件,1MB限制。
  • znode数据访问具有原子性,不会部分读写失败,不支持append操作。
  • 通过路径访问引用。不可使用zookeeper作为路径名,为保留字。

image

3.1.1 znode特性
1. 短暂znode

znode有两种类型:短暂(断开连接后被删除)和持久(断开连接后不会被删除)的,创建后无法被修改。因为znode的读写原子性,故而短暂znode适合于某个特定时刻的资源可用性判定。

2. 顺序号znode

znode的名称中包含Zookeeper单调递增的顺序号的znode,由其父znode维护用来保证znode的唯一性。顺序号可以被用来为所有的事件进行全局排序,客户端可以根据顺序号知道事件的先后顺序。例如:实现分布式共享锁。

3. 观察,watch

znode一旦发生某些操作,watch机制可以让客户端感知到。因为是小文件而且整体读写,故而摒弃了一半FS的基本操作“打开、关闭、查找”,也没必要。

3.1.2 操作

9中基本操作如下:其中delete和setData需要提供版本号,可以通过exists操作获取到。

image

3.1.3 集合更新 multiupdate

Zookeeper中有一个multi操作,可以用来把多个基本操作合成一个操作单元,原子性成功或者失败。例子:构建一个无向图。

3.1.4 API

有两种类型的API,同步和异步,后者吞吐量更高,适合事件驱动编程,前者响应性更好。以exist为例:

  • 同步:public Stat exists(String path, Watcher watcher) throws KeeperException, InterruptedException
  • 异步:public void exists(String path, Watcher watcher, StatCallback cb, Object ctx)
3.1.5 watch机制

客户端可以在某些操作上设置Watcher,然后这些操作会被另一些操作触发从而引起客户端感知,从而引起相应的行为。例如:客户端在exists操作上设置了Watcher,如果所观察的znode被创建、删除、或者更新数据了,则exists操作上的Watcher将被触发,从而可以执行一些操作。

下面是一个完整Watch机制的列表:

image

3.2 Zookeeper的副本模式

奇数个节点保证,半数以上处于可用状态,则认为其可用。

Zab协议:

1. 领导选举:半数以上或者指定数量的follower把自己的状态与leader同步,则完成选举过程。

2. 所有写请求发给leader,然后leader广播给follower,半数以上持久化后,leader则提交这个更新,客户端会收到一个更新成功的response。

 

3.3 Zookeeper Session

  1. 连接会尝试连接Zookeeper集群的多个服务器列表
  2. 连接建立后,在Session超时时间超过后,则断开连接,Session超时,短暂znode被删除,Session过期后则无法被打开
  3. Session空闲超过一定时间后,客户端会自动发ping请求(心跳),心跳间隔应该足够低,从而可以知道服务器down掉(判断是否down的标识是读是否超时)
  4. Zookeeper客户端自动进行Fail Over切换到另一台Zookeeper服务器,切换后,所有的session和短暂znode依然有效。
  5. 故障切换过程中,客户端将收到断开连接和连接至服务的通知。fail over的时候断开连接时watcher的通知将无法被发送,恢复连接后,延迟的watcher通知会被继续发送
  6. 几个时间参数:
    1. ticker time: Zookeeper中的基本时钟周期,定义互相交互的时间表,其他的时间都根据tick数来设计
    2. session timeout: 一般设置为2个tick到20个tick之间
    3. 读超时:该Zookeeper服务器dead
  7. session timeout的设置考虑:
    1. 短session timeout,好处:较快检测到机器故障,坏处:太短的话,网络繁忙导致其他数据包传输延迟。
    2. 应用的暂时znode创建很复杂的话,因为重建代价较大,故而兼用用长session timeout。
    3. 较长session timeout,还可以用来做应用重启和升级。
    4. 每个session有一个txid和密码被落盘存储,可以在重启应用时凭借这个来恢复session。
    5. 一般的规则是:Zookeeper中的服务器越多,那么session timeout就越大,连接超时、读超时、ping周期都被设置为和服务器数量正相关。如果频繁丢失连接,考虑增大timeout参数设置。

3.4 Zookeeper状态

image

  1. 注册Watcher对象,使用了Zookeeper对象的客户端可以收到状态转换通知,进入CONNECTED状态时,Watcher对象收到一个WatchedEvent通知,其中KeeperState为SyncConnnected。
  2. Zookeeper的Watcher对象事实上有两个责任:1. 观察znode变化的通知 2. 观察Zookeeper状态变化的通知。
  3. 进入closed,则为not alive,可以用过isAlive()来判断是否alive.

 

4 使用Zookeeper的例子

4.1 配置管理

原理:使用Watch机制,可以让配置被更改(znode)的时候通知其他Watcher,进行相应的操作。

4.2 分布式锁

原理:znode-sessionId-sequenceId单调递增,其中sequenceId最小的服务器获得锁。带上sessionId可以重试恢复。


转:https://my.oschina.net/xue777hua/blog/412133



推荐阅读
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
author-avatar
tql
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有