Zookeeper学习2:原理、常用脚本、选举机制、监听器

选举过程情景

  1. 集群中的Leader没挂,维持现状,依然是Leader机器为Leader

  2. 集群中的Leader挂了,Leader选举规则:谁任期Epoch大选谁、任期一致,谁事务ID修改次数大就选谁、事务ID也一致,谁身份证号大就选谁

监听器

流程: zookeeper客户端告知服务端需要监听某某节点的数据变化,服务端一旦节点发生变化,就将变化通知内容推送给客户端

在这里插入图片描述

#mermaid-svg-IGKhFLfE9JKWoYPt {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IGKhFLfE9JKWoYPt .error-icon{fill:#552222;}#mermaid-svg-IGKhFLfE9JKWoYPt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IGKhFLfE9JKWoYPt .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-IGKhFLfE9JKWoYPt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IGKhFLfE9JKWoYPt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IGKhFLfE9JKWoYPt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IGKhFLfE9JKWoYPt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IGKhFLfE9JKWoYPt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IGKhFLfE9JKWoYPt .marker.cross{stroke:#333333;}#mermaid-svg-IGKhFLfE9JKWoYPt svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IGKhFLfE9JKWoYPt .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-IGKhFLfE9JKWoYPt .cluster-label text{fill:#333;}#mermaid-svg-IGKhFLfE9JKWoYPt .cluster-label span{color:#333;}#mermaid-svg-IGKhFLfE9JKWoYPt .label text,#mermaid-svg-IGKhFLfE9JKWoYPt span{fill:#333;color:#333;}#mermaid-svg-IGKhFLfE9JKWoYPt .node rect,#mermaid-svg-IGKhFLfE9JKWoYPt .node circle,#mermaid-svg-IGKhFLfE9JKWoYPt .node ellipse,#mermaid-svg-IGKhFLfE9JKWoYPt .node polygon,#mermaid-svg-IGKhFLfE9JKWoYPt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IGKhFLfE9JKWoYPt .node .label{text-align:center;}#mermaid-svg-IGKhFLfE9JKWoYPt .node.clickable{cursor:pointer;}#mermaid-svg-IGKhFLfE9JKWoYPt .arrowheadPath{fill:#333333;}#mermaid-svg-IGKhFLfE9JKWoYPt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IGKhFLfE9JKWoYPt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IGKhFLfE9JKWoYPt .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-IGKhFLfE9JKWoYPt .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-IGKhFLfE9JKWoYPt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IGKhFLfE9JKWoYPt .cluster text{fill:#333;}#mermaid-svg-IGKhFLfE9JKWoYPt .cluster span{color:#333;}#mermaid-svg-IGKhFLfE9JKWoYPt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IGKhFLfE9JKWoYPt :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

  1. 首先要有一个main线程

  2. 在main线程中创建Zookeeper客户端,这时就会创建两个线 程,一个负责网络连接通信(connet)),一个负责监听(listener)

  3. 通过connectz线程将注册的监听事件发送给Zookeeper服务端

  4. 在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中

  5. Zookeeper服务端监听到有数据或路径变化,就会将这个消息发送给Zookeeper客户端的listener线程

  6. listener线程内部调用了process0方法,处理后续业务逻辑

