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.mzph.cn/news/759869.shtml

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

相关文章

部署单节点k8s并允许master节点调度pod

安装k8s 需要注意的是k8s1.24 已经弃用dockershim&#xff0c;现在使用docker需要cri-docker插件作为垫片&#xff0c;对接k8s的CRI。 硬件环境&#xff1a; 2c2g 主机环境&#xff1a; CentOS Linux release 7.9.2009 (Core) IP地址&#xff1a; 192.168.44.161 一、 主机配…

【spring】@ConditionalOnResource注解学习

ConditionalOnResource 介绍 ConditionalOnResource 是Spring框架中的一个条件化注解&#xff0c;它允许你根据类路径中是否存在指定的资源来决定是否加载特定的Bean定义或配置类。这个注解可以用于类级别或方法级别。 具体Conditional使用请看这篇文章【spring】Conditional…

停车管理系统asp.net+sqlserver

停车管理系统asp.netsqlserver 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库&#xff0c; 功能模块&#xff1a; 停车管理系统asp.net sqlserver 用户功能有菜单列表 我的停车记录 专…

VMWare虚拟机使用openmediavault搭建NAS服务器完整步聚

下载: gopenmediavault - The open network attached storage solution 下载好openmediavault的ISO镜像后,打开虚拟机并安装 系统类型选择Debian 启动虚拟机并安装openmediavault 选择中文 地区选中国 键盘配置选汉语 开始安装 配置网络信息 配置root密码 确认密码 系统安装中…

零基础机器学习(3)之机器学习的一般过程

文章目录 一、机器学习一般过程1.数据获取2.特征提取3.数据预处理①去除唯一属性②缺失值处理A. 均值插补法B. 同类均值插补法 ③重复值处理④异常值⑤数据定量化 4.数据标准化①min-max标准化&#xff08;归一化&#xff09;②z-score标准化&#xff08;规范化&#xff09; 5.…

应用改进SA算法实现MATLAB-HFSS交互仿真与天线优化

应用改进SA算法实现MATLAB-HFSS交互仿真与天线优化 第一章SA算法及其简单应用1.1 SA算法简介1.2 SA算法原理1.2.1 SA算法原理 1.3 Metropolis准则及退火过程中的参数控制1.3.1 Metropolis准则1.3.2退火过程中的参数控制 1.4 SA算法简单应用 第二章 改进SA算法2.1 改进方向2.2 改…

Android Preference简单介绍

Android Preference简单介绍 文章目录 Android Preference简单介绍一、前言二、Preference 简单介绍二、PreferenceScreen和SwitchPreference 简单示例2、相关demo代码示例&#xff08;1&#xff09;SettingsActivity.Java&#xff08;2&#xff09;layout\settings_activity.x…

Qt学习笔记(一)——Qt初识

本文仅是 学习时记录的笔记&#xff0c;供自己复习时使用。 1.创建好文件(QWidget窗口) main.cpp中&#xff1a; 注&#xff1a;Widget类继承父类QWidget. widget.h中&#xff1a; Widget.cpp中&#xff1a; 打开Forms文件夹中的widget.ui文件&#xff1a; 打开左边编辑&am…

【吊打面试官系列】Redis篇 - 为什么 redis 需要把所有数据放到内存中?

大家好&#xff0c;我是锋哥。今天分享关于 为什么 redis 需要把所有数据放到内存中 面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 为了达到最快的读写速度将数据都读到内存中&#xff0c;并通过异步的方式将数 据写入磁盘。所以 redis 具有快速和数据持久化的特征。…

飞腾+FPGA+AI电力行业智能数据采集与分析网闸解决方案

行业痛点: 安全物联网闸在监控平台中的具体作用&#xff1a;35KV变电站是煤矿的动力核心&#xff0c;采矿人员上下井、煤炭提升输送、矿井通风等核心设备均依靠变电站提供电源。监控中心及时掌握变电站的运行状态对煤矿的安全生产非常重要。如若外部通过监控网络来控制变电站会…

Python爬虫入门:HTTP与URL基础解析及简单示例实践

在数字化时代&#xff0c;数据已成为一种宝贵的资源。Python作为一种强大的编程语言&#xff0c;在数据采集和处理方面表现出色。爬虫技术&#xff0c;即网络爬虫&#xff0c;是Python中用于数据采集的重要工具。本文作为Python爬虫基础教程的第一篇&#xff0c;将深入讲解URL和…

流畅的 Python 第二版(GPT 重译)(六)

第三部分&#xff1a;类和协议 第十一章&#xff1a;一个 Python 风格的对象 使库或框架成为 Pythonic 是为了让 Python 程序员尽可能轻松和自然地学会如何执行任务。 Python 和 JavaScript 框架的创造者 Martijn Faassen。 由于 Python 数据模型&#xff0c;您定义的类型可以…

CSS3新属性(学习笔记)

一、. 圆角 border-radius:; 可以取1-4个值&#xff08;规则同margin&#xff09; 可以取px和% 一般用像素&#xff0c;画圆的时候用百分比&#xff1a;border-radius:50%; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&q…

【鸿蒙HarmonyOS开发笔记】通知模块之发布进度条类型通知

概述 进度条通知也是常见的通知类型&#xff0c;主要应用于文件下载、事务处理进度显示。HarmonyOS提供了进度条模板&#xff0c;发布通知应用设置好进度条模板的属性值&#xff0c;如模板名、模板数据&#xff0c;通过通知子系统发送到通知栏显示。 目前系统模板仅支持进度条…

Svg Flow Editor 原生svg流程图编辑器(三)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;三&#xff09; 实现对齐辅助线 在 logicFlow 中&#xff0c;辅助线的实现是通…

【网页实战项目设计】基于SSM的高校二手交易平台 (大学跳蚤市场)(源码+LW文档)

基于SSM的高校二手交易平台 &#xff08;大学跳蚤市场&#xff09; 项目截图 系统功能界面图 用户注册、用户登录界面图 个人中心界面图 商品信息界面图 商品上架管理界面图 订单信息管理界面图 开发环境与技术框架 开发语言&#xff1a;Java 框架&#…

SV-7035VP播放模块通用型播放终端SV-7035VP-SIP 网络通用型播放功放模块

SV-7035VP播放模块通用型播放终端SV-7035VP-SIP 网络通用型播放功放模块 产品介绍 SV-7035VP模块是一款SIP播放模块&#xff0c;具有10/100M以太网接口&#xff0c;其接收网络的音频数据&#xff0c;提供立体声的音频输出。 本SIP播放模块带有一个继电器端子和一个NET接口&a…

RabbitMQ-同步和异步区别快速入门

文章目录 1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门2.1.安装RabbitMQ2.2.RabbitMQ消息模型2.3.入门案例2.3.1.publisher实现 1.1.同步和异步通讯 服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&am…

Simulink如何自动保存模型,解决崩溃问题

文章目录 Simulink如何自动保存模型,解决崩溃问题自动保存模型脚本脚本使用方法专题目录 Simulink如何自动保存模型,解决崩溃问题 自动保存模型脚本 在使用sumilink建模中,暂无自动保存模型的相关设置,使用中常常会遇到软件卡死奔溃现象 当出现如上提示,如果花费了半天建…

在抖音电商迎上新趋势,他们找到春季服饰生意新增量

冬去春来&#xff0c;万物焕新。每年春天换季的时候&#xff0c;都是大家买新衣服的高峰期。 对于服饰商家来说&#xff0c;季节性的平台活动&#xff0c;能够带来较大的消费需求扩容空间&#xff0c;也是推动生意增长的好时机。在3月9日-3月14日举办的「抖音商城服饰焕新周」…