【转载】对 Zookeeper 的一些分析

1. zookeeper 不是为高可用性设计的 

  • 由于要跨机房容灾,很多系统实际上是需要跨机房部署的。出于性价比的考虑我们通常会让多个机房同时工作,而不会搭建 N 倍的冗余。也就是说单个机房肯定撑不住全流量(你能设想谷歌在全球只剩下一个机房在干活吗)。由于 zookeeper 集群只能有一个 master ,因此一旦机房之间连接出现故障,zookeeper master 就只能照顾一个机房,其他机房运行的业务模块由于没有 master 都只能停掉。于是所有流量集中到有 master 的那个机房,于是系统 crash 。
  • 即使是在同一个机房里面,由于网段的不同,在调整机房交换机的时候偶尔也会发生网段隔离的情况。实际上机房每个月基本上都会发生短暂的网络隔离之类的子网段调整。在那个时刻 zookeeper 将处于不可用状态。如果整个业务系统基于 zookeeper(比如要求每个业务请求都先去 zookeeper 获取业务系统的master 地址),则系统的可用性将非常脆弱。
  • 由于 zookeeper 对于网络隔离的极度敏感,导致 zookeeper 对于网络的任何风吹草动都会做出激烈反应。这使得 zookeeper 的‘不可用’时间比较多,我们不能让 zookeeper 的‘不可用’,变成系统的不可用。

2. zookeeper 的选举过程速度很慢 

  • 这是一个很难从理论分析上看到的弱点,但是你一旦遇到就会痛不欲生。
  • 前面我们已经说过,网络实际上常常是会出现隔离等不完整状态的,而 zookeeper 对那种情况非常敏感。一旦出现网络隔离,zookeeper 就要发起选举流程。
  • zookeeper 的选举流程通常耗时 30 到 120 秒,期间 zookeeper 由于没有 master,都是不可用的。
  • 对于网络里面偶尔出现的,比如半秒一秒的网络隔离,zookeeper 会由于选举过程,而把不可用时间放大几十倍。

3. zookeeper 的性能是有限的 

  • 典型的 zookeeper 的 tps 大概是一万多,无法覆盖系统内部每天动辄几十亿次的调用。因此每次请求都去zookeeper 获取业务系统 master 信息是不可能的。
  • 因此 zookeeper 的 client 必须自己缓存业务系统的 master 地址。
  • 因此 zookeeper 提供的‘强一致性’实际上是不可用的。如果我们需要强一致性,还需要其他机制来进行保障:比如用自动化脚本把业务系统的 old master 给 kill 掉,但是那会有很多陷阱(这里先不展开这个议题,读者可以自己想想会有哪些陷阱)。

4.zookeeper 无法进行有效的权限控制 

  • zookeeper 的权限控制非常薄弱。
  • 在大型的复杂系统里面,使用 zookeeper 必须自己再额外的开发一套权限控制系统,通过那套权限控制系统再访问 zookeeper 。
  • 额外的权限控制系统不但增加了系统复杂性和维护成本,而且降低了系统的总体性能。

5.即使有了 zookeeper 也很难避免业务系统的数据不一致 

  • 前面已经讨论过了,由于 zookeeper 的性能限制,我们无法让每次系统内部调用都走 zookeeper,因此总有某些时刻,业务系统会存在两个 master(业务系统 client 那边缓存的业务系统 master 信息是定时从zookeeper 更新的,因此会有更新不同步的问题)。
  • 如果要在业务系统 client 的 master 信息不一直的情况下,仍要保持系统的数据一致性,唯一的方法是“先 kill 掉老 master,再在 zookeeper 上更新 master 信息”。但是在是否要 kill current master 这个问题上,程序是无法完全自动决定的(因为网络隔离的时候 zookeeper 已经不可用了,自动脚本没有全局信息,不管怎么做都可能是错的,什么都不做也可能是错的。当网络故障的时候,只有运维人员才有全局信息,程序是无法接电话得知其他机房的情况的)。因此系统无法自动的保障数据一致性,必须要人工介入。而人工介入的典型时间是半个小时以上,我们不能让系统这么长时间不可用。因此我们必须在某个方向上进行妥协,最常见的妥协方式是放弃‘强一致性’,而接受‘最终一致性’。
  • 如果我们需要人工介入才能保证‘可靠的强一致性’,那么 zookeeper 的价值就大打折扣。

6.我们能做什么 

  • 我们或者选择人工介入的强一致性,或者选择程序自动化进行的弱一致性。需要进行取舍。
  • 最终一致性甚至未必是程序来做的,有时候人工修正数据反而在灵活、可靠、低成本上有优势。这需要权衡。
  • 不要迷信 zookeeper,有时候不妨考虑一下主备数据库。数据库自带权限控制,用起来比 zookeeper 方便多了。
  • zookeeper 比较有价值的东西也许是内容变化的时候,可以阻塞回调的方式通知所有在线的 client 实时更新信息,但这个功能用处不大。因为 php 这样的模块你很难说它是在线还是离线,每次都是新发起的。一旦这个功能无法支持 php,就无法覆盖整个系统,那么就无法保证强一致性了。

