读<分布式一致性原理>初识zookeeper

zookeeper是什么


zookeeper是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如:数据发布/订阅,负载均衡,命名服务,分布式协调/通知

,集群管理,Master选举,分布式锁和分布式队列等功能。zookeeper可以保证如下分布式一致性特性。

顺序一致性

从同一个客户端发起的事务请求,最终将会严格的按照发起顺序被应用到zookeeper中去。

原子性

所有的事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,也就是说,要么整个集群所有机器都成功应用了某一个事务,要么

都没有应用。一定不会出现集群中部分机器应用了该事务,而另外一部分没有应用的情况。

单一视图

无论客户端连接的是哪个zookeeper服务器,其只看到的服务端数据模型都是一致的。

可靠性

一旦服务端成功的应用了一个事务,并完成对客户端的响应,那么该事物所引起的服务端状态变更将会被一致保留下来,

除非有另一个事务对其进行了更改。

实时性

一旦一个事务被成功应用,那么客户端能够立即从服务端上读取到这个事务变更后的最新数据状态。但是这里需要注意的是

zookeeper仅仅保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。

 

zookeeper的设计目标

1.简单的数据结构模型

zookeeper通过一个共享的树形结构名字空间使得分布式能够进行相互协调。树形结构的名字空间是由一些列znode的的数据节点组成的。

zookeeper将全部数据存储在内存中,用来提高服务器吞吐量,降低延迟。

2.可以构建集群

zookeeper的集群一般由3-5台机器就可以构成一个集群。组成zookeeper集群的每台机器都会在内存中维护当前的服务器

状态,并且每台机器之间都互相保持着通信。只要集群中存在超过一半的机器能够正常工作,那么整个集群就能正常对外服务。

zookeeper的客户端程序会选择和集群中任一机器来创建一个TCP连接,而一旦客户端和某太zookeeper服务器之间连接中断后,

客户端户自动连接集群中的其他机器。

3.顺序访问

对于来自客户端的每个更新请求,zookeeper都会分配一个全局唯一的递增编号,这个编号反映了所有事物操作的先后顺序,应用程序

可以使用zookeeper的这个特性来实现更高层次的同步原语。

4.高性能

由于zookeeper将全量数据存储在内存中,并直接服务于客户端的所有非事务请求,因此它尤其使用于以读操作为主的应用场景。

zookeeper的基本概念

1.集群角色

  通常在分布式系统中,构成集群的每台机器都有自己的角色,最典型的集群模式就是Master/Slave(主备模式)。在这种模式中

我们把所有能够处理写操作的机器称为Master机器,把所有通过异步复制方式获取最新数据,并且提供读服务的机器称为Slave机器

  而在zookeeper中,这些概念被颠覆了。它没有沿用传统的Master/slave概念,而是引入了Leader,Follwer,和Observer三种角色。

zookeeper集群中的所有机器通过一个Leader选举过程来选定一个被称为Leader的机器,Leader服务器为客户端提供读和写服务。

Follower和Observer都能够提供读服务,唯一的区别是,Observer机器不参与Leader选取过程,也不参与写操作的“过半写成功”策略。

因此Observer可以在不影响写性能的情况下提升集群的读性能。

2.会话(session)

Session是指客户端会话,在讲解会话之前,我们首先了解一下客户端连接。

在zookeeper中,一个客户端连接是指客户端和服务器之间的一个TCP长连接。zookeeper对外服务的端口默认是2181,客户端启动的

时候会先与一个服务器建立连接。从一次建立连接开始,客户端的生命周期也就开始了,通过这个连接,客户端能够通过心跳检测与服务器保持有效

会话,也能够向zookeeper发送请求和接收响应。同事还能够通过该连接来接受来自服务器的Watch事件通知。session的sessionout值来设置一个与服务器会话的

超时时间。由于网路原因或服务器压力太大或是客户端主动断开连接等原因导致服务端和客户端连接断开,只要在sessionTimeOut规定时间内,客户端能与服务器任意

一台机器建立连接,那么之前建立的会话仍然有效。

3.数据节点(znode)

  在谈到分布式的时候,我们通常说的“节点”是指组成集群的每一台机器。在zookeeper中,“节点”分为两类,第一类是指构成集群的机器,

我们称之为机器节点。第二类是数据模型中的数据单元,我们称之为数据节点---znode。zookeeper将所有的数据存储在内存中。

数据模型是一颗树,由"/"进行分割路径。每个znode都会保存自己的数据内容,同时还会保存一些属性信息。

  在zookeeper中,zone可以分为持久节点和临时节点。持久节点是指一个znode被创建了除非主动进行移除操作,否则这个znode

将一直处在zookeeper上。而临时节点就不一样了,它 的生命周期和会话绑定,一旦客户端会话失效,那么由这个客户端创建的所有

临时节点都将被移除。zookeeper还允许为每个节点添加一个特殊属性:SEQUENTIAl。一旦节点被标上这个属性,那么zookeeper在创建这个节点时会自动在节点后面

加一个整形数字。这个数字是由父节点维护的递增数字。

4.版本

zookeeper的每个znode都会存储数据,对于每个znode ,zookeeper都会维护一个stat的数据结构。Stat中记录着这个znode的三个数据版本

分别是Version(当前的数据版本)Cversion(当前znode子节点版本)和aversion(当前znode的ACL版本)

5.Watcher

zookeeper允许在指定节点注册一些watcher,并且在一些特定事件发生的时候,zookeeper会将事件通知发送到感兴趣的客户端上去。

6.ACL

zookeeper采用ACL策略进行权限控制。zookeeper定义了5种权限

原文地址:https://www.cnblogs.com/duan2/p/9043613.html