写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
参考内容:
《私塾在线》,cc老师
--------------------------------------------------------------------
主要内容包括:
- zookeeper简介
- zookeeper安装和运行
- zookeeper基本概念
------------------------------------------------------------------------------
1、Zookeeper简介
(1)是什么
Zookeeper是一个高性能的、开源的分布式系统的协调(Coordination)服务.
(2)能干什么
Zookeeper主要用来实现:配置管理、名字服务、提供分布式同步以及集群管理等服务,以及它们延伸的、变形的功能服务。
(3)特点
- 简单:Zookeeper允许程序通过一个共享的、类似于标准文件系统的、有组织的分层命名空间(znode)分布式处理协调。
- 强一致性:Zookeeper用数字标记每一个更新,用它来反射出所有的事务顺序。随后的操作可以使用这个顺序去实现更高级的抽象。
- 可靠:Zookeeper在处理协调的时候会自动复制多个主机。Zookeeper服务的组成部分彼此都知道彼此,它们维持了一个内存状态影像,连同事务日志和快照在一个持久化的存储中。
- 高效:Zookeeper的数据保持在内存中,这就意味着它可以实现高吞吐量和低延迟的数据。Zookeeper在读比写多的时候运行的最好,读写大概比例在10:1
------------------------------------------------------------------------------
2、Zookeeper的安装运行
(1)到zookeeper官网去下载最新的稳定版本,目前是3.4.9
(2)在centos7上面只需要解压,然后拷贝到相应的位置即可
(3)进入conf文件夹下面,拷贝zoo_sample.cfg为zoo.cfg
(4)修改zoo.cfg文件的相应配置参数
zoo.cfg配置文件参数说明:
- tickTime: Zookeeper使用的基本时间,时间单位为毫秒。它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。
- dataDir: 保存内存数据库快照信息的位置,如果没有其他说明,更新的事务日志也保存到数据库。
- clientPort: 监听客户端连接的端口。
(5)启动、关闭、客户端连接
启动:
在zookeeper的bin目录下,执行: ./zkServer.sh start
关闭:
在zookeeper的bin目录下,执行: ./zkServer.sh stop
客户端连接:
在zookeeper的bin目录下,执行 ./zkCli.sh
------------------------------------------------------------------------------
3、Zookeeper的基本概念
(1)Zookeeper数据模型
如上图所示,Zookeeper数据模型的结构与Unix文件系统很类似,整体上可以看作是一棵树,每个节点称作一个ZNode。每个ZNode都可以通过其路径唯一标识,比如上图中第三层的第一个ZNode,它的路径是/app1/c1。在每个ZNode上可存储少量数据(默认是1M,可以通过配置修改,通常不建议在ZNode上存储大量的数据)。
另外,每个ZNode上还存储了其Acl消息(access control list),这里需要注意,虽然ZNode的树形结构跟Unix文件系统很类似,但是其Acl与Unix文件系统是完全不同的,每个ZNode的Acl是独立的,子结点不会继承父结点的。
(2)Znode的数据模型
Znode维护了一个stat结构,这个stat包含数据变化的版本号、访问控制列表变化、还有时间戳。 版本号和时间戳一起,可让Zookeeper验证缓存和协调更新。每次znode的数据发生了变化,版本号就增加。
例如,无论何时客户端检索数据,它也一起检索数据的版本号。并且当客户端执行更新或删除时,客户端必须提供它正在改变的znode的版本号,如果它提供的版本号和真实的数据版本号不一致,更新将会失败。
Zookeeper中的每个znode的stat机构都由下面的字段组成:
- czxid -- 引起这个znode创建的zxid
- mzxid -- znode最后更新的zxid
- ctime -- znode被创建的毫秒数(从1970年开始)
- mtime -- znode最后被修改的毫秒数(从1970年开始)
- dataversion -- znode数据变化号
- cversion -- znode子节点变化号
- aversion -- znode访问控制列表的变化号
- ephemeralOwner -- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0.
- dataLength -- znode的数据长度
- numChildren -- znode子节点数量
(3)ZNode分类
ZNode根据其本身的特性,可以分为下面两类:
- 持久型ZNode,用户需要显示的创建、删除
- Ephemeral ZNode,临时型ZNode,用户创建它之后,可以显示的删除,也可以在创建它的Session结束后,由Zookeeper Server自动删除。这些znode一旦session创建就存在,session结束就被删除,因为这个特性,临时节点不允许有子节点。
(4)Zookeeper里的计时
Zookeeper通过多种方式追踪计时:
- Zxid(事务ID):每个Zookeeper状态的变化都以zxid的形式接收到标记。这个是Zookeeper所有变化的总排序。每个变化都会有一个zxid,并且zxid1早于zxid2则zxid1一定小于zxid2.
- 版本号:节点的每个变化都会引起那个节点的版本号的其中之一增加。这三个版本号是: version(znode的数据变化版本号)、cversion(子目录的变化版本号)、aversion(访问控制列表的变化版本号)。
- Ticks:当使用多服务器的Zookeeper时,服务器使用ticks定义事件的时间,如状态上传,会话超时,同事之间的连接超时等等。tick次数只是通过最小的会话超时间接暴露; 如果一个客户端请求的会话超时小于最小的会话超时,服务器就会告诉客户端会话超时实际上是最低会话超时时间。
- Real time: Zookeeper不使用实时或时钟时间,除了将时间戳加载znode创建和更新的stat结构上。