博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker环境下分析zookeeper观察者角色
阅读量:5036 次
发布时间:2019-06-12

本文共 6900 字,大约阅读时间需要 23 分钟。

问题引入

zookeeper新引入的角色observer是不参与投票的,通过增加observer节点,可以在提高zk系统读吞吐量时,不影响写吞吐量。

那么问题来了

  1. Zookeeper系统节点如果超过半数宕机,就没法正常提高服务,这里的节点是否包含observer节点?

  2. observer节点是否能提供写操作?还是只是充当“数据视图”的角色?

  3. 在跨机房中,如何更好的利用observer这个角色?

为了解决这些问题,我们在docker里搭建一套zookeeper环境(文末附上docker-compose配置文件zk.yml)。该zookeeper包含:1个leader节点,2个follower节点,2个observer节点。如下zk4,zk5为observer节点

➜  docker COMPOSE_PROJECT_NAME=zktest docker-compose -f zk.yml up➜  docker COMPOSE_PROJECT_NAME=zktest docker-compose -f zk.yml psName              Command               State                     Ports                   ------------------------------------------------------------------------------------------zk1    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2881->2181/tcp, 2888/tcp, 3888/tcpzk2    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2882->2181/tcp, 2888/tcp, 3888/tcpzk3    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2883->2181/tcp, 2888/tcp, 3888/tcpzk4    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2884->2181/tcp, 2888/tcp, 3888/tcpzk5    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2885->2181/tcp, 2888/tcp, 3888/tcp

1、Zookeeper系统节点如果超过半数宕机,就没法正常提高服务,这里的节点是否包含observer节点?

测试1:将2个observer节点和1个follower或者leader节点删掉

➜  docker docker rm -f zk3 zk4 zk5zk3zk4zk5➜  docker COMPOSE_PROJECT_NAME=zktest docker-compose -f zk.yml psName              Command               State                     Ports                   ------------------------------------------------------------------------------------------zk1    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2881->2181/tcp, 2888/tcp, 3888/tcpzk2    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2882->2181/tcp, 2888/tcp, 3888/tcp

测试下zookeeper系统是否正常提高服务

➜  docker echo stat | nc localhost 2881Zookeeper version: 3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMTClients:Latency min/avg/max: 0/0/0Received: 2Sent: 1Connections: 1Outstanding: 0Zxid: 0x300000000Mode: leaderNode count: 6

如上zookeeper可以正常提供服务。此时zookeeper系统节点包含:1个leader节点,1个follower节点。

假如zookeeper系统超过半数节点宕机则无法提供服务,这里的节点包括observer,那么一个拥有5个节点的机子,宕机了3个,理论上是没法提供服务的,与上面结果不符。显然假设不成立。

所以,zookeeper系统超过半数节点宕机则无法提供服务,这里的节点不包括observer。

接下来将zk2也删除,zookeeper系统没法正常提供服务。

➜  docker docker rm -f zk2zk2➜  docker echo stat | nc localhost 2881This ZooKeeper instance is not currently serving requests

测试2:将2个leader或者follower节点删除

重启zookeeper系统

➜  docker COMPOSE_PROJECT_NAME=zktest docker-compose -f zk.yml up➜  docker COMPOSE_PROJECT_NAME=zktest docker-compose -f zk.yml psName              Command               State                     Ports                   ------------------------------------------------------------------------------------------zk1    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2881->2181/tcp, 2888/tcp, 3888/tcpzk2    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2882->2181/tcp, 2888/tcp, 3888/tcpzk3    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2883->2181/tcp, 2888/tcp, 3888/tcpzk4    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2884->2181/tcp, 2888/tcp, 3888/tcpzk5    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2885->2181/tcp, 2888/tcp, 3888/tcp

删除2个leader或者follower节点

➜  docker docker rm -f zk1 zk2zk1zk2➜  docker COMPOSE_PROJECT_NAME=zktest docker-compose -f zk.yml psName              Command               State                     Ports                   ------------------------------------------------------------------------------------------zk3    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2883->2181/tcp, 2888/tcp, 3888/tcpzk4    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2884->2181/tcp, 2888/tcp, 3888/tcpzk5    /docker-entrypoint.sh zkSe ...   Up      0.0.0.0:2885->2181/tcp, 2888/tcp, 3888/tcp

测试zookeeper是否正常提供服务

➜  docker echo stat | nc localhost 2883This ZooKeeper instance is not currently serving requests

结果显示,无法正常提供服务。由此进一步验证上面的结论。

结论

