【Zookeeper】(一)概述与内部原理
Zookeeper概述
1 概述
Zookeeper是一个开源的、分布式的,为分布式应用提供协调服务的Apache项目。
Zookeeper从设计模式的角度来看,是一个基于观察者模式设计的分布式服务管理框架
它负责管理大家都关心的数据,然后接收观察者的注册
一旦数据发生变化,Zookeeper就负责通知那些注册在Zookeeper的观察者做出响应的反应

2 特点

一个领导者(Leader)多个跟随者(Follower)组成的集群
集群中只要有半数以上的节点存活,Zookeeper集群就能正常服务
全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到那个Server,数据都是一致的
更新请求顺序,来自同一个Client的更新请求按照其发送顺序依次执行
数据更新原子性:一次数据更新要么成功要么失败
实时性:在一定时间范围内,Client能读到最新的数据
3 Zookeeper数据结构

Zookeeper数据模型结构与Unix文件系统类似,整体可以看做是一棵树,每个节点称作一个Znode。每一个Znode默认能够存储1Mb的数据,每个Znode都能通过路径进行唯一标识
4 应用场景
- 统一命名服务:对应用、服务进行统一命名
- 统一配置管理:即配置文件的同步和配置管理
- 一般要求一个集群中,所有节点的配置信息是一致的,如Kafka集群
- 对配置文件修改后,希望能够快速同步到各个节点上
- 统一集群管理
- 服务节点动态上下线
- 软负载均衡
Zookeeper内部原理
1 选举机制
- 半数机制:半数以上的机器存活,集群可用,所以Zookeeper适合安装奇数台服务器
- 优先选择自己,不能选出则选节点id最大的那个
2 节点类型
持久:客户端和服务器端断开连接后,创建的节点不删除,持久化节点又分为两类:
持久化目录节点:客户端和服务器端断开连接后,创建的节点不删除
持久化顺序编号目录节点:客户端和服务器端断开连接后,创建的节点不删除,只是Zookeeper对节点名称进行顺序编号
创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护。
在分布式系统中,顺序号可以用于为所有的事件进行全局排序,这样客户端可以根据顺序号来推断事件的顺序
短暂:客户端和服务器端断开连接够,创建的节点自己删除,短暂节点也分为两类:
- 临时目录几点
- 临时顺序编号目录节点

3 Stat结构体
每次修改Zookeeper节点状态都会收到一个zxid形式的时间戳,也就是Zookeeper事务ID。事务ID是Zookeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2则说明1在2前面发生。

- dataLength-znode的数据长度
- numChild-znode子节点数量
4 监听器原理
首先一个
main线程用于创建Zookeeper客户端然后在main线程中创建客户端,客户端会创建两个线程,一个负责网络连接通信(connect),一个负责监听(listener)
通过
connet线程将监听事件发送给Zookeeper,然后在Zookeeper的注册监听列表中会将注册的监听事件添加到列表中监听事件包含客户端的ip、端口号以及监听路径等信息
Zookeeper监听到有数据或者路径发生变化,就会把这个消息发送给客户端的
listener线程,listener线程内部调用process()方法

