一、服务器角色

1. Leader

1)事务请求的唯一调度者和处理者。保证事务处理的顺序性

  事务请求:导致数据一致性的请求(数据发生改变)。如删除一个节点、创建一个节点、设置节点数据,设置节点权限就是一个事物请求,全局的事物id(zxid)只能由leader来分配

2)集群内部个服务器之间的调度者

2. Follower

1)处理客户端的非事务请求。事务请求必须转发给Leader服务器。

  非事物请求:读取数据
2)参与事务请求Proposal(议案)的投票
3)参与Leader选举

3. Observer

在实际运行中,它只是负责读,Leader不会将事务的投票发送给Observer。
在zk的配置server.1=master:2888:3888后面加:observer以后就是一个Observer
server.1=master:2888:3888:observer

二、序列化与通信协议

1. zookeeper序列化

常见序列化协议:

ProtoBuf
Thrift
Hessian
Kryo
Avro
JDK Serializable
Jsoniter/Jackson

Jute是zookeeper序列化、反序列化协议。

2. zookeeper通信协议

基于TCP/IP协议,所以是一个长连接。zookeeper在这个基础上完成客户端和服务器,服务器和服务器之间的通信。

zookeeper请求包:请求头+请求体

0-3

4-11

12-n

len

4-7

8-11

12-15

16-(n-1)

n

xid

type

len

path

watch

 

zookeeper响应包:响应头+响应体

0-3

4-19

20 - n

len

4-7

8-15

16-19

20-23

len位

48位

8位

xid

zxid

err

len

data

......

pzxid

0-3位:version+dbid+magic(魔数)

三、数据存储

1. 内存数据

Zk有个内存数据库:ZkDataBase、DataTree、DataNode

2. 日志数据FileTxnLog

运行时,不停地有数据写入。
当日志的剩余空间不足4K(4096),日志就做扩充,扩充64M,后面以“0”填充。
log都是使用zxid作为文件名的后缀。

查看日志方式:

cd /software/zookeeper-3.4.6
java -cp ./zookeeper-3.4.6.jar::./lib/log4j-1.2.16.jar:./lib/slf4j-api-1.6.1.jar:./lib/slf4j-log4j12-1.6.1.jar org.apache.zookeeper.server.LogFormatter /zookeeper/zk1/version-2/log.100000001

说明:

1)必须在zookeeper的安装目录下执行

2)/zookeeper/zk1/是zookeeper配置文件里面配置的数据目录(dataDir)

3. 快照数据

快照数据:在某一时刻内存所有全量数据的一个磁盘文件。举例:快照阈值100000,触发快照数据。
快照数据都是使用Zxid作为文件名的后缀。这样的话,获取快照数据的时候就不用遍历了,直接根据Zxid去获取就行了

查看快照命令:

cd /software/zookeeper-3.4.6
java -cp ./zookeeper-3.4.6.jar::./lib/log4j-1.2.16.jar:./lib/slf4j-api-1.6.1.jar:./lib/slf4j-log4j12-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter /zookeeper/zk1/version-2/snapshot.100000050

说明:

1)必须在zookeeper的安装目录下执行

2)/zookeeper/zk1/是zookeeper配置文件里面配置的数据目录(dataDir)

快照触发机制,非“半数机制”,过半随机策略。
logcount > (snapcount/2 + randroll)
logcount: 代表当前记录日志数量
snapcount: 多少次事务日志记录后触发一次数据快照
randroll: 1~snapcount/2 之间的一个随机数

四、zookeeper总结

ZK在分布式系统中的各种应用,本质其实就是对节点的创建,删除,数据更新等事件做监听,监听到以后做对应的操作
ZK是观察者设计模式
都是为了解决高可用,解决单点故障问题,数据可靠性

zookeeper系列代码获取地址