zookeeper系统超过半数节点宕机则无法提供服务,这里的节点不包括observer。所以,准确的应该说,zookeeper系统超过半数的follower或者leader节点宕机,则无法提供服务。

  • zookeeper节点间心跳检测时,leader会判断收集到的成功响应节点中,follower节点是否过半,如果不是则断定当前系统已经宕机
  • 用户往zookeeper写数据时,leader将提交请求转发给各个follower节点,并判断是否过半节点成功响应。如果成功响应,则将数据提交写入,observer直接共享提交后的数据结果

2、observer节点是否能提供写操作?还是只是充当“数据视图”的角色?

进入observer节点,创建节点

➜  docker zkCli -server localhost:2885Connecting to localhost:2885Welcome to ZooKeeper!JLine support is enabled[zk: localhost:2885(CONNECTING) 0] lsWATCHER::WatchedEvent state:SyncConnected type:None path:null[zk: localhost:2885(CONNECTED) 1] ls /[zookeeper][zk: localhost:2885(CONNECTED) 2] create /test testCreated /test[zk: localhost:2885(CONNECTED) 3] get /testtestcZxid = 0x500000002ctime = Fri Jun 15 12:04:43 CST 2018mZxid = 0x500000002mtime = Fri Jun 15 12:04:43 CST 2018pZxid = 0x500000002cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 4numChildren = 0[zk: localhost:2885(CONNECTED) 4]

结论

由上可知,observer和其他follower节点一样,支持写操作。也就是用户连接到observer节点后,发起写操作请求时,observer节点会将写请求转发给leader,该过程和follower一样。不同的时,leader将写操作分发到各个节点时,并不会分发给observer,由此来保证在增加observer节点时,不会影响写吞吐量。

3、在跨机房中,如何更好的利用observer这个角色?

假如有两个机房,一个在中国青岛,一个美国纽约。那么在架构部署时,可以将leader/follower节点集中部署在中国青岛或者美国纽约,从而避免应跨机房导致的网络通讯开销。因为所有的follower都会参与投票。另一个机房则动态增加observer节点,来提高系统的读吞吐量。

zookeeper集群系统docker-compose配置文件 zk.yml

version: '2'services:    zk1:        image: zookeeper        restart: always        container_name: zk1        ports:            - "2881:2181"        environment:            ZOO_MY_ID: 1            ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888 server.4=zk4:2888:3888:observer server.5=zk5:2888:3888:observer    zk2:        image: zookeeper        restart: always        container_name: zk2        ports:            - "2882:2181"        environment:            ZOO_MY_ID: 2            ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888 server.4=zk4:2888:3888:observer server.5=zk5:2888:3888:observer    zk3:        image: zookeeper        restart: always        container_name: zk3        ports:            - "2883:2181"        environment:            ZOO_MY_ID: 3            ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888 server.4=zk4:2888:3888:observer server.5=zk5:2888:3888:observer    zk4:        image: zookeeper        restart: always        container_name: zk4        ports:            - "2884:2181"        environment:            ZOO_MY_ID: 4            PEER_TYPE: observer            ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888 server.4=zk4:2888:3888:observer server.5=zk5:2888:3888:observer    zk5:        image: zookeeper        restart: always        container_name: zk5        ports:            - "2885:2181"        environment:            ZOO_MY_ID: 5            PEER_TYPE: observer            ZOO_SERVERS: server.1=zk1:2888:3888 server.2=zk2:2888:3888 server.3=zk3:2888:3888 server.5=zk4:2888:3888:observer server.5=zk5:2888:3888:observer

转载于:https://www.cnblogs.com/yingww/p/9186765.html

你可能感兴趣的文章
服务器nginx安装
查看>>
std::nothrow
查看>>
rest-framework 分页器
查看>>
JQuery(一)安装&选择器 样式篇
查看>>
浏览器的DNS缓存查看和清除
查看>>
浏览器跨域问题
查看>>
HTML5 input控件 placeholder属性
查看>>
使用JAVA如何对图片进行格式检查以及安全检查处理
查看>>
html5实现移动端下拉刷新(原理和代码)
查看>>
iPhone开发中从一个视图跳到另一个视图有三种方法:
查看>>
pytho logging
查看>>
一个Java程序员应该掌握的10项技能
查看>>
c#英文大小写快捷键
查看>>
tpframe免费开源框架又一重大更新
查看>>
一.go语言 struct json相互转换
查看>>
什么是架构设计
查看>>
程序员学习能力提升三要素
查看>>
PHP 微信错误状态返回码说明
查看>>
【4.1】Python中的序列分类
查看>>
ubuntu 移动文件
查看>>