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机制和临时节点,任务进度 

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

分布式锁

分布式队列:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Jenkins + Argo 实现多集群的持续交付

作者&#xff1a;周靖峰&#xff0c;青云科技容器顾问&#xff0c;云原生爱好者&#xff0c;目前专注于 DevOps&#xff0c;云原生领域技术涉及 Kubernetes、KubeSphere、Argo。 前文概述 前面我们已经掌握了如何通过 Jenkins Argo CD 的方式实现单集群的持续交付&#xff0c…

Maven,pom.xml,查找 子jar包

在IDEA打开pom.xml&#xff0c;会看到这里&#xff1a; 然后如果有需要&#xff0c;把相关的 子jar包 去掉 <dependency><groupId>XXX</groupId><artifactId>XXX</artifactId><exclusions><exclusion><artifactId>xxx</a…

Node.js核心命令与工具:提升开发效率的实用指南

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

HarmonyOS NEXT应用开发之Web组件预览PDF文件实现案例

介绍 本案例通过Web组件实现预览本地PDF文件和预览网络PDF文件&#xff0c;代码为Tabs容器组件包含了两个独立的TabContent子组件&#xff0c;分别标示为预览本地PDF文件和预览网络PDF文件。每个子组件内部构建一个Web组件。第一个Web组件利用resource协议关联本地PDF文件路径…

Docker系列

目录 练习&#xff1a;去DockerHub搜索并拉取一个Redis镜像 练习&#xff1a;去DockerHub搜索并拉取一个Redis镜像 目标&#xff1a; 1&#xff09;去DockerHub搜索Redis镜像 2&#xff09;查看Redis镜像的名称和版本 3&#xff09;利用docker pull命令拉取镜像 查看是否…

计算机网络简答题:复试+期末

文章目录 1.计算机网络的功能:2.计算机网络的分类:3.主机间的通信方式:4.电报交换、报文交换、分组交换的区别:5.计算机网络的性能指标:6.0SI模型和TCP/IP模型:7.通信信通的方式:8.端到端的通信与点到点通信的区别:9.同步通信和异步通信:10.频分复用、时分复用、波分复用和码分…

【Qt】常用控件

目录 一、控件概述 二、QWidget 三、Buttons类控件 3.1 QPushButton 3.2 QRadioButton 3.3 QCheckBox 3.4 QToolButton 四、Display Widgets&#xff08;显示类控件&#xff09; 4.1 QLabel 4.2 QLCDNumber 4.3 QProgressBar 4.4 QCalendarWidget 五、Input Widge…

深度学习 | 神经网络

一、神经网络原理 1、神经元模型 虽然叫个神经元&#xff0c;但骨子里还是线性模型。 2、神经网络结构 顾名思义就是由很多个神经元结点前后相连组成的一个网络。虽然长相上是个网络&#xff0c;但是本质上是多个线性模型的模块化组合。 在早期也被称为 多层感知机 Multi-Layer…

【java】java环境变量分类

测试代码&#xff1a; public class TestSys {public static void main(String[] args) {/*** 获取所有的系统环境变量*/Map<String, String> map System.getenv();map.forEach((key, value) -> System.out.printf("env&#xff1a;key:%s->value:%s%n"…

AQS源码分析

前言 AbstractQueuedSynchronizer是抽象同步队列&#xff0c;其是实现同步机器的基础组件&#xff0c;并发包中的锁的底层就是使用AQS实现的。AQS中 维护了一个volatile int state&#xff08;代表共享资源&#xff09;和一个FIFO线程等待队列&#xff08;多线程争用资源被阻塞…

监控系统prometheus+grafana+发送告警信息

1、基础环境准备两台或更多的主机 2、关闭selinux vi /etc/selinux/config&#xff0c;修改SELINUX的值为disabled 3、关闭防火墙 systemctl disable firewalld systemctl stop firewalld 4、prometheus官网下载 https://prometheus.io/download/ 5、grafana官网下载 https…

Linux-shell中变量的引用($变量名,${变量名})

1. 背景 最近写脚本时&#xff0c;发现有个变量在某个地方生效&#xff0c;某个地方又不生效&#xff0c;引用方式为 $变量名。 2. 方法 其实 shell 脚本中对变量的引用有两种方式&#xff1a; $变量名${变量名} 用下面的脚步&#xff0c;去测试效果&#xff1a; a100 b2…

专题三 - 二分 - leetcode 704. 二分查找 | 简单难度

leetcode 704. 二分查找 leetcode 704. 二分查找 | 简单难度1. 题目详情1. 原题链接2. 基础框架 2. 解题思路1. 题目分析2. 算法原理3. 时间复杂度 3. 代码实现4. 知识与收获 leetcode 704. 二分查找 | 简单难度 1. 题目详情 给定一个 n 个元素有序的&#xff08;升序&#x…

让扣你代码的人电脑关机-js反爬

文案 让扣你代码的人电脑关机&#xff0c;赶紧学起来。众所周知。浏览器中无法导入模块&#xff0c;会报错。nodejs中可以导入模块。那么我们可以在导入语句后加入整蛊代码。在捕获异常后执行正常的代码。那么代码在浏览器中就会正常执行&#xff0c;而当你在本地环境中执行的…

Pytorch CUDA Reflect Padding 算子实现详解

CUDA 简介 CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA开发的一种并行计算平台和应用编程接口&#xff08;API&#xff09;&#xff0c;允许软件开发者和软件工程师使用NVIDIA的图形处理单元&#xff08;GPU&#xff09;进行通用计算。自2007…

网页无插件视频播放器,支持录像、截图、音视频播放,多路播放等,提供源码下载

前言 本播放器内部采用jessibuca插件接口&#xff0c;支持录像、截图、音视频播放等功能。播放器播放基于ws流&#xff0c;分屏操作支持1分屏、4分屏、6分屏、9分屏方式。 jessibuca工作原理是通过Emscripten将音视频解码库编译成Js&#xff08;WebAssembly&#xff0c;简称was…

STC89C52RC单片机烧录时遇到的问题

(1)我之前安装了虚拟串口&#xff0c;跟物理串口冲突了&#xff0c;导致烧录失败。 把虚拟串口删除即可。 &#xff08;2&#xff09;我使用的是STC89C52RC单片机&#xff0c;而不是STC89C52单片机。 所以红色位置之前填错了。 (3)单片机冷启动是什么&#xff0c;难怪程序烧录…

多种排序讲解

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习多种排序&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 冒泡排序选择排序插入排序希尔排序堆排序快速排序提醒 冒泡排序 冒泡排序就是遍历数…

vscode用SSH远程开发c语言

vscode配置远程 这里我使用虚拟机进行展示&#xff0c;首先需要你的虚拟机安装好ssh 没安装好就执行下面的命令安装并开启服务 sudo apt-get install ssh sudo service ssh start ps -e | grep sshvscode安装 remote-ssh扩展 点击左下角的远程连接&#xff0c;我这里已经连接…

51单片机学习笔记8 中断系统及定时器

51单片机学习笔记8 中断系统及定时器 一、中断的概念二、51单片机的中断1. 51单片机的中断源2. 中断的优先级3. 中断结构4. 外部中断解读5. 定时器中断6. 串口中断 三、中断相关寄存器1. IE 中断允许寄存器2. TCON 中断请求标志3. IP 中断优先级 四、中断号五、代码实现按键 &a…