Zookeeper系列六:服务器角色、序列化与通信协议、数据存储、zookeeper总结的更多相关文章

  1. ios 沙盒 NSCoding(相当于JAVA对象序列化) 归档 数据存储

    通过NSCoding能实现像JAVA一样能够实现对象的序列化,可以保存对象到文件里. NSCoding 跟其他存储方式略有不同,他可以存储对象 对象存储的条件是: 对象需要遵守 NSCoding 协议 ...

  2. 大数据之 ZooKeeper原理及其在Hadoop和HBase中的应用

    ZooKeeper是一个开源的分布式协调服务,由雅虎创建,是Google Chubby的开源实现.分布式应用程序可以基于ZooKeeper实现诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知. ...

  3. 【分布式】Zookeeper序列化及通信协议

    一.前言 前面介绍了Zookeeper的系统模型,下面进一步学习Zookeeper的底层序列化机制,Zookeeper的客户端与服务端之间会进行一系列的网络通信来实现数据传输,Zookeeper使用J ...

  4. ZooKeeper系列(6):ZooKeeper的伸缩性和Observer角色

    ZooKeeper系列文章:https://www.cnblogs.com/f-ck-need-u/p/7576137.html#zk 1.ZooKeeper中的角色 在比较老的ZooKeeper版本 ...

  5. zookeeper系列(七)zookeeper的序列化及通讯协议

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败.原创地址http://www.cnblogs.com/leesf456/p/6091208.html尊重作者原创,奇文共欣赏,大家共同学 ...

  6. 【分布式】Zookeeper的服务器角色

    一.前言 前一篇已经详细的讲解了Zookeeper的Leader选举过程,下面接着学习Zookeeper中服务器的各个角色及其细节. 二.服务器角色 2.1 Leader Leader服务器是Zook ...

  7. Zookeeper(六)服务器

    Zookeeper(六)服务器 zkServer.cmd中声明 首先启动QuorumPeerMain set ZOOMAIN=org.apache.zookeeper.server.quorum.Qu ...

  8. zookeeper系列(六)zookeeper的系统模型(数据树)

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败. 出处:http://www.cnblogs.com/leesf456/p/6072597.html尊重作者原创,奇文共欣赏,大家共同学 ...

  9. zookeeper系列(八)zookeeper客户端的底层详解

    作者:leesf    掌控之中,才会成功:掌控之外,注定失败.出处:http://www.cnblogs.com/leesf456/p/6098255.html 尊重原创,共同学习进步:  一.前言 ...

随机推荐

  1. 转载 转载 转载 数组a[],a,&a之间的区别

    通俗理解:内存就是公寓房间,指针就是房间的门牌号,数组就是连续的公寓房间,数组名就是这组连续房间的起始地址,也就是第一个房间的地址. 例如int a[5]   a是数组名,也就是第一个房间号 & ...

  2. C#7.0&6.0新特性 — 完整版

    C#2.0 泛型 部分类型 匿名方法 迭代器 可空类型 Getter / setter单独可访问性 方法组转换(代表) Co- and Contra-variance for delegates 静态 ...

  3. Tips_方格拼图效果

    用原生的javascript实现方格拼图效果 1.新建文件夹 代码如下: 01.html <!DOCTYPE html> <html lang="en"> ...

  4. 11 week blog

    Obtaining the JSON: 1.首先,我们将把要检索的JSON的URL存储在变量中. 2.要创建请求,我们需要使用new关键字从XMLHttpRequest构造函数创建一个新的请求对象实例 ...

  5. GMA Round 1 YGGDRASIL

    传送门 YGGDRASIL 在YGGDRASIL世界,一年有213天. Demiurge推广种植了一种植物,姑且称之为“黄金果”,它第一期生长需要140天,此后第i期生长需要的天数$a_i$满足$a_ ...

  6. JSP(5)—Session的创建以及简单使用

    页面: 1.案例 <body> <!-- 把书的信息以Cookie方式传回给浏览器,删除一个Cookie 1.确定要被删除的Cookie是以ATGUIGU_BOOK_开头的cooki ...

  7. .NET分布式缓存Redis从入门到实战

    一.课程介绍 今天阿笨给大家带来一堂NOSQL的课程,本期的主角是Redis.希望大家学完本次分享课程后对redis有一个基本的了解和认识,并且熟悉和掌握 Redis在.NET中的使用. 本次分享课程 ...

  8. C#多线程技术提高RabbitMQ消费吞吐率

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的第二部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理 ...

  9. python测试开发django-51.Ajax发送post请求登录案例

    前言 我想实现一个登录功能:登录的接口是另外一个地方提供,页面上点登录按钮的时候,先访问登录接口,根据接口返回json信息判断是否登录成功,登录成功页面跳转,登录不成功,在登录首页显示失败原因 登录页 ...

  10. Spring quartz 单机、集群+websocket集群实现文本、图片、声音、文件下载及推送、接收及显示

    相关环境 Nginx,Spring5.x当前(要选择4.0+),tomcat9.x或8.x都可以,Quartz 2.x集群(实际运用是Quartz的集群模式和单机模式共存的) 测试面页:http:// ...