PS:以上只是个人对 zookeeper 的一些认识,欢迎讨论和指正。 

原文地址:http://blog.csdn.net/wwwsq/article/details/7644445

时间: 2024-10-21 15:14:17

【转载】对 Zookeeper 的一些分析的相关文章

Zookeeper ZAB 协议分析

前言 ZAB 协议是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的原子广播协议.在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeeper 实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性. Atomic broadcast protocol ZAB 是 Zookeeper 原子广播协议的简称,下面我们来讨论协议的内容,注意:理论与实现是有区别的,如果你对协议的理论不感兴趣,可以直接跳过看实现. 问题的提出 Zoo

zookeeper源码分析之leader选举

zookeeper提供顺序一致性.原子性.统一视图.可靠性保证服务zookeeper使用的是zab(atomic broadcast protocol)协议而非paxos协议zookeeper能处理并发地处理多个客户端的写请求,并且以FIFO顺序commit这些写操作,zab采用了一个事务ID来实现事务的全局有序性,在Zab协议的实现时,分为三个阶段:1. Leader Election2. Recovery Phase3. Broadcast Phase 今天就先分析选举算法的源码实现 zoo

[转载]Linux 线程实现机制分析

  自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性.效率.本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads 线程库的实现及其不足,描述了 Linux 社区是如何看待和解决兼容性和效率这两个问题的.   一.基础知识:线程和进程 按照教科书上的定义,进程是资源管理的最小单位,线程是程序执行的最小单位.在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开

[转载]JDK自带VM分析工具jps,jstat,jmap,jconsole

一.概述      SUN 的JDK中的几个工具,非常好用.秉承着有免费,不用商用的原则.以下简单介绍一下这几种工具.(注:本文章下的所有工具都存在JDK5.0以上版本的工具集里,同javac一样,不须特意安装)  .           我一共找到以下四个工具:重点看看jconsole和jmap. jps :与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat :一个极强的监视VM内存工具.可以用来监视VM内存内的各种堆和非堆

从四方面分析网站用户体验不好的原因

用户体验就是需要让用户粘在网站上,如果网站无法粘住用户,自然就不用谈什么用户体验了.所以,把用户粘在网站,自然就需要站长们的认真琢磨自己的用户群喜欢什么样的内容.喜欢什么样的界面.其实提高用户体验就是琢磨用户的心思,只要摸到用户的大致爱好,自然就可以对症下药了.站长需要想方设法的为用户着想,尽可能的满足用户的种种需求,说白了,网站就是为了用户而存在的,只要有用户粘在网站上,其他什么的都迎刃而解了.今天谈谈为什么网站不能让用户粘住的原因: 一.网站界面不美观 其实用户第一次访问网站,就相当于第一次

Paxos算法之旅(四)zookeeper代码解析

ZooKeeper是近期比较热门的一个类Paxos实现.也是一个逐渐得到广泛应用的开源的分布式锁服务实现.被认为是Chubby的开源版,虽然具体实现有很多差异.ZooKeeper概要的介绍可以看官方文档:http://hadoop.apache.org/zookeeper 这里我们重点来看下它的内部实现. ZooKeeper集群中的每个server都要知道其他成员,通过在配置文件zoo.cfg中作如下配置实现: tickTime=2000 dataDir=/var/zookeeper/ clie

Zookeeper Api(java)入门与应用

[本文转载于Zookeeper Api(java)入门与应用] 如何使用 Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化.通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,后面将会详细介绍 Zookeeper 能够解决的一些典型问题,这里先介绍一下,Zookeeper 的操作接口和简单使

怎么来分析网站的用户体验

一.网站界面不美观 其实用户第一次访问网站,就相当于第一次跟陌生人见面一样,第一印象好不好全凭第一眼缘.同样道理,用户访问网站也是,第一眼就是网站的界面.很多站长都不怎么在意网站界面的作用,但是界面往往可以让用户从第一眼会不会喜欢上网站.所以有些网站不能粘住用户,使大部分用户都是一次性访问而已的,原因就是界面的不美观,而很多站长都不在意界面,况且大部分的个人站长的源码都是网上下载的,都使用官网的自带模板,所以,很难想象,这样的网站可以粘住用户,毕竟用户的第一感觉就不能充分的感觉到新鲜,所以,也没

站长应该怎样看待文章被转载

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 原创文章看过很多,其实在看到很多网站的文章后,其实发现网络中的原创,通常是某个网站中首发的文章或者是其他的文字性的描述,很快的你就能够在其他的网站中看到.作为宣传网站的软文来说,自己的原创文章若是被别人转载或者是被别人伪原创,其实自己还是挺高兴的,因为写软文的目的就是增加外链. 而就笔者本人而言,本人认为自己的文笔是属于很一般的范畴,通常很多