5 服务器写数据流程
主要是客户端向服务端写数据,怎么保证数据在集群上的同步:
- Client向Zookeeper的Server1上发送写请求
- 如果Server1不是Leader,则会把请求进一步转发给Leader,然后Leader会将请求广播给各个Server,每个Server写成功之后就会通知Leader
- Leader收到半数以上的Follower写成功的通知后,就会告诉最开始接收到写请求的Server1数据写入成功
- Server1会进一步通知Client数据写入成功,这时就认为整个写入操作成功了
【Zookeeper】(一)概述与内部原理的更多相关文章
- JVM 内部原理系列
JVM 内部原理(一)— 概述 JVM 内部原理(二)— 基本概念之字节码 JVM 内部原理(三)— 基本概念之类文件格式 JVM 内部原理(四)— 基本概念之 JVM 结构 JVM 内部原理(五)— ...
- Zookeeper【概述、安装、原理、使用】
目录 第1章 Zookeeper入门 1.1 概述 1.2 特点 1.3 数据结构 1.4应用场景 第2章 Zookeep安装 2.1 下载地址 2.2 本地模式安装 1. 安装前准备 2. 配置修改 ...
- 【Zookeeper】结构、应用、安装部署与参数、客户端命令行操作、API应用、内部原理(选举机制、写数据、监听器)
一.Zookeeper入门 1.概述 分布式服务管理框架(存储和管理数据) Zookeeper=文件系统+通知机制 2.特点 主从集群 半数以上,正常工作 请求顺序执行 数据更新具有原子性 3.数据结 ...
- JVM 内部原理(一)— 概述
JVM 内部原理(一)- 概述 介绍 版本:Java SE 7 图中显示组件将会从两个方面分别解释.第一部分涵盖线程独有的组件,第二部分涵盖独立于线程的组件(即线程共享组件). 目录 线程独享(Thr ...
- 学习Zookeeper之第3章Zookeeper内部原理
第 3 章 Zookeeper 内部原理 3.1 选举机制 3.2 节点类型 3.3 stat 结构体 3.4 监听器原理 1)监听原理详解 2)常见的监听 3.5 写数据流程 第 3 章 Z ...
- ZooKeeper学习笔记(二)——内部原理
zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...
- 深入理解javascript作用域系列第一篇——内部原理
× 目录 [1]编译 [2]执行 [3]查询[4]嵌套[5]异常[6]原理 前面的话 javascript拥有一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量,这套规则被称为作用域.作用域 ...
- Apache Storm内部原理分析
转自:http://shiyanjun.cn/archives/1472.html 本文算是个人对Storm应用和学习的一个总结,由于不太懂Clojure语言,所以无法更多地从源码分析,但是参考了官网 ...
- 批处理引擎MapReduce内部原理
批处理引擎MapReduce内部原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MapReduce作业生命周期 MapReduce作业作为一种分布式应用程序,可直接运行在H ...
- ZooKeeper分布式锁的实现原理
七张图彻底讲清楚ZooKeeper分布式锁的实现原理[石杉的架构笔记] 文章转载自:https://juejin.im/post/5c01532ef265da61362232ed#comment(写的 ...
随机推荐
- CSS 常用样式-盒子实体化三属性
如果想在浏览器中具体看到一个盒子占有的实际位置,需要设置盒子可以实体化的三属性. 实体化属性:
- FCC 高级算法题 收银机找零钱
Exact Change 设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) ...
- Nginx常用经典配置|反向代理、HTTPS重定向、端口转发
二级目录映射 目前前后端项目分离场景多了以后,一般是前端一个端口,后端一个端口. 如前端是https://example.com/index.html,调用的接口是https://example.co ...
- Linux 提示符后面显示全路径
vi /root/.bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' a ...
- Linux调用python文件的同时传参
创建python文件内容如下: 计算两个数相加并打印,需要传递两个参数 vi sum.py import sys def calc(a,b): c=a+b return c a1=int(float( ...
- C#测试web服务是否可用(转)
转摘:http://www.cnblogs.com/xienb/p/3443282.html winform客户端经常需要调用webservice或者WCF进行数据交互,但是远程服务有可能不存在或者服 ...
- Oracle查询优化经验
1.ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. (低效,执行时间156 ...
- (Linux服务器)git添加SSH公钥后本地验证失败
环境:腾讯云Ubuntu x86_64 问题说明: 在配置了公钥后,一直提示我git@github.com: Permission denied (publickey). 解决办法: 先查看root/ ...
- 微信小程序中注册页面设计
.wxml <text>姓名</text> <input placeholder="请输入姓名" bindinput="getname&qu ...
- 详解ResNet 网络,如何让网络变得更“深”了
摘要:残差网络(ResNet)的提出是为了解决深度神经网络的"退化"(优化)问题.ResNet 通过设计残差块结构,调整模型结构,让更深的模型能够有效训练更训练. 本文分享自华为云 ...