《从0开始学大数据》之ZooKeeper是如何保证数据一致性的

news2024/12/23 20:10:11

背景

在分布式集群系统中,比如两个应用程序都需要对一个文件路径进行写操作,但是如果两个应用程序对于哪台服务器是主服务器的判断不同,就会分别连接到两个不同的 NameNode 上,并都得到了对同一个文件路径的写操作权限,这样就会引起文件数据冲突,同一个文件指向了两份不同的数据。这种不同主服务器做出不同的响应,在分布式系统中被称作“脑裂”。光看这个词你也可以看出问题的严重性,这时候集群处于混乱状态,根本无法使用。那我们引入一个专门进行判断的服务器当“裁判”,让“裁判”决定哪个服务器是主服务器不就完事了吗?但是这个做出判断决策的服务器也有可能会出现故障不可访问,同样整个服务器集群也不能正常运行。所以这个做出判断决策的服务器必须由多台服务器组成,来保证高可用,任意一台服务器宕机都不会影响系统的可用性。

比较常用的多台服务器状态一致性的解决方案就是 ZooKeeper

分布式一致性原理

CAP 定理,一个提供数据服务的分布式系统无法同时满足数据一致性(Consistency)、可用性(Availibility)、分区耐受性(Patition Tolerance)这三个条件,如下图所示。
极客时间《从0开始学大数据》
一致性
每次读取的数据都应该是最近写入的数据或者返回一个错误(Every read receives the most recent write or an error),而不是过期数据,也就是说,数据是一致的。

可用性
每次请求都应该得到一个响应,而不是返回一个错误或者失去响应,不过这个响应不需要保证数据是最近写入的(Every request receives a (non-error) response, without the guarantee that it contains the most recent write),也就是说系统需要一直都是可以正常使用的,不会引起调用者的异常,但是并不保证响应的数据是最新的。

分区耐受性
即使因为网络原因,部分服务器节点之间消息丢失或者延迟了,系统依然应该是可以操作的(The system continues to operate despite an arbitrary number of messages being dropped (or delayed) by the network between nodes)。当网络分区失效发生的时候,我们要么取消操作,这样数据就是一致的,但是系统却不可用;要么我们继续写入数据,但是数据的一致性就得不到保证。

对于一个分布式系统而言,网络失效一定会发生,也就是说,分区耐受性是必须要保证的,那么在可用性和一致性上就必须二选一。当网络分区失效,也就是网络不可用的时候,如果选择了一致性,系统就可能返回一个错误码或者干脆超时,即系统不可用。如果选择了可用性,那么系统总是可以返回一个数据,但是并不能保证这个数据是最新的。

ZooKeeper 架构

zookeeper官网

ZAB算法

ZooKeeper 主要提供数据的一致性服务,其实现分布式系统的状态一致性依赖一个叫 Paxos 的算法。Paxos 算法在多台服务器通过内部的投票表决机制决定一个数据的更新与写入。

但Paxos 算法有点过于复杂、实现难度也比较高,所以 ZooKeeper 在编程实现的时候将其简化成了一种叫做 ZAB 的算法(Zookeeper Atomic Broadcast, Zookeeper 原子广播)。

极客时间《从0开始学大数据》
ZAB 算法的目的,同样是在多台服务器之间达成一致,保证这些服务器上存储的数据是一致的。ZAB 算法的主要特点在于:需要在这些服务器中选举一个 Leader,所有的写请求都必须提交给 Leader。由 Leader 服务器向其他服务器(Follower)发起 Propose,通知所有服务器:我们要完成一个写操作请求,大家检查自己的数据状态,是否有问题。

如果所有 Follower 服务器都回复 Leader 服务器 ACK,即没有问题,那么 Leader 服务器会向所有 Follower 发送 Commit 命令,要求所有服务器完成写操作。这样包括 Leader 服务器在内的所有 ZooKeeper 集群服务器的数据,就都更新并保持一致了。如果有两个客户端程序同时请求修改同一个数据,因为必须要经过 Leader 的审核,而 Leader 只接受其中一个请求,数据也会保持一致。

在实际应用中,客户端程序可以连接任意一个 Follower,进行数据读写操作。如果是写操作,那么这个请求会被这个 Follower 发送给 Leader,进行如上所述的处理;如果是读操作,因为所有服务器的数据都是一致的,那么这个 Follower 直接返回自己本地的数据给客户端就可以了。

Zookeeper如何为大数据系统选举主服务器

ZooKeeper 通过一种树状结构记录数据,如下图所示。

极客时间《从0开始学大数据》
应用程序可以通过路径的方式访问 ZooKeeper 中的数据,比如 /services/YaView/services/stupidname 这样的路径方式修改、读取数据。ZooKeeper 还支持监听模式,当数据发生改变的时候,通知应用程序。

因为大数据系统通常都是主从架构,主服务器管理集群的状态和元信息(meta-info),为了保证集群状态一致防止“脑裂”,所以运行期只能有一个主服务器工作(active master),但是为了保证高可用,必须有另一个主服务器保持热备(standby master)。那么应用程序和集群其他服务器如何才能知道当前哪个服务器是实际工作的主服务器呢?

