docker环境下分析zookeeper观察者角色
问题引入
zookeeper新引入的角色observer是不参与投票的,通过增加observer节点,可以在提高zk系统读吞吐量时,不影响写吞吐量。
那么问题来了
Zookeeper系统节点如果超过半数宕机,就没法正常提高服务,这里的节点是否包含observer节点?
observer节点是否能提供写操作?还是只是充当“数据视图”的角色?
在跨机房中,如何更好的利用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 ps
Name Command State Ports
------------------------------------------------------------------------------------------
zk1 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2881->2181/tcp, 2888/tcp, 3888/tcp
zk2 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2882->2181/tcp, 2888/tcp, 3888/tcp
zk3 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2883->2181/tcp, 2888/tcp, 3888/tcp
zk4 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2884->2181/tcp, 2888/tcp, 3888/tcp
zk5 /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 zk5
zk3
zk4
zk5
➜ docker COMPOSE_PROJECT_NAME=zktest docker-compose -f zk.yml ps
Name Command State Ports
------------------------------------------------------------------------------------------
zk1 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2881->2181/tcp, 2888/tcp, 3888/tcp
zk2 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2882->2181/tcp, 2888/tcp, 3888/tcp
测试下zookeeper系统是否正常提高服务
➜ docker echo stat | nc localhost 2881
Zookeeper version: 3.4.12-e5259e437540f349646870ea94dc2658c4e44b3b, built on 03/27/2018 03:55 GMT
Clients:
Latency min/avg/max: 0/0/0
Received: 2
Sent: 1
Connections: 1
Outstanding: 0
Zxid: 0x300000000
Mode: leader
Node count: 6
如上zookeeper可以正常提供服务。此时zookeeper系统节点包含:1个leader节点,1个follower节点。
假如zookeeper系统超过半数节点宕机则无法提供服务,这里的节点包括observer,那么一个拥有5个节点的机子,宕机了3个,理论上是没法提供服务的,与上面结果不符。显然假设不成立。
所以,zookeeper系统超过半数节点宕机则无法提供服务,这里的节点不包括observer。
接下来将zk2也删除,zookeeper系统没法正常提供服务。
➜ docker docker rm -f zk2
zk2
➜ docker echo stat | nc localhost 2881
This 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 ps
Name Command State Ports
------------------------------------------------------------------------------------------
zk1 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2881->2181/tcp, 2888/tcp, 3888/tcp
zk2 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2882->2181/tcp, 2888/tcp, 3888/tcp
zk3 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2883->2181/tcp, 2888/tcp, 3888/tcp
zk4 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2884->2181/tcp, 2888/tcp, 3888/tcp
zk5 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2885->2181/tcp, 2888/tcp, 3888/tcp
删除2个leader或者follower节点
➜ docker docker rm -f zk1 zk2
zk1
zk2
➜ docker COMPOSE_PROJECT_NAME=zktest docker-compose -f zk.yml ps
Name Command State Ports
------------------------------------------------------------------------------------------
zk3 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2883->2181/tcp, 2888/tcp, 3888/tcp
zk4 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2884->2181/tcp, 2888/tcp, 3888/tcp
zk5 /docker-entrypoint.sh zkSe ... Up 0.0.0.0:2885->2181/tcp, 2888/tcp, 3888/tcp
测试zookeeper是否正常提供服务
➜ docker echo stat | nc localhost 2883
This 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:2885
Connecting to localhost:2885
Welcome to ZooKeeper!
JLine support is enabled
[zk: localhost:2885(CONNECTING) 0] ls
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2885(CONNECTED) 1] ls /
[zookeeper]
[zk: localhost:2885(CONNECTED) 2] create /test test
Created /test
[zk: localhost:2885(CONNECTED) 3] get /test
test
cZxid = 0x500000002
ctime = Fri Jun 15 12:04:43 CST 2018
mZxid = 0x500000002
mtime = Fri Jun 15 12:04:43 CST 2018
pZxid = 0x500000002
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 4
numChildren = 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
docker环境下分析zookeeper观察者角色的更多相关文章
- docker环境下solrcloud+zookeeper集群部署教程
前言:两个月前的16年11月份完成的配置,使用的solr6.1和zookeeper3.4,刚刚写成blog,目前版本可能有小版本的变化. 本例完成结果为:在docker环境下部署solrcloud集群 ...
- 如何在 Docker 环境下自动给 .NET 程序生成 Dump
前言 之前"一线码农"大佬有写文章介绍了如何在 windows 下自动 dump,正好手里有个在 docker 环境下 dump 的需求,所以在参考大佬文章的基础上,有了本篇. ...
- Docker环境下运行python+selenium+chrome
Docker环境下运行python+selenium+chrome docker运行时占用的资源非常少,而且能将环境进行有效的隔离,可以快速的进行部署,因此可以将docker与selenium结合实现 ...
- Docker环境下的Mysql8 实现主从数据库数据同步方案
本文记录下通过MySQL Replication在Docker环境下,通过多个容器 实现数据库主从配置. MySQL Replication就不多解释了,简单说就是MySQL非常出色的一个功能,该功能 ...
- docker环境下solr6.0配置(中文分词+拼音)
前言:这篇文章是基于之前的“linux环境下配置solr5.3详细步骤”(http://www.cnblogs.com/zhangyuan0532/p/4826740.html)进行扩展的.本篇的步骤 ...
- Mac+Docker环境下xdebug的配置
由于容器化的需要,前几天我本地也换成了docker环境.就研究了一下docker环境下phpstorm和xdebug的配置. http://www.mmfei.com/?p=453 这个博客给出了一个 ...
- Elasticsearch Docker环境下安装
Elasticsearch Docker环境下安装 Daemon镜像配置的是https://registry.docker-cn.com Linux:vi /etc/docker/daemon.jso ...
- docker环境下mysql参数修改
原文:docker环境下mysql参数修改 需要修改log_bin为on,看了好几个博客说都需要删掉容器重新生成,然而并非如此, 我们可以用docker cp 命令将docker的文件"下载 ...
- Docker环境下Java应用的最大内存和堆内存的设置
Docker环境下Java应用的最大内存和堆内存的设置 1. 设置应用允许使用的最大内存 通过docker run(创建一个新的容器并运行)命令中设置-m来进行设置.案例如下所示. docker r ...
随机推荐
- HTTP与HTTPS区别(详细)
转:http://blog.sina.com.cn/s/blog_6eb3177a0102x66r.html 1.减少http请求(合并文件.合并图片)2.优化图片文件,减小其尺寸,特别是缩略图,一定 ...
- C#之扩展方法 default(T)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- #381 Div2 Problem C Alyona and mex (思维 && 构造)
题意 : 题目的要求是构造出一个长度为 n 的数列, 构造条件是在接下来给出的 m 个子区间中, 要求每一个子区间的mex值最大, 然后在这 m 个子区间产生的mex值中取最小的输出, 并且输出构造出 ...
- 2019.9.23JAVA课堂测试
1.题目 使用递归方式判断某个字串是否是回文( palindrome ) “回文”是指正着读.反着读都一样的句子.比如“我是谁是我”使用递归算法检测回文的算法描述如下:A single or zero ...
- 《Effective Java》读书笔记 - 3.对于所有对象都通用的方法
Chapter 3 Methods Common to All Objects Item 8: Obey the general contract when overriding equals 以下几 ...
- 关于SQL注入的问题以及解决方法
1.关于SQL注入 什么是SQL注入: 由于jdbc程序在执行的过程中sql语句在拼装时使用了由页面传入参数,如果用户恶意传入一些sql中的特殊关键字,会导致sql语句意义发生变化,这种攻击方式就叫做 ...
- 搜索引擎算法研究专题六:HITS算法
搜索引擎算法研究专题六:HITS算法 2017年12月19日 ⁄ 搜索技术 ⁄ 共 1240字 ⁄ 字号 小 中 大 ⁄ 评论关闭 HITS(Hyperlink-Induced Topic Sea ...
- C++中cout输出字符串和字符串型指针地址值的方法以及C语言中的printf用法比较
#include <iostream> using namespace std; #include <stdio.h> int main() { char *pstr = &q ...
- c++ 指针类型转换
1.数据类型转换(static_cast) //数据类型转换printf("%d\n", static_cast<int>(10.2)); 2.指针类型转换(reint ...
- mappers:将sql映射注册到全局配置中
<!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 --> <!-- 6.mappers: ...