一 zookeeper简介
ZooKeeper,简称zk,一个分布式协调服务的开源框架,分布式小文件存储系统,主要用来解决分布式集群中应用系统的一致性问题,例如怎样避免同时操作统一数据造成脏读的问题。
二 特性
- 全局数据一致:无论客户端连接到哪个服务器查看到的数据都是一致的。
- 可靠性:如果消息被其中一台服务器接受,那么将被所有的服务器接受。
- 顺序性:包括全局有序和偏序两种:全局有序是指如果一台服务器上消息a在消息b前发布,则在所有server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发布者发布,a比排在b前。
- 数据更新原子性:数据更新要么成功要么失败。
- 实时性:zookkeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。
三 集群角色
Leader
zookeeper集群工作的核心,事物请求(写操作)的唯一调度者和处理者,保证集群事物处理的顺序性;集群内部各个服务器的调度者。create、delete等写操作请求需要统一转发给leader处理,leader需要决定编号、执行操作,这个过程称为事务。
Follower
处理客户端非事务(读操作)请求,转发事务请求给leader,参与集群leader选举投票。
Observer
观察zookeeper集群的最新状态变化并同步,对于非事务请求可以独立处理,对于事务请求转发给leader。不参与leader选举投票,通常用于不影响集群事物处理能力的前提下提升集群的非事务处理能力。(无投票功能的follower)
四 zookeeper集群搭建
通常由2n+1台机器组成(保证投票结果为多数)。
运行需要java环境,过程:
- 配置主机名称到ip地址映射配置
- 修改zookeeper配置文件
- 远程复制分发安装文件
- 设置myid
- 启动zookeeper集群
安装jdk后,date查看集群时间是否同步,date -s
同步集群时间,chkconfig iptables off
关闭防火墙(保证端口通信),检测主机ip映射配置,zookeeper安装包上传到服务器解压,修改服务器环境变量,修改zookeeper配置文件(/zookeeper/conf),复制一份zoo_sample.cfg并修改:
配置文件参数说明:
- tickTime是zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,每个时间间隔发送一个信号。
- initLimit配置zookeeper接受客户端请求最大时长
- syncLimit标识leader与follower之间发送消息,请求和应答时间时间长度,最长不能超过ticktime
- dataDir是zookeeper保存数据的目录,默认写数据的日志文件也保存在这个目录下
- clientPort这个端口就是客户端连接zookeeper服务器的端口,zookeeper监听这个端口接受客户端的访问请求。
- server.A=B:C:D中A是编号,表示这个是第几号服务器,B是服务器的ip地址,C心跳端口(通信),D(选举端口)(eg:server.1=270.0.0.1:2888:3888 server.2=270.0.0.2:2888:3888)配置服务器集群
dataDir目录下创建一个zkdata目录,新建myid文件,文件保存机器编号(A)。每台机器都配置。
对应节点配置文件添加peerType=observer
使用Observer模式,配置文件指定哪些节点为Observerserver.1:localhost:2181:3181:observer
。
../zookeeper/bin/zkServer.sh start
启动zookeeper。每台机器都启动。
../zookeeper/bin/zkServer.sh status
查看zookeeper角色和配置。
../zookeeper/bin/zkServer.sh stop
停止zookeeper。
五 zookeeper数据模型
树形层次结构,每个节点被称为一个Znode
- Znode兼具文件和目录特点。维护信息同时可以作为路径表示一部分。
- Znode具有原子性操作。读操作将获取与节点相关的所有数据,写操作也将替换节点的所有数据。每个节点有自己的ACL(访问控制列表)规定用户权限,限定用户对目标节点的操作。
- Znode存储数据大小有限制。通常kb大小为单位,不能存储大数据。
- Znode通过路径引用。绝对路径,必须斜杠字符开头,唯一。
每个Znode由三部分组成:
- stat:状态信息,描述Znode版本、权限等信息
- data:该node关联数据
- children:该node子节点
Znode分为临时节点和永久节点:
- 临时节点:生命周期依赖于会话,会话结束,临时节点将被自动删除,不允许拥有子节点。
- 永久节点:不依赖于会话,客户端执行删除操作时才删除。
- 序列化特性,Znode名字后自动追加一个递增的序列号,记录子节点创建的先后顺序。
四种类型节点:
- PERSISTENT:永久节点
- EPHEMERAL:临时节点
- PERSISTENT_SEQUENTIAL:永久节点、序列化
- EPHEMERAL_SEQUENTIAL:临时节点、序列化
get {节点路径}
查看节点属性:
dataVersion:数据版本号,每次对节点进行set操作,dataVersion值加一,可有效避免数据更新时出现的先后顺序问题
version:子节点版本号。 Znode子节点变化时,cversion值加一,看子节点变化频率。
aclVersion:ACL版本号
cZxid:Znode创建的事务id。事务的序号。
mZxid:Znode被修改的事务id。
ctime:节点创建时的时间戳。
mtime:节点最新一次更新发生的时间戳。
ephemeralOwner:如果该节点是临时节点,该值表示与该节点绑定的session id,如果不是则为0。
客户端和服务器通过session连接,如果发生连接超时、授权失败或显式关闭连接,连接便处于CLOSED状态,此时session结束。