zookeeper底层细节

 zk

临时节点和watch机制实现注册中心自动注册和发现,数据都在内存,nio  多线程模型;

    cp注重一致性,数据不一致时集群不可用

事务请求处理方式

1.all事务由唯一服务器处理

2.将客户端事务请求转成proposal分发follower

3.等待半数ack,再commit

对事务性支持依赖

    zoo_create_op_int  /   zoo_delete_op_init  / zoo_set_op_init /zoo_check_op_init

每个函数在客户端初始化operation,准备好事务all操作后,zoo_multi提交所有操作,一个失败返回第一个失败操作的状态信号,版本号同一原子性操作

zab

支持崩溃恢复的原子广播协议,

 领导选举:leader(写)维护follower列表

 数据同步:所有节点数据要和leader保持一致,高可用分区容错,follower本地事务日志

 请求广播:leader收到写请求,两阶段提交(事务proposal形式)广播写请求,一半ack=成功

模式:崩溃恢复 消息广播
消息广播

所有请求由leader转成proposal分发给其他服务follower

过半follower反馈信息,leader广播commit,将之前的proposal提交

崩溃恢复

被leader提交的proposal最终被follower服务提交

  •    新选举的leader节点含最大的zxid

丢弃被leader提出但未被提交的proposal

  •    被选举出来的leader不能有未提交的proposal

leader网络中断 崩溃退出 重启 ,选新leader后过半机器该leader完成同步 进入广播模式

   新加入的机器 先恢复模式然后同步完广播

保证消息有序

1.先分配全局递增id(zxid)  每个follower分配单独FIFO队列(异步解耦) 发送proposal广播 

2.follower接到写本地事务,返回ack

  leader收半数以上follower的ack响应消息,广播commit消息 自身完成事务提交

3.follower接收到commit消息 将上一条事务提交

数据同步

    完成leader选举,leader先确认事务日志所有proposal已被集群过半服务器commit

    确保follower能接收每条事务的proposal,能将提交的事务应用到内存,完成后才加入到真正的follower列表

丢失的proposal

zxid 64位

   低32位单增计数器针对每一个请求

    高32位leader周期的epoch编号:当前集群所处年代/周期 leader变更+1

  新的leader中取本地事务日志最大编号的proposal的zxid解析epoch编号+1,低32归零

节点状态

following   /   leading   /   election looking选举状态正在找leader   /   observing只读节点

投票再同一轮,logicalClock标识标记轮数 开始前先清空上一轮投票情况

watch

znode设置,一次性触发器;3.6可递归触发多次

角色:客户端线程/客户端的watchManager/zk服务器

   客户端向zk服务器注册watcher监听,监听信息存储到客户端watchManager中

   zk节点变化通知客户端,客户端调用相应watcher到回调

   串行同步顺序性(w放队列中)

选举

zxid  myid 投票pick,大的优先

观察者机制observer节点

动态扩展zk集群,不降低写性能

不参与投票,只获取投票结果,可处理读写请求,写转leader

负责接收leader同步过来的提交数据 

数据一致性模型

cap 强一致,更新操作完 多个后续进程访问返回最新的更新过的值

弱一致:系统数据写入后 不一定立即读取最新写入数据 

最终一致性:所有数据副本 经过一段时间的同步后 最终能够达到一致的状态

   因果一致性:因果关系的操作顺序得到保证

   会话一致性:对系统数据的访问过程框定在一个会话中

paxos强一致

 角色:

proposer提议者:发出的提案被多数acceptor接受,该提案value被选定

acceptor接受者:只要acceptor接受了某个提案,acceptor该提案的value被选定

learners记录员:acceptor告诉learner哪个value被选定,learner认为哪个value被选定

阶段:

 proposer收到client请求或发现本地有未提交的值,选择提案编号n,发送prepare请求

 acceptor收到编号n的prepare请求,如已有提交的value对比编号,大于n则拒绝回应 否返v和号

  无提交记录,判断是否有编号n1,n1>n 拒绝响应,否则n1改为n,响应prepare

proposer收到多数acceptor发出n的响应,[n,v]提案的accept请求给半数以上的acceptor

acceptor收到accept请求,对比本地的编号 =< n 接受该值 提交记录value 否则拒绝请求

proposer收到大多数acceptor,选定value 同步给leader

活锁:accept一直被拒绝,加n,另一个proposer也这么操作,accept一致失败

multi-paxos:确定多个值,接收accept请求后,一定时间内不再accept其他节点的请求,保证后续编号不需要prepre

raft算法:分布式一致性

leader负责replicated log管理,负责客户端更新请求,复制到follower

状态: leader/follower/candidate选举产生新的leader