#mermaid-svg-UY05yE6KHUdx2Qhb {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-UY05yE6KHUdx2Qhb .error-icon{fill:#552222;}#mermaid-svg-UY05yE6KHUdx2Qhb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UY05yE6KHUdx2Qhb .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-UY05yE6KHUdx2Qhb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UY05yE6KHUdx2Qhb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UY05yE6KHUdx2Qhb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UY05yE6KHUdx2Qhb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UY05yE6KHUdx2Qhb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UY05yE6KHUdx2Qhb .marker.cross{stroke:#333333;}#mermaid-svg-UY05yE6KHUdx2Qhb svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UY05yE6KHUdx2Qhb .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-UY05yE6KHUdx2Qhb .cluster-label text{fill:#333;}#mermaid-svg-UY05yE6KHUdx2Qhb .cluster-label span{color:#333;}#mermaid-svg-UY05yE6KHUdx2Qhb .label text,#mermaid-svg-UY05yE6KHUdx2Qhb span{fill:#333;color:#333;}#mermaid-svg-UY05yE6KHUdx2Qhb .node rect,#mermaid-svg-UY05yE6KHUdx2Qhb .node circle,#mermaid-svg-UY05yE6KHUdx2Qhb .node ellipse,#mermaid-svg-UY05yE6KHUdx2Qhb .node polygon,#mermaid-svg-UY05yE6KHUdx2Qhb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UY05yE6KHUdx2Qhb .node .label{text-align:center;}#mermaid-svg-UY05yE6KHUdx2Qhb .node.clickable{cursor:pointer;}#mermaid-svg-UY05yE6KHUdx2Qhb .arrowheadPath{fill:#333333;}#mermaid-svg-UY05yE6KHUdx2Qhb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UY05yE6KHUdx2Qhb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UY05yE6KHUdx2Qhb .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-UY05yE6KHUdx2Qhb .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-UY05yE6KHUdx2Qhb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UY05yE6KHUdx2Qhb .cluster text{fill:#333;}#mermaid-svg-UY05yE6KHUdx2Qhb .cluster span{color:#333;}#mermaid-svg-UY05yE6KHUdx2Qhb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UY05yE6KHUdx2Qhb :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

常见的监听事件

  1. 监听数据的变化 == get 节点 -w

  2. 监听子节点增删的变化 == ls 节点 -w

监听数据的变化
在这里插入图片描述

监听子节点增删的变化
在这里插入图片描述

客户端向服务端写入数据
客户端向服务端Leader节点写入

流程: Leader会传递给Follower去写入,如果 超半数的zookeeper都写入成功,则Leader服务端机器会告诉客户端数据写入成功 ,剩下Follower还未写入的Leader会慢慢通知他们写入,反正最终zookeeper服务端集群内所有机器都写入成功

在这里插入图片描述

客户端向服务端Follower节点写入

流程: Follower会先将 客户端的写入请求转给Leader,Leader自己将写入请求先执行,在将这个写入请求分发给集群内所有Follower机器 ,所有集群中超过半数的zookeeper都写入成功,则Leader会告知当初最开始那台Follower机器说明此次写入成功,然后由该台Follower告知客户端集群此次写入成功

在这里插入图片描述

Paxos算法(每个节点都可以提议者)

Paxos算法: 基于消息传递且具有高度容错特性的一致性算法。快速正确的在一个分布式系统保持数据值一致,保证无论发生任何异常都不会破坏系统的一致性

Propose(提议): 任务编号

Proposal(提案): 任务编号+任务内容

#mermaid-svg-obyDXYd4TIy9KzXk {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-obyDXYd4TIy9KzXk .error-icon{fill:#552222;}#mermaid-svg-obyDXYd4TIy9KzXk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-obyDXYd4TIy9KzXk .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-obyDXYd4TIy9KzXk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-obyDXYd4TIy9KzXk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-obyDXYd4TIy9KzXk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-obyDXYd4TIy9KzXk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-obyDXYd4TIy9KzXk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-obyDXYd4TIy9KzXk .marker.cross{stroke:#333333;}#mermaid-svg-obyDXYd4TIy9KzXk svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-obyDXYd4TIy9KzXk .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-obyDXYd4TIy9KzXk .cluster-label text{fill:#333;}#mermaid-svg-obyDXYd4TIy9KzXk .cluster-label span{color:#333;}#mermaid-svg-obyDXYd4TIy9KzXk .label text,#mermaid-svg-obyDXYd4TIy9KzXk span{fill:#333;color:#333;}#mermaid-svg-obyDXYd4TIy9KzXk .node rect,#mermaid-svg-obyDXYd4TIy9KzXk .node circle,#mermaid-svg-obyDXYd4TIy9KzXk .node ellipse,#mermaid-svg-obyDXYd4TIy9KzXk .node polygon,#mermaid-svg-obyDXYd4TIy9KzXk .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-obyDXYd4TIy9KzXk .node .label{text-align:center;}#mermaid-svg-obyDXYd4TIy9KzXk .node.clickable{cursor:pointer;}#mermaid-svg-obyDXYd4TIy9KzXk .arrowheadPath{fill:#333333;}#mermaid-svg-obyDXYd4TIy9KzXk .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-obyDXYd4TIy9KzXk .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-obyDXYd4TIy9KzXk .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-obyDXYd4TIy9KzXk .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-obyDXYd4TIy9KzXk .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-obyDXYd4TIy9KzXk .cluster text{fill:#333;}#mermaid-svg-obyDXYd4TIy9KzXk .cluster span{color:#333;}#mermaid-svg-obyDXYd4TIy9KzXk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-obyDXYd4TIy9KzXk :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

