《ZooKeeper分布式过程协同技术详解》第二章 了解ZooKeeper 读书笔记

2.1.2、znode的不同类型

持久节点和临时节点

如果znode为持久节点,那么只有客户端主动删除,否则这个节点会一直存在;

如果znode为临时节点,那么有以下两种情况会被删除:

<1>、当创建该znode的客户端的会话因超时或主动关闭而终止时。

<2>、当某个客户端(不一定是创建者)主动删除该节点时。

因为临时节点在其创建者的会话过期时被删除,所以目前不允许临时节点创建子节点。

有序节点

分为持久有序和临时有序,客户端创建的有序节点会在父节点后面追加一个递增的整数,例如在/tasks下创建一个有序节点,那么这个子节点的名称为tasks-1,如果再创建一个那么名称为task-2,路径分别为/tasks/task-1、/tasks/task-2。


2.1.3 监视与通知

为了能够第一时间收到znode的变动情况,客户端需要向zookeeper注册一个监视点,当znode有变动的时候,zookeeper会向客户端发送一条变动通知。

客户端可以设置多种监视点,如监控znode的数据变化、监控znode子节点的变化、监控znode的创建或删除。


2.2 ZooKeeper架构



zookeeper有两种模式:独立模式和仲裁模式

独立模式有一个单独的服务器,zookeeper状态无法复制,而仲裁模式由多个服务器组成。


2.2.1 zookeeper仲裁

zookeeper仲裁模式下有多台服务器,采用主从架构,主服务器用来响应客户端请求,然后数据会复制到从服务中,为了保证系统的稳定和正常工作,采用了多数方案,即只有在超过一半服务器返回数据复制成功的响应才能确定操作成功了。例如客户端请求创建/Z,zookeeper总共有5台服务器,只有当有3台服务器返回成功创建的响应后才能确定/Z这个节点创建成功,否则失败!


2.2.2 会话

在对zookeeper集合执行任何请求前,一个客户端首先要先与服务建立会话。对于zookeeper的运行也非常关键。客户端提交给zookeeper的所有操作均关联在一个会话上,当一个会话因某种原因而中止时,在这个会话期间创建的临时节点将会消失。


2.3 开始使用zookeeper

安装和启动可以参考我的另外一篇文章,这里不再赘述点击打开链接。补充一个,启动的时候采用

zkServer.sh start-foreground可以将日志显示当前台窗口。

创建会话

通过zkCli.sh来连接zookeeper,创建会话



2.3.2 会话的状态和声明周期


一个会话从NOT_CONNECTED状态开始,当ZooKeeper客户端初始化后转换到CONNECTING状态(箭头1)。正常情况下,成功与ZooKeeper服务器建立连接后,会话转换到CONNECTED状态(箭头2)。当客户端与ZooKeeper服务器断开连接或者无法收到服务器的响应时,它就会转换会CONNECTING状态(箭头3)并尝试发现其他ZooKeeper服务器。如果可以发现另外一个服务器或重连到原来的服务器,当服务器确认会话有效后,状态又会转换会CONNECTED状态。否则,它将会声明会话过期,然后转换到CLOSED状态(箭头4)。应用也可以显示地关闭会话(箭头4和5)。

创建一个会话时,你需要设置会话超时这个重要的参数,这个参数设置了ZooKeeper服务允许会话被声明为超时之前存在的时间。如果经过指定的时间t之后服务接收不到会话的任何消息,服务就会声明会话过期。而在客户端测,如果经过t/3的时间未收到任何消息,客户端会想服务器发送心跳消息,在经过2t/3时间后,ZooKeeper客户端开始寻找其他的服务器,而此时它还是t/3时间去寻找。

解释:

网络分区:即因网络因素将系统分隔为多个单独的部分,各个部分都无法进行通信,无法知道各部分服务器的状态(崩溃、阻塞、正在尝试连接等)


2.3.3 zookeeper仲裁模式

配置文件zoo.cfg中

server.1=127.0.0.1:2222:2223
server.2=127.0.0.1:3333:3334

server.3=127.0.0.1:4444:4445

每一个server.n项指定了编号为n的ZooKeeper服务器使用的地址和端口号,每个server.n项通过冒号分隔为三部分,第一部分为服务器n的ip地址或主机名(hostname),第二部分和第三部分为TCP端口号,分别用于服务器之间通信和leader选举。我们可以在同一个服务器上启动三个服务进程,也可以在三台服务器上各自启动一个服务进程。如果是前者,那么每一项中需要使用不同的端口号,同时采用三个配置文件,启动的时候通过指定配置文件来操作:

./zkServer.sh start ../conf/z1.cfg

./zkServer.sh start ../conf/z2.cfg

./zkServer.sh start ../conf/z3.cfg

如果是后者,可以使用相同的端口号。

启动服务器的时候也要达到法定数量(超过一半)才能让zookeeper集群正真运行起来,例如总共有3台服务器,如果只启动了一台集群还无法启动并提供正常服务,需要再启动一台。


然后可以通过./zkCli.sh -server 192.168.253.129:2181,192.168.253.130:2181,192.168.253.131:2181来连接到集群,客户端会以随机顺序连接到连接串中的服务器。这样可以用ZooKeeper来实现一个简单的负载均衡。不过,客户端无法指定优先选择的服务器来进行连接。

2.3.4 ZooKeeper中的锁

ZooKeeper通过创建一个节点来实现锁,比如3个线程A、B、C创建一个节点/mynode,如果A创建成功了,那么在B、C去创建的时候发现/mynode节点已经存在,那么就无法拿到锁,此时B和C只能监听这个节点,等到它删除的时候再次去尝试创建该节点。但是如果A线程因为各种各样的原因无法释放得到的锁,导致系统陷入死锁状态,因此我们应该采用临时节点来实现锁机制,这样即使A无法释放锁,一段时间后临时节点也会自动删除,从而锁得到释放。




猜你喜欢

转载自blog.csdn.net/weixin_39935887/article/details/80703317