选举:

初始化,all都是follower 随机超时 变成candidate 发起选举

   f在election timeout内没有收到l心跳 发起选举

term:任期,每个节点维持着,递增 存储在log的entry中

   每次rpc通信传递该任期号,大于本地切换为follower,小于报错

通信:requestVote RPC 负责选举(lastindex lastTerm)

    appendEntries RPC负责数据交互

日志序列:每个节点维持着持久化log,一致性协议算法 每个节点log一致 顺序存放

选举:增加term切换到candidate  最多投一票 多数则leader发送心跳 

数据模型

持久节点: 一致存储zk上

临时节点:会话超时/异常 删除

有序节点:单调递增的数字作为后缀追加

节点内容

二进制数组byte data: 存储节点的数据  ACL访问控制  子节点数据  自身信息的stat

stat+节点路径:状态信息

czxid创建节点的事务id  ctime创建时间  mzxid最后一次被更新的事务id    mtime最后更新时间

version版本号  pzxid子节点最后一次被修改的事务id    cversion子节点版本  averson:acl版本号

ephemeralOwner创建节点的sessionId 持久节点 值为0

dataLenght数据内容长度    numChildren子节点个数

命名服务

   指定名字获取资源或服务地址,zk创建全局唯一的路径,路径可作为名字

   机器 服务地址 远程对象 据特定名字获取资源的实体 服务地址 提供者信息

配置管理

  配置信息保存到znode,改变时watcher通知

集群管理

   监控和控制,机器挂了 对应临时目录删除 被感知

应用场景

发布/订阅:配置中心  

负载均衡:提供服务者列表

命名服务:服务名到服务地址映射

分布式协调/通知:watch机制和临时节点,任务进度 

集群管理:临时节点 加入 退出

分布式锁

分布式队列:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/281061.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

异常 --java学习笔记

异常 异常就是代表程序出现的问题 当一个方法出现问题&#xff0c;这个方法内部就会把这个问题的信息封装成一个异常对象&#xff0c;然后把这个异常对象抛给jvm虚拟机&#xff0c;jvm收到之后会先把出问题的程序先停下来&#xff0c;然后再把这个异常对象打印出来&#xff0c…

python之jsonpath的使用

文章目录 介绍安装语法语法规则举例说明 在 python 中使用获取所有结构所有子节点的作者获取所有子孙节点获取所有价格取出第三本书的所有信息取出价格大于70块的所有书本从mongodb 中取数据的示例 介绍 JSONPath能在复杂的JSON数据中 查找和提取所需的信息&#xff0c;它是一…

JavaMySQL高级一(下)

目录 1.常用函数 1.字符串函数 2.时间日期函数 3.聚合函数 4.数学函数 2.分布查询 3.子查询基础 1.简单子查询 1.常用函数 在程序开发过程中&#xff0c;除了简单的数据查询&#xff0c;还有基于已数据进行数据的统计分析计算等需求。因此&#xff0c;在SQL中将一…

电感回路中的电阻突然变大会怎样

大家好&#xff0c;我是砖一。 我们经常会看到这样一个电路&#xff0c;电感和电阻搭配在一块&#xff0c;加上5v供电&#xff0c;如果电感回路中的电阻突然变大会怎样&#xff1f; 假设电感L1100uH&#xff0c;电阻R110Ω。 图1 串入电感图 1&#xff0c;由开关状态分析电路…

【C语言】基本语法知识C语言函数操作符详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;C语言_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.基本语法 1.1 代码解释 1.1.1 main()主函数 1.1.2 int 1.1.3 { } 1.1.4 printf()库函数 1.1.5 stdio.h头文件 1.2 C语言的…

#LT8713SX适用于Type-C/DP1.4转三路Type-C/DP1.4/HDMI2.0应用方案,分辨率高达4K60HZ,支持SST/MST功能。

1. 描述 LT8713SX是一款高性能Type-C/DP1.4转Type-C/DP1.4/HD-DVI2.0转换器&#xff0c;具有三个可配置的DP1.4/HD-DVI2.0/DP输出接口和音频输出接口。LT8713SX 支持 DisplayPort™ 单流传输 &#xff08;SST&#xff09; 模式和多流传输 &#xff08;MST&#xff09; 模式。当…

韵达国际邀您参观2024杭州快递物流供应链与技术装备展览会

2024年7月8-10日 | 杭州国际博览中心 同期举办&#xff1a;数字物流技术展 新能源商用车及物流车展 电商物流包装展 冷链物流展 展会介绍 2024长三角快递物流供应链与技术装备展览会&#xff08;杭州&#xff09;&#xff0c;于2024年7月8-10日在杭州国际博览中心召开&#…