Paxos角色Zookeeper系统中所有节点节点可以拥有多角色

提议者(proposer)

接受者(acceptor)

学习者(learner)

#mermaid-svg-Qr51NzNiWkA5vOZ9 {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .error-icon{fill:#552222;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .marker.cross{stroke:#333333;}#mermaid-svg-Qr51NzNiWkA5vOZ9 svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .cluster-label text{fill:#333;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .cluster-label span{color:#333;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .label text,#mermaid-svg-Qr51NzNiWkA5vOZ9 span{fill:#333;color:#333;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .node rect,#mermaid-svg-Qr51NzNiWkA5vOZ9 .node circle,#mermaid-svg-Qr51NzNiWkA5vOZ9 .node ellipse,#mermaid-svg-Qr51NzNiWkA5vOZ9 .node polygon,#mermaid-svg-Qr51NzNiWkA5vOZ9 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .node .label{text-align:center;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .node.clickable{cursor:pointer;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .arrowheadPath{fill:#333333;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .cluster text{fill:#333;}#mermaid-svg-Qr51NzNiWkA5vOZ9 .cluster span{color:#333;}#mermaid-svg-Qr51NzNiWkA5vOZ9 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Qr51NzNiWkA5vOZ9 :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

Paxos主要阶段

准备阶段:提议者向接受者发送一个提议编号,接受者如果收到的提议编号比自己已经接受的提议编号大,接受该提议,并返回自己已经接受的提议编号和值

提议阶段:提议者收到了大多数接受者的接受,提议者向所有接受者发送一个提议,包括提议编号和值。

学习阶段:一旦某值被大多数接受者接受,学习者就可以学习到这个值并应用到系统中

#mermaid-svg-wpPHN1YFrSOobcFY {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-wpPHN1YFrSOobcFY .error-icon{fill:#552222;}#mermaid-svg-wpPHN1YFrSOobcFY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wpPHN1YFrSOobcFY .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-wpPHN1YFrSOobcFY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wpPHN1YFrSOobcFY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wpPHN1YFrSOobcFY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wpPHN1YFrSOobcFY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wpPHN1YFrSOobcFY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wpPHN1YFrSOobcFY .marker.cross{stroke:#333333;}#mermaid-svg-wpPHN1YFrSOobcFY svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wpPHN1YFrSOobcFY .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-wpPHN1YFrSOobcFY .cluster-label text{fill:#333;}#mermaid-svg-wpPHN1YFrSOobcFY .cluster-label span{color:#333;}#mermaid-svg-wpPHN1YFrSOobcFY .label text,#mermaid-svg-wpPHN1YFrSOobcFY span{fill:#333;color:#333;}#mermaid-svg-wpPHN1YFrSOobcFY .node rect,#mermaid-svg-wpPHN1YFrSOobcFY .node circle,#mermaid-svg-wpPHN1YFrSOobcFY .node ellipse,#mermaid-svg-wpPHN1YFrSOobcFY .node polygon,#mermaid-svg-wpPHN1YFrSOobcFY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wpPHN1YFrSOobcFY .node .label{text-align:center;}#mermaid-svg-wpPHN1YFrSOobcFY .node.clickable{cursor:pointer;}#mermaid-svg-wpPHN1YFrSOobcFY .arrowheadPath{fill:#333333;}#mermaid-svg-wpPHN1YFrSOobcFY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wpPHN1YFrSOobcFY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wpPHN1YFrSOobcFY .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-wpPHN1YFrSOobcFY .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-wpPHN1YFrSOobcFY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wpPHN1YFrSOobcFY .cluster text{fill:#333;}#mermaid-svg-wpPHN1YFrSOobcFY .cluster span{color:#333;}#mermaid-svg-wpPHN1YFrSOobcFY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wpPHN1YFrSOobcFY :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