所以很多大数据系统都依赖 ZooKeeper 提供的一致性数据服务,用于选举集群当前工作的主服务器。一台主服务器启动后向 ZooKeeper 注册自己为当前工作的主服务器,而另一台服务器就只能成为热备主服务器,应用程序运行期都和当前工作的主服务器通信。如果当前工作的主服务器宕机(在 ZooKeeper 上记录的心跳数据不再更新),热备主服务器通过 ZooKeeper 的监控机制发现当前工作的主服务器宕机,就向 ZooKeeper 注册自己成为当前工作的主服务器。应用程序和集群其他服务器跟新的主服务器通信,保证系统正常运行。

利用 ZooKeeper 选主服务器的伪代码如下:


//读取path路径/servers/leader的值
//第二个参数true,表示监听这个path的变化。
1 value = getdata(/servers/leader”, true) 

//如果有返回值,表示主服务器已经产生(即path中记录的value,为当前主服务器的机器名)
//当前函数退出
2 if(value != null){exit}

//执行到这里,表示还没有主服务器,将自己的主机名写入/servers/leader
//EPHEMERAL表示这是一个临时路径,如果当前程序崩溃,即主服务器崩溃,ZooKeeper会删除这个path
3 result = create(/servers/leader”, hostname, EPHEMERAL) 

//如果上一步创建path成功,当前函数退出
4 if result = successful{exit}

//执行到这里,表示既没有主服务器,自己也没有成功成为主服务器,从头再来
5.goto step 1

使用 ZooKeeper 提供的 API 接口,代码非常简单。所有要选举成为主服务器的服务器在启动的时候都在自己的服务器上执行上面这段伪代码的逻辑,其中的 getdata、create 会连接到 ZooKeeper 集群去处理。但是根据 ZAB 算法,只有一个服务器能将自己的 hostname 写入到 ZooKeeper 的主服务器路径 /servers/leader 中,保证集群只有一个主服务器。

而成功成为主服务器的服务器在创建 /servers/leader 路径的时候,已指定当前路径为 EPHEMERAL,即临时路径。如果当前的主服务器宕机,那么该服务器和 ZooKeeper 的长连接也就中断了,ZooKeeper 据此判断该服务器宕机,删除这个路径。其他监听这个路径的服务器(即在伪代码 1 中,第二个参数设置为 true)就会收到通知,所有服务器重新执行以上的伪代码,重新选举出新的、唯一的主服务器。

小结

ZooKeeper 通过 ZAB 算法实现数据一致性,并为各种大数据系统提供主服务器选举服务。虽然 ZooKeeper 并没有什么特别强大的功能,但是在各类分布式系统和大数据系统中,ZooKeeper 的出镜率非常高,因此也是很多系统的基础设施。

该笔记摘录自极客时间课程
《从0开始学大数据》

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

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

相关文章

振弦采集模块配置工具VMTool 扩展功能指令生成器与实时曲线

振弦采集模块配置工具VMTool 扩展功能指令生成器与实时曲线 指令生成器 ( 1) 指令生成 指令生成器可根据需要生成符合 MODBUS 和 AABB 通讯协议的读取和控制指令。 通过点击串口调试工具内的【 指令生成器】 按钮,可打开指令生成器窗口&#…

【SpringBoot高级篇】SpringBoot集成XXL-JOB分布式任务调度平台

【SpringBoot高级篇】SpringBoot集成XXL-JOB分布式任务调度平台简介下载源码部署任务调度平台执行SQL脚本部署任务平台简单使用初始化测试项目pom依赖SampleXxlJob修改配置调度平台配置执行器任务管理添加任务简介 XXL-JOB是一个分布式任务调度平台,其核心设计目标…

连续函数的运算与初等函数的连续性——“高等数学”

各位CSDN的uu们你们好呀,今天,小雅兰的内容是连续函数的运算与初等函数的连续性,上篇博客我们学到了函数的连续性和间断点,这篇博客相当于是上篇博客的一个补充,好吧,现在就让我们进入高等数学的世界吧 一、…

【刷题】不用加减乘除做加法

这是一道简单的数学题。但是比较繁琐,需要有耐心。 目录 前言 一、找规律 二、怎么实现加法? 总结 前言 这道题不让用四则运算符做加法,于是我第一反应是用位运算。 难道转成二进制再使用位运算吗,显然不需要,列草稿可…

Java 开发环境配置 “JDK”(超详细整理,适合新手入门)

前言 📜 “ 作者 久绊A ” 专注记录自己所整理的Java、web、sql等,IT技术干货、学习经验、面试资料、刷题记录,以及遇到的问题和解决方案,记录自己成长的点滴 目录 前言 一、什么是JDK? 1、大概介绍 2、详细介绍 …

MySQL进阶——触发器

1.触发器定义 同存储过程和函数类似,MySQL中的触发器也是存储在系统内部的一段程序代码,可以把它看作是一个特殊的存储过程。所不同的是,触发器无需人工调用,当程序满足定义条件时就会被MySQL自动调用。这些条件可以称为触发事件…

