简介
ZooKeeper
是一个典型的分布式数据一致性的解决方案。分布式应用程序可以基于它实现诸如 数据发布/订阅
、负载均衡
、命名服务
、分布式协调/通知
、集群管理
、Master选举
、分布式锁
和分布式队列
等功能。ZooKeeper
可以保证如下分布式一致性特性:
- 顺序一致性:从同一个客户端发起的事务请求,最终将会严格按照其发起顺序被应用到
ZooKeeper
中。 - 原子性:所有事务请求的结果在集群中所有机器上的应用情况是一致的,也就是说要么整个集群都成功应用了某一个事务,要么都没有应用,一定不会出现集群中部分机器应用了该事务,而另外一部分没有应用的情况。
- 单一视图:无论客户端连接的是哪个
ZooKeeper
服务器,其看到的服务端数据模型都是一致的。 - 可靠性:一旦服务端成功地应用了一个事务,并完成对客户端的响应,那么该事务所引起的服务端状态变更将会被一直保留下来,除非有另一个事务又对其进行了变更。
- 实时性:通常人们看到实时性的第一反应是,一旦一个事务被成功应用,那么客户端能够立即从服务端上读取到这个事务变更后的最新数据状态。这里需要注意的是,
ZooKeeper
仅仅保证在一定的时间段内,客户端最终一定能够从服务端上读取到最新的数据状态。
Zookeeper角色
在ZooKeeper
中,有三种角色:
Leader
Follower
Observer
一个ZooKeeper
集群同一时刻只会有一个Leader
,其他都是Follower
或Observer
。
ZooKeeper
配置很简单,每个节点的配置文件(zoo.cfg
)都是一样的,只有myid
文件不一样。myid
的值必须是zoo.cfg
中server.{数值}
的{数值}部分。
zoo.cfg
文件内容示例:
1 | maxClientCnxns=0 |
在装有ZooKeeper
的机器的终端执行 zookeeper-server status
可以看当前节点的ZooKeeper
是什么角色(Leader
or Follower
)。
1 | [root@node-20-103 ~]# zookeeper-server status |
如上,node-20-104是Leader,node-20-103是follower。
ZooKeeper
默认只有Leader
和Follower
两种角色,没有Observer
角色。
为了使用Observer
模式,在任何想变成Observer
的节点的配置文件中加入:peerType=observer
并在所有server
的配置文件中,配置成observer
模式的server
的那行配置追加:observer
,例如:
1 | server.1:localhost:2888:3888:observer |
ZooKeeper
集群的所有机器通过一个Leader选举
过程来选定一台被称为『Leader
』的机器,Leader
服务器为客户端提供读和写服务。Follower
和Observer
都能提供读服务,不能提供写服务。两者唯一的区别在于,Observer
机器不参与Leader
选举过程,也不参与写操作的『过半写成功』策略,因此Observer
可以在不影响写性能的情况下提升集群的读性能。
会话Session
在ZooKeeper中,一个客户端连接是指客户端和ZooKeeper服务器之间的TCP长连接。ZooKeeper对外的服务端口默认是2181,客户端启动时,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测和服务器保持有效的会话,也能够向ZooKeeper服务器发送请求并接受响应,同时还能通过该连接接收来自服务器的Watch事件通知。Session的SessionTimeout值用来设置一个客户端会话的超时时间。当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在SessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。
内容待补充。。。