接受者收到提案者空白提案请求时的原则

不在接受提案ID小于等于当前收到的

不在接受提案落档中提案ID小于当前的

不违背以前做出的承诺

在这里插入图片描述

Paxos算法完美情况
在这里插入图片描述

Paxos算法弊端
在这里插入图片描述

ZAB协议算法 - Paxos算法的改良 - 集群仅能一位提议者(即Leader)
认识

概念: 只有一台客户端(Leader)负责处理外部的写事务请求,然后Leader客户端将数据同步到其他Follower节点。即Zookeeper只有一个Leader可以发起提案

#mermaid-svg-lBpFvnCpVyIVlq0b {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lBpFvnCpVyIVlq0b .error-icon{fill:#552222;}#mermaid-svg-lBpFvnCpVyIVlq0b .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lBpFvnCpVyIVlq0b .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-lBpFvnCpVyIVlq0b .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lBpFvnCpVyIVlq0b .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lBpFvnCpVyIVlq0b .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lBpFvnCpVyIVlq0b .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lBpFvnCpVyIVlq0b .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lBpFvnCpVyIVlq0b .marker.cross{stroke:#333333;}#mermaid-svg-lBpFvnCpVyIVlq0b svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lBpFvnCpVyIVlq0b .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-lBpFvnCpVyIVlq0b .cluster-label text{fill:#333;}#mermaid-svg-lBpFvnCpVyIVlq0b .cluster-label span{color:#333;}#mermaid-svg-lBpFvnCpVyIVlq0b .label text,#mermaid-svg-lBpFvnCpVyIVlq0b span{fill:#333;color:#333;}#mermaid-svg-lBpFvnCpVyIVlq0b .node rect,#mermaid-svg-lBpFvnCpVyIVlq0b .node circle,#mermaid-svg-lBpFvnCpVyIVlq0b .node ellipse,#mermaid-svg-lBpFvnCpVyIVlq0b .node polygon,#mermaid-svg-lBpFvnCpVyIVlq0b .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lBpFvnCpVyIVlq0b .node .label{text-align:center;}#mermaid-svg-lBpFvnCpVyIVlq0b .node.clickable{cursor:pointer;}#mermaid-svg-lBpFvnCpVyIVlq0b .arrowheadPath{fill:#333333;}#mermaid-svg-lBpFvnCpVyIVlq0b .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lBpFvnCpVyIVlq0b .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lBpFvnCpVyIVlq0b .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-lBpFvnCpVyIVlq0b .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-lBpFvnCpVyIVlq0b .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lBpFvnCpVyIVlq0b .cluster text{fill:#333;}#mermaid-svg-lBpFvnCpVyIVlq0b .cluster span{color:#333;}#mermaid-svg-lBpFvnCpVyIVlq0b div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lBpFvnCpVyIVlq0b :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

ZAB模式

消息广播

崩溃恢复

