`
bestree007
  • 浏览: 10333 次
社区版块
存档分类
最新评论

对Zookeeper的一些分析 (转载)

阅读更多
    1. zookeeper不是为高可用性设计的
    2. 由于要跨机房容灾,很多系统实际上是需要跨机房部署的。出于性价比的考虑我们通常会让多个机房同时工作,而不会搭建N倍的冗余。也就是说单个机房肯定撑不住全流量(你能设想谷歌在全球只剩下一个机房在干活吗)。由于zookeeper集群只能有一个master,因此一旦机房之间连接出现故障,zookeeper master就只能照顾一个机房,其他机房运行的业务模块由于没有master都只能停掉。于是所有流量集中到有master的那个机房,于是系统 crash。
    • 即使是在同一个机房里面,由于网段的不同,在调整机房交换机的时候偶尔也会发生网段隔离的情况。实际上机房每个月基本上都会发生短暂的网络隔离之类的子网段调整。在那个时刻zookeeper将处于不可用状态。如果整个业务系统基于zookeeper(比如要求每个业务请求都先去zookeeper获取业务系统的master地址),则系统的可用性将非常脆弱。
    • 由于zookeeper对于网络隔离的极度敏感,导致zookeeper对于网络的任何风吹草动都会做出激烈反应。这使得zookeeper的‘不可用’时间比较多,我们不能让zookeeper的‘不可用’,变成系统的不可用。
    1. zookeeper的选举过程速度很慢
    2. 这是一个很难从理论分析上看到的弱点,但是你一旦遇到就会痛不欲生。
    • 前面我们已经说过,网络实际上常常是会出现隔离等不完整状态的,而zookeeper对那种情况非常敏感。一旦出现网络隔离,zookeeper就要发起选举流程。
    • zookeeper的选举流程通常耗时30到120秒,期间zookeeper由于没有master,都是不可用的。
    • 对于网络里面偶尔出现的,比如半秒一秒的网络隔离,zookeeper会由于选举过程,而把不可用时间放大几十倍。
    1. zookeeper的性能是有限的
    2. 典型的zookeeper的tps大概是一万多,无法覆盖系统内部每天动辄几十亿次的调用。因此每次请求都去zookeeper获取业务系统master信息是不可能的。
    • 因此zookeeper的client必须自己缓存业务系统的master地址。
    • 因此zookeeper提供的‘强一致性’实际上是不可用的。如果我们需要强一致性,还需要其他机制来进行保障:比如用自动化脚本把业务系统的old master给kill掉,但是那会有很多陷阱(这里先不展开这个议题,读者可以自己想想会有哪些陷阱)。
    1. zookeeper无法进行有效的权限控制
    2. zookeeper的权限控制非常薄弱
    • 在大型的复杂系统里面,使用zookeeper必须自己再额外的开发一套权限控制系统,通过那套权限控制系统再访问zookeeper
    • 额外的权限控制系统不但增加了系统复杂性和维护成本,而且降低了系统的总体性能
    1. 即使有了zookeeper也很难避免业务系统的数据不一致
    2. 前面已经讨论过了,由于zookeeper的性能限制,我们无法让每次系统内部调用都走zookeeper,因此总有某些时刻,业务系统会存在两个 master(业务系统client那边缓存的业务系统master信息是定时从zookeeper更新的,因此会有更新不同步的问题)。
    • 如果要在业务系统client的master信息不一直的情况下,仍要保持系统的数据一致性,唯一的方法是“先kill掉老master,再在 zookeeper上更新master信息”。但是在是否要kill current master这个问题上,程序是无法完全自动决定的(因为网络隔离的时候zookeeper已经不可用了,自动脚本没有全局信息,不管怎么做都可能是错的,什么都不做也可能是错的。当网络故障的时候,只有运维人员才有全局信息,程序是无法接电话得知其他机房的情况的)。因此系统无法自动的保障数据一致性,必须要人工介入。而人工介入的典型时间是半个小时以上,我们不能让系统这么长时间不可用。因此我们必须在某个方向上进行妥协,最常见的妥协方式是放弃 ‘强一致性’,而接受‘最终一致性’。
    • 如果我们需要人工介入才能保证‘可靠的强一致性’,那么zookeeper的价值就大打折扣。
    1. 我们能做什么
    2. 我们或者选择人工介入的强一致性,或者选择程序自动化进行的弱一致性。需要进行取舍。
    • 最终一致性甚至未必是程序来做的,有时候人工修正数据反而在灵活、可靠、低成本上有优势。这需要权衡。
    • 不要迷信zookeeper,有时候不妨考虑一下主备数据库。数据库自带权限控制,用起来比zookeeper方便多了。
    • zookeeper 比较有价值的东西也许是内容变化的时候,可以阻塞回调的方式通知所有在线的client实时更新信息,但这个功能用处不大。因为php这样的模块你很难说它是在线还是离线,每次都是新发起的。一旦这个功能无法支持php,就无法覆盖整个系统,那么就无法保证强一致性了
  • 分享到:
    评论

    相关推荐

      Zookeeper源码分析.epub

      Zookeeper源码分析.epub

      Zookeeper源码分析

      通过对Zookeeper源码的分析,我们可以理解其如何在分布式环境中实现高可用性和一致性。FastLeader选举算法保证了领导者的快速选举,而Paxos算法的灵感则提供了数据的一致性保证。深入学习和理解这些核心机制,有助于...

      zookeeper源码分析

      第2章 ZooKeeper之序列化组件源码解析【透视现象,直击本质】 第4章 持久化【高手过招必备】 第6章 服务器启动 【由浅入深,先学好单机版,才能掌握集群版】 第7章 会话管理 【无处不在的会话其实没那么难】 第8章 ...

      zookeeper-3.4.6_zookeeper_

      在Zookeeper-3.4.6版本中,可能包含了一些性能优化、bug修复和新的特性的引入。例如,可能会改进了客户端API的易用性,增强了系统的稳定性和容错性,或者增加了对更大规模集群的支持。不过,具体改动需要查看官方...

      ELK+Filebeat+Kafka+ZooKeeper构建日志分析平台

      ELK+Filebeat+Kafka+ZooKeeper构建日志分析平台,架构图解

      zookeeper可视化工具

      这些工具通过图形用户界面(GUI)提供对Zookeeper状态的直观展示,帮助用户查看节点信息、操作数据、监控集群状态以及进行故障排查。 本文将详细介绍Zookeeper可视化工具的相关知识点,并探讨如何利用它们来优化...

      ZooKeeper实用分析.pptx

      ZooKeeper实用分析。包括基础特性与核心原理分析。 典型案例分析、会话、监视与通知、基础API和高级封装库、客户端故障处理、服务角色、群首选举、多数原则、Zab协议、事务、快照、重配置等。

      zookeeper-3.6.3.zip

      描述"zookeeper-3.6.3"简洁地指出了这是Zookeeper的3.6.3版本,这个版本可能包含了一些新特性、性能优化或者已知问题的修复。 标签"Zookeeper"明确了讨论的主题,Zookeeper是一个由Apache基金会维护的开源项目,它...

      Zookeeper

      通过以上对Zookeeper的详细介绍,我们可以看到它在分布式系统中的重要地位,无论是数据一致性还是服务协调,Zookeeper都提供了强大的支持。对于开发者而言,理解和掌握Zookeeper的工作原理和使用技巧,无疑能提升在...

      zookeeper集群升级方案

      通过对Zookeeper集群从3.3.4版本升级至3.4.8版本的过程进行详细的规划与实施,不仅可以提高系统的性能与稳定性,还能够更好地支持业务发展。在整个升级过程中,需要注意备份、测试验证、逐步割接等关键环节,以确保...

      zookeeper限制ip版

      然而,对于网络安全的考量,有时我们需要对访问Zookeeper的IP进行控制,以避免非法或恶意的访问。本篇文章将深入探讨如何在Zookeeper 3.4.14版本中添加IP黑白名单功能,并详细解析源码改造过程。 1. **IP限制需求...

      zookeeper增加权限登录验证

      然而,在 ZooKeeper 中存在一些安全漏洞,例如未经授权的访问、数据泄露等。为了解决这些问题,本文将介绍如何在 ZooKeeper 中增加权限登录验证,以限制访问 IP 地址。 一、背景知识 ZooKeeper 是一个基于 Java 的...

      【Zookeeper管理工具】

      2. **Watcher**: Watcher是Zookeeper的事件监听机制,可以设置对特定Znode的监听,当该节点状态发生变化时,Watcher会接收到通知。 3. **会话(Session)**: 用户与Zookeeper服务器之间的连接称为会话,会话期间,...

      zookeeper-3.8.0安装包下载

      4. 监控与调试:了解如何查看 Zookeeper 的运行状态,如使用 jmx 监控、日志分析等。 5. 客户端使用:学习如何编写 Java 或其他语言的客户端代码,与 Zookeeper 交互。 6. 高可用性与故障恢复:理解 zab 协议的工作...

      zookeeper 3.6.3 源码下载

      3. **Watcher**:ZooKeeper提供了一种事件监听机制,称为Watcher,允许客户端注册对特定ZNode的兴趣,当ZNode状态发生变化时,ZooKeeper会通知相应的客户端。 **ZooKeeper的工作原理** 1. **主备选举(Leader ...

      Zookeeper_安装和配置

      2. **配置**:分别对每个副本的 `zoo.cfg` 进行配置,包括添加集群相关参数和修改数据目录、端口号: - `initLimit`:设置 follower 与 leader 初始同步时的最大心跳时间。 - `syncLimit`:设置 leader 与 ...

      深入分析zookeeper实现原理

      通过以上对Zookeeper的深入分析,我们可以看出Zookeeper在分布式系统中的重要作用。无论是数据的一致性保证还是复杂的分布式场景应用,Zookeeper 都提供了简单而强大的支持。对于开发者来说,掌握 Zookeeper 的原理...

      apache-zookeeper-3.7.1

      apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper-3.7.1 apache-zookeeper...

      ZooKeeper3.4.9 windos和linux

      7.2 日志分析:定期检查日志文件,排查可能的错误和异常。 总结,ZooKeeper 3.4.9在Windows和Linux上的部署与应用涵盖了从基本安装到集群配置,再到实际应用场景的多个层面。理解并熟练掌握这些知识,对于构建和...

    Global site tag (gtag.js) - Google Analytics