LeetCode每日一题【206. 反转链表】

思路&#xff1a;双指针&#xff0c;一前一后&#xff0c;逐个把指向后面的指针指向前面。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), ne…

Unity Mesh简化为Cube mesh

Mesh简化为Cube mesh &#x1f373;食用&#x1f959;子物体独立生成CubeMesh&#x1f96a;合并成一个CubeMesh&#x1f32d;Demo &#x1f373;食用 下载并导入插件&#x1f448;即可在代码中调用。 &#x1f959;子物体独立生成CubeMesh gameObject.ToCubeMesh_Invidual()…

109 项目整合 spring-quartz 启动自动执行定时任务

前言 项目中使用了 quartz 来支持定时任务的相关基础支撑, 但是 最近添加了一个 资源消耗比较高的定时任务, 发布到测试环境之后, 发现服务突然 起不起来了[资源比较有限] 然后 查看了一下日志, 这个定时任务怎么在执行?, 不是 配置的是 凌晨两点么, 然后 仔细一看 几乎配置…

jscpd检测代码的重复率

官方文档&#xff1a;jscpd jscpd 是一个开源的代码重复检测工具&#xff0c;它用于查找代码中的重复部分并生成相应的报告 1、比较两个目录之间的差异 yarn jscpd --skipLocal sre/test1/** sre/test2 --reporters html生成报告文档在 ./report/html 下面&#xff0c;可以打开…

linux下用docker安装mysql及导入文件

目录 1. 非root用户设置docker权限2. user账号安装mysql2. root账号打开防火墙3. 启动mysql容器3.1 在指定工作目录下建立文件夹3.2 配置文件3.3 开启mysql容器 4. 进入容器4.1 通过容器进入mysql4.1 设置账号4.2 建立数据库4.3 导入文件 5. windows连接数据库参考文件 1. 非ro…

水泥领域智慧工厂物联网解决方案

水泥领域智慧工厂物联网解决方案 在水泥生产行业中&#xff0c;构建智慧工厂物联网解决方案已经成为推动产业升级、实现智能制造的关键路径。该方案深度融合了先进的信息技术与传统的水泥生产工艺&#xff0c;通过全面感知、可靠传输、智能处理等环节&#xff0c;实现了对整个…

MySql实战--深入浅出索引(上)

提到数据库索引&#xff0c;我想你并不陌生&#xff0c;在日常工作中会经常接触到。比如某一个SQL查询比较慢&#xff0c;分析完原因之后&#xff0c;你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引&#xff0c;索引又是如何工作的呢&#xff1f;今天就…

oracle设置主键自增步骤

设置主键自增步骤&#xff1a; 每一张表都要设置序列&#xff0c;然后设置触发器。比mysql繁琐。 一、设置序列 选中表后&#xff0c;—》 文件—》新建—》其他—》序列. 设置如下四个值即可。 crtls保存。 给序列起个名字&#xff0c;一定要全大写字母。 二、设置触发器…

如何设置IDEA远程连接服务器开发环境并结合cpolar实现ssh远程开发

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境&#xff0c;并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

Pudgy Penguins交易量一路攀升 多次创下历史新高

日前&#xff0c;一个名为胖企鹅&#xff08;Pudgy Penguins&#xff09; NFT 项目交易量持续攀升&#xff0c;一度在3月9日成为NFT市场的“销冠”。事实上&#xff0c;从2023年下半年开始&#xff0c;Pudgy Penguins的地板价就在不断上升&#xff0c;进入2024年更是多次创下历…

算法打卡day11

今日任务&#xff1a; 1&#xff09;239. 滑动窗口最大值 2&#xff09;347.前 K 个高频元素 239. 滑动窗口最大值 题目链接&#xff1a;239. 滑动窗口最大值 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移…

TouchGFX之性能测量

TouchGFX Core开放了几个信号&#xff0c;可用于测量性能。 当这些信号在内部触发时&#xff0c;用户可在应用程序中同步触发单个GPIO&#xff0c;从而实现“渲染时间”和其他有用信号的可视化。 信号在GPIO.hpp中定义 /* 用于操作GPIO的接口类&#xff0c;以便在目标硬件上进…

发布 AUR 软件包 (ArchLinux)

首发日期 2024-03-09, 以下为原文内容: 理论上来说, 我们应该平等的对待每一个 GNU/Linux 发行版本. 但是, 因为窝日常使用 ArchLinux, 所以对 ArchLinux 有一些特别的优待, 比如自己做的软件优先为 ArchLinux 打包发布. 本文以软件包 librush-bin 为例, 介绍发布 AUR 软件包的…