#mermaid-svg-lCn4CniYSaXo93Ee {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lCn4CniYSaXo93Ee .error-icon{fill:#552222;}#mermaid-svg-lCn4CniYSaXo93Ee .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lCn4CniYSaXo93Ee .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-lCn4CniYSaXo93Ee .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lCn4CniYSaXo93Ee .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lCn4CniYSaXo93Ee .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lCn4CniYSaXo93Ee .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lCn4CniYSaXo93Ee .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lCn4CniYSaXo93Ee .marker.cross{stroke:#333333;}#mermaid-svg-lCn4CniYSaXo93Ee svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lCn4CniYSaXo93Ee .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-lCn4CniYSaXo93Ee .cluster-label text{fill:#333;}#mermaid-svg-lCn4CniYSaXo93Ee .cluster-label span{color:#333;}#mermaid-svg-lCn4CniYSaXo93Ee .label text,#mermaid-svg-lCn4CniYSaXo93Ee span{fill:#333;color:#333;}#mermaid-svg-lCn4CniYSaXo93Ee .node rect,#mermaid-svg-lCn4CniYSaXo93Ee .node circle,#mermaid-svg-lCn4CniYSaXo93Ee .node ellipse,#mermaid-svg-lCn4CniYSaXo93Ee .node polygon,#mermaid-svg-lCn4CniYSaXo93Ee .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lCn4CniYSaXo93Ee .node .label{text-align:center;}#mermaid-svg-lCn4CniYSaXo93Ee .node.clickable{cursor:pointer;}#mermaid-svg-lCn4CniYSaXo93Ee .arrowheadPath{fill:#333333;}#mermaid-svg-lCn4CniYSaXo93Ee .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lCn4CniYSaXo93Ee .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lCn4CniYSaXo93Ee .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-lCn4CniYSaXo93Ee .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-lCn4CniYSaXo93Ee .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lCn4CniYSaXo93Ee .cluster text{fill:#333;}#mermaid-svg-lCn4CniYSaXo93Ee .cluster span{color:#333;}#mermaid-svg-lCn4CniYSaXo93Ee div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lCn4CniYSaXo93Ee :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

ZAB针对事务处理过程(两阶段)

广播事务阶段

广播事务提交操作

#mermaid-svg-lzCFF8NlsyxNreYy {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lzCFF8NlsyxNreYy .error-icon{fill:#552222;}#mermaid-svg-lzCFF8NlsyxNreYy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lzCFF8NlsyxNreYy .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-lzCFF8NlsyxNreYy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lzCFF8NlsyxNreYy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lzCFF8NlsyxNreYy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lzCFF8NlsyxNreYy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lzCFF8NlsyxNreYy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lzCFF8NlsyxNreYy .marker.cross{stroke:#333333;}#mermaid-svg-lzCFF8NlsyxNreYy svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lzCFF8NlsyxNreYy .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-lzCFF8NlsyxNreYy .cluster-label text{fill:#333;}#mermaid-svg-lzCFF8NlsyxNreYy .cluster-label span{color:#333;}#mermaid-svg-lzCFF8NlsyxNreYy .label text,#mermaid-svg-lzCFF8NlsyxNreYy span{fill:#333;color:#333;}#mermaid-svg-lzCFF8NlsyxNreYy .node rect,#mermaid-svg-lzCFF8NlsyxNreYy .node circle,#mermaid-svg-lzCFF8NlsyxNreYy .node ellipse,#mermaid-svg-lzCFF8NlsyxNreYy .node polygon,#mermaid-svg-lzCFF8NlsyxNreYy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lzCFF8NlsyxNreYy .node .label{text-align:center;}#mermaid-svg-lzCFF8NlsyxNreYy .node.clickable{cursor:pointer;}#mermaid-svg-lzCFF8NlsyxNreYy .arrowheadPath{fill:#333333;}#mermaid-svg-lzCFF8NlsyxNreYy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lzCFF8NlsyxNreYy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lzCFF8NlsyxNreYy .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-lzCFF8NlsyxNreYy .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-lzCFF8NlsyxNreYy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lzCFF8NlsyxNreYy .cluster text{fill:#333;}#mermaid-svg-lzCFF8NlsyxNreYy .cluster span{color:#333;}#mermaid-svg-lzCFF8NlsyxNreYy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lzCFF8NlsyxNreYy :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

  1. 客户端发起一个写操作请求

  2. Leader服务器将客户端的请求转化为事务Proposal提案,同时为每个Proposal分配一个全局的ID,即zxid

  3. Leader服务器为每个Follower服务器分配一个单独的队列,然后将需要广播的Proposal依次放到队列中去,并且根据FIFO策略进行消息发送

  4. Follower接收到Proposal后,会首先将其以事务日志的方式写入本地磁盘中,写入成功后向Leader反馈一个Ack响应消息

  5. Leader接收到超过半数以上Follower的Ack响应消息后,即认为消息发送成功,可以发送commit消息

  6. Leaderl向所有Follower广播commit消息,同时自身也会完成事务提交。Follower接收到commit消息后,会将上一条事务提交

