zookeeper是一个高性能,可扩展的服务.zookeeper的读操做
和写操做的设计目标就是速度快,不过zookeeper的读比写快,在读的场景下,zookeeper能够将读的压力分散到不一样的follow服务节点上,并且须要读取的数据大部分是已经被更新好了的'旧'的数据,而写操做须要在各个节点间保证一致性同步.保证数据的一致性同步是zookeeper的核心功能,他提供以下保证:html
可靠性: 一旦更新被应用了,那么数据就会被持久化了不会被丢失或者篡改除非客户端后面主动的修改这个值,这个保证有2个推论:apache
使用这些一致性保证很容易在ZooKeeper客户端上创建更高级别的功能,好比leader选举、障碍、队列和读/写可撤销锁(不须要添加ZooKeeper),更多状况请看:Recipes and Solutions服务器
注意网络
一些开发者会错误的认为除了上面讲到的一致性保障外,还有例外的一种保障zookeeper不能支持,这保障就是时间上彻底同时的一致性跨客户端视图:zookeeper没法确保集群中的任意一个节点都会彻底同时的执行一个同一个操做,由于网络通讯是有延迟的,一个客户端更新操做是在例外一个客户端接到数据更新通知的前面发生的,考虑下面的场景,有A,B共2个客户端,若是A更新了/a节点的数据由0到1,而后告诉B客户端去读取/a,客户端B可能会读到/a的旧数据,取决于B是从那个节点读取/a(读取leader是最新的,可是读取follow多是旧的).若是客户端A和客户端B读取相同的值很重要,客户端B应该在执行读取操做以前调用zookeeper API方法中的sync()方法.因此,zookeeper自己并不能保证在全部服务器上同步发生变化,可是zookeeper原语能够用来构建更高级别的函数,提供有用的客户端同步.函数
参考:性能
本文原创连接: zookeeper 一致性保障设计