Weapp影视评分项目开发(04):三方组件的使用

知识点 三方组件库的安装与使用 computed 的安装与使用 新建代码分支 我们以 master 为基准,在 gitee 上新建代码分支 component,并在该分支上进行代码开发。命令如下: git pull // 拉取 component 分支 git checkout component // 切换到…

哪款无线耳机音质好?发烧友推荐四大音质超好的蓝牙耳机

蓝牙耳机因为摆脱了线的束缚,使用起来会更方便,近几年在人们的日常生活中也越来越常见。哪款无线耳机音质好?在此,我来给整理了几款发烧友都在推荐的好音质蓝牙耳机,一起来看看吧。 一、南卡小音舱蓝牙耳机 售价&…

推荐系统之ABTest实验中心

5.3 ABTest实验中心 学习目标 目标 无应用 无 个性化推荐系统、搜索引擎、广告系统,这些系统都需要在线上不断上线,不断优化,优化之后怎么确定是好是坏。这时就需要ABTest来确定,最近想的办法、优化的算法、优化的逻辑数据是正向…

Linux | 人生苦短,我用Vim【最受欢迎的编辑器】

一探顶级编辑器——Vim一、初次见面,你好vim1、vim的基本概念2、IDE与编辑器的区别3、vim中的五种常见模式介绍二、初出茅庐,vim基本操作1、安装vim,进入vim2、vim中的模式切换📺三、初露锋芒,vim指令集1、&#x1f52…

数据库系统概论——关系代数详解

文章目录1、关系代数概述1.1 传统的集合运算1.2 专门的关系运算1.2.1 选择运算1.2.2 投影(Projection)1.2.3 连接(Join)1.2.4 两类常用连接运算1.2.5 除(Division)1、关系代数概述 关系代数是一种抽象的查…

虹科分享 | 虹科智能自动化2022文章精选

虹科智能自动化事业部一直围绕着工业自动化、能源管理与楼宇自动化三大方向,为客户提供最满意的技术服务和最适合的解决方案,并结合客户需求、行业发展动向和产品资讯,虹科智能自动化团队为大家带来了丰富的技术文章和应用案例。温故而知新&a…

【SpringCloud复习巩固】Nacos

Nacos 链接:https://pan.baidu.com/s/1Ct6upj-kpLuVwyNpk_3KMw 提取码:yyac 目录 一.Nacos 1.1认识Nacos 1.2安装Nacos 1.2.1下载安装包 1.2.2解压到任意非中文目录 1.2.3介绍 1.2.4启动 1.2.5访问 1.3服务注册到Nacos 1.3.1在cloud-demo父工程…

APP漏洞挖掘(二)同开发商的多款APP存在通用漏洞

0x01 前言 测某一APP时,根据信息收集测试,发现APP的后台系统存在SQL注入、XSS、弱口令、信息泄漏等漏洞,此APP本身存在逻辑漏洞与SQL注入漏洞,再通过观察酷传搜索的结果发现此APP开发商开发了三十几个APP,猜测可能存在…

Vue笔记01 模板语法,数据代理,事件处理,计算监听属性,绑定样式,列表渲染

基本使用 引入vue 创建vue实例并关联容器 一个Vue实例只应对应一个容器 一个Vue实例可以有多个组件 模板语法 使用Vue实例中数据 root容器中代码被称为vue模板 语法分为插值语法和指令(v-xxx) 插值语法 绑定标签体内容 {{}}中的可以是js表达式(特殊的js代码&…

手把手带你调参Yolo v5(一)

来源:投稿 作者:王同学 编辑:学姐 YOLO系列模型在目标检测领域有着十分重要的地位,随着版本不停的迭代,模型的性能在不断地提升,源码提供的功能也越来越多,那么如何使用源码就显得十分的重要&am…

Kylin基本介绍、特点、架构

目录1. Kylin的基本介绍2. Kylin的特点3. Kylin的架构1. Kylin的基本介绍 Kylin是一种MOLAP(Multidimensional OLAP),基于多维数据集,需要预计算。另一种OLAP是ROLAP(Relational OLAP),基于关系型数据库,不需要预计算&#xff0c…

单链表的使用方法.数据结构(三)[上]

前言 提示:文本为数据解构(三)单链表: 本文具体讲解单链表的具体使用方法 提示:以下是本篇文 系列文章目录 第一章 数据解构(一) 第二章 顺序表的具体使用方法.数据解构(二) 文章目录 前言 系列文章目录 文章目录 一、单链表视图 二、…

JavaWeb—Tomcat服务器

1 tomcat概述及基本使用 概述 tomcat是apache软件基金会的jakatai项目组的一个核心项目,由apache、sun和其他一些公司及个 人共同开发而成。由于有了sun公司的参与和支持,最新的servlet、jsp规范总是能在tomcat中得到 体现。因为tomcat技术先进、性能稳定…

git搭建远程仓库

前言:我们现在搭建远程仓库,常见的,是去github、gitlab、gitee等这类第三方平台网站上进行部署。咱就顺道说说这三个的区别。 github 是面向全世界的,由国外开发的,基本上放在上面都是开源的,私人仓库好像…