此图对应的是上图的流程图
在这里插入图片描述

崩溃恢复

#mermaid-svg-UsLx4IY7O4G7AOKa {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-UsLx4IY7O4G7AOKa .error-icon{fill:#552222;}#mermaid-svg-UsLx4IY7O4G7AOKa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UsLx4IY7O4G7AOKa .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-UsLx4IY7O4G7AOKa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UsLx4IY7O4G7AOKa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UsLx4IY7O4G7AOKa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UsLx4IY7O4G7AOKa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UsLx4IY7O4G7AOKa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UsLx4IY7O4G7AOKa .marker.cross{stroke:#333333;}#mermaid-svg-UsLx4IY7O4G7AOKa svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UsLx4IY7O4G7AOKa .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-UsLx4IY7O4G7AOKa .cluster-label text{fill:#333;}#mermaid-svg-UsLx4IY7O4G7AOKa .cluster-label span{color:#333;}#mermaid-svg-UsLx4IY7O4G7AOKa .label text,#mermaid-svg-UsLx4IY7O4G7AOKa span{fill:#333;color:#333;}#mermaid-svg-UsLx4IY7O4G7AOKa .node rect,#mermaid-svg-UsLx4IY7O4G7AOKa .node circle,#mermaid-svg-UsLx4IY7O4G7AOKa .node ellipse,#mermaid-svg-UsLx4IY7O4G7AOKa .node polygon,#mermaid-svg-UsLx4IY7O4G7AOKa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UsLx4IY7O4G7AOKa .node .label{text-align:center;}#mermaid-svg-UsLx4IY7O4G7AOKa .node.clickable{cursor:pointer;}#mermaid-svg-UsLx4IY7O4G7AOKa .arrowheadPath{fill:#333333;}#mermaid-svg-UsLx4IY7O4G7AOKa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UsLx4IY7O4G7AOKa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UsLx4IY7O4G7AOKa .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-UsLx4IY7O4G7AOKa .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-UsLx4IY7O4G7AOKa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UsLx4IY7O4G7AOKa .cluster text{fill:#333;}#mermaid-svg-UsLx4IY7O4G7AOKa .cluster span{color:#333;}#mermaid-svg-UsLx4IY7O4G7AOKa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UsLx4IY7O4G7AOKa :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

Zab协议崩溃恢复同时满足的要求

  1. 已经产生提交(Proposal)的提案(过半数都Ack),Follower必须执行

  2. 未提交的提案直接丢弃 - 未proposal给follower的提案

Leader挂,重新选举

#mermaid-svg-7uEHZouC5uoJZf6x {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7uEHZouC5uoJZf6x .error-icon{fill:#552222;}#mermaid-svg-7uEHZouC5uoJZf6x .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-7uEHZouC5uoJZf6x .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-7uEHZouC5uoJZf6x .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-7uEHZouC5uoJZf6x .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-7uEHZouC5uoJZf6x .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-7uEHZouC5uoJZf6x .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-7uEHZouC5uoJZf6x .marker{fill:#333333;stroke:#333333;}#mermaid-svg-7uEHZouC5uoJZf6x .marker.cross{stroke:#333333;}#mermaid-svg-7uEHZouC5uoJZf6x svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-7uEHZouC5uoJZf6x .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-7uEHZouC5uoJZf6x .cluster-label text{fill:#333;}#mermaid-svg-7uEHZouC5uoJZf6x .cluster-label span{color:#333;}#mermaid-svg-7uEHZouC5uoJZf6x .label text,#mermaid-svg-7uEHZouC5uoJZf6x span{fill:#333;color:#333;}#mermaid-svg-7uEHZouC5uoJZf6x .node rect,#mermaid-svg-7uEHZouC5uoJZf6x .node circle,#mermaid-svg-7uEHZouC5uoJZf6x .node ellipse,#mermaid-svg-7uEHZouC5uoJZf6x .node polygon,#mermaid-svg-7uEHZouC5uoJZf6x .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-7uEHZouC5uoJZf6x .node .label{text-align:center;}#mermaid-svg-7uEHZouC5uoJZf6x .node.clickable{cursor:pointer;}#mermaid-svg-7uEHZouC5uoJZf6x .arrowheadPath{fill:#333333;}#mermaid-svg-7uEHZouC5uoJZf6x .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-7uEHZouC5uoJZf6x .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-7uEHZouC5uoJZf6x .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-7uEHZouC5uoJZf6x .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-7uEHZouC5uoJZf6x .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-7uEHZouC5uoJZf6x .cluster text{fill:#333;}#mermaid-svg-7uEHZouC5uoJZf6x .cluster span{color:#333;}#mermaid-svg-7uEHZouC5uoJZf6x div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-7uEHZouC5uoJZf6x :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

新Leader满足要求

  1. 新Leader必须都是己经提交了Proposall的Follower服务器节点

  2. 新选举的Leader节点中含有最大的zxid)这样做的好处是可以避免Leader服务器检查Proposal的提交和丢弃工作

数据恢复

#mermaid-svg-qMKmG0f2qbJMwHhQ {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qMKmG0f2qbJMwHhQ .error-icon{fill:#552222;}#mermaid-svg-qMKmG0f2qbJMwHhQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qMKmG0f2qbJMwHhQ .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-qMKmG0f2qbJMwHhQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qMKmG0f2qbJMwHhQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qMKmG0f2qbJMwHhQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qMKmG0f2qbJMwHhQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qMKmG0f2qbJMwHhQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qMKmG0f2qbJMwHhQ .marker.cross{stroke:#333333;}#mermaid-svg-qMKmG0f2qbJMwHhQ svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qMKmG0f2qbJMwHhQ .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-qMKmG0f2qbJMwHhQ .cluster-label text{fill:#333;}#mermaid-svg-qMKmG0f2qbJMwHhQ .cluster-label span{color:#333;}#mermaid-svg-qMKmG0f2qbJMwHhQ .label text,#mermaid-svg-qMKmG0f2qbJMwHhQ span{fill:#333;color:#333;}#mermaid-svg-qMKmG0f2qbJMwHhQ .node rect,#mermaid-svg-qMKmG0f2qbJMwHhQ .node circle,#mermaid-svg-qMKmG0f2qbJMwHhQ .node ellipse,#mermaid-svg-qMKmG0f2qbJMwHhQ .node polygon,#mermaid-svg-qMKmG0f2qbJMwHhQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qMKmG0f2qbJMwHhQ .node .label{text-align:center;}#mermaid-svg-qMKmG0f2qbJMwHhQ .node.clickable{cursor:pointer;}#mermaid-svg-qMKmG0f2qbJMwHhQ .arrowheadPath{fill:#333333;}#mermaid-svg-qMKmG0f2qbJMwHhQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qMKmG0f2qbJMwHhQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qMKmG0f2qbJMwHhQ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-qMKmG0f2qbJMwHhQ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-qMKmG0f2qbJMwHhQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qMKmG0f2qbJMwHhQ .cluster text{fill:#333;}#mermaid-svg-qMKmG0f2qbJMwHhQ .cluster span{color:#333;}#mermaid-svg-qMKmG0f2qbJMwHhQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qMKmG0f2qbJMwHhQ :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

.arrowheadPath{fill:#333333;}#mermaid-svg-qMKmG0f2qbJMwHhQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qMKmG0f2qbJMwHhQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qMKmG0f2qbJMwHhQ .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-qMKmG0f2qbJMwHhQ .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-qMKmG0f2qbJMwHhQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qMKmG0f2qbJMwHhQ .cluster text{fill:#333;}#mermaid-svg-qMKmG0f2qbJMwHhQ .cluster span{color:#333;}#mermaid-svg-qMKmG0f2qbJMwHhQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qMKmG0f2qbJMwHhQ :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}

[外链图片转存中…(img-kS0S5xEM-1714425757871)]
[外链图片转存中…(img-SsjSfTrc-1714425757872)]
[外链图片转存中…(img-q7xj1qjr-1714425757872)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取

  • 23
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值