分布式理论:CAP、BASE | 分布式存储与一致性哈希

文章目录

  • 分布式理论
    • CAP定理
    • BASE理论
  • 分布式存储与一致性哈希
    • 简单哈希
    • 一致性哈希
      • 虚拟节点


分布式理论

CAP定理

  • 一致性(Consistency): 在分布式系统中的所有数据副本,在同一时刻是否一致(所有节点访问同一份最新的数据副本)。
  • 可用性(Availability): 分布式系统在面对各种异常时可以提供正常服务的能力(非故障的节点在有限的时间内返回合理的响应)。
  • 分区容错性(Partition Tolerance): 分布式系统在遇到任何网络分区故障的时候,仍然需要能对外提供一致性和可用性的服务,除非是整个网络环境都发生了故障。

一个分布式系统不可能同时满足一致性、可用性、分区容错性这三个基本需求,最多只能满足其中的两项,不可能三者兼顾。

在这里插入图片描述

为什么三者不可兼顾呢?

这跟 网络分区 这一概念有关:在分布式系统中,不同的节点分布在不同的子网络(机房或异地网络等)中,由于一些特殊的原因导致这些子网络之间出现网络不连通的状况(但各个子网络的内部网络是连通的),从而导致了整个系统的网络环境被切分成了若干个孤立的区域。

在这里插入图片描述

此时,每个区域内部可以通信,但是区域之间无法通信。

对于一个分布式系统而言,组件必然要被部署到不同的节点上,因此必然会出现子网络。我们无法保证网络始终可靠,那么网络分区则是必定会产生的异常情况。当发生网络分区的时候,如果我们要继续提供服务,那么 分区容错性P 是必定要满足的。

那么一致性C和可用性A可以兼顾吗?

答案是否定的。倘若分布式系统中出现了网络分区的情况,假设此时某一个节点在进行写操作,为了保证一致性,那么就必须要禁止其他节点的读写操作以防止数据冲突,而此时就导致其他的节点无法正常工作,即与可用性发生冲突。而如果让其他节点都正常进行读写操作的话,那就无法保证数据的一致,影响了数据的一致性。


BASE理论

  • 基本可用(Basically Available): 基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性(响应时间上的损失、系统功能上的损失)。但是,这绝不等价于系统不可用。
  • 软状态(Soft-state): 允许系统中的数据存在中间状态(数据不一致),并认为该中间状态的存在不会影响系统的整体可用性。即允许系统在不同节点的数据副本之间进行数据同步时存在延时
  • 最终一致性(Eventually Consistent): 最终一致性强调的是系统中所有的数据副本最终能够达到一致,而不需要实时保证系统数据的强一致性。

BASE理论 是基本可用 、软状态和最终一致性 三个短语的缩写。是对 CAP 中的一致性和可用性权衡后的结果。

总的来说,BASE理论 面向的是大型高可用可扩展的分布式系统,它完全不同于 ACID 的强一致性模型,而是提出通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态。 但同时,在实际的分布式场景中,ACID特性BASE理论 往往又会结合在一起使用。


分布式存储与一致性哈希

如果我们需要存储QQ号与个人信息,建立起 <QQ号, 个人信息>KV 模型。

假设 QQ10亿 用户,并且每个用户的个人信息占据了 100M,如果要存储这些数据,所需要的空间就得 (100亿* 100M) = 10WT,这么庞大的数据是不可能在单机环境下存储的,只能采用分布式的方法,用多个机器进行存储,但是即使使用多机,这些数据也至少要 10w 台机器(假设每台服务器存 1T )才能存储。那么我们如何确定哪些数据应该放在哪个机器呢?这时就需要用到哈希算法。

简单哈希

我们可以采用除留余数法来完成一个映射:

机器编号 = hash(QQ号) % 机器数量

使用时再根据机器编号进入对应的机器进行增删查改即可。
在这里插入图片描述

但是这个方法存在着一个致命的缺陷,如果后续用户信息增加,10w 台机器就会不够用,此时就需要将机器数量扩容至 15w 台。

当进行扩容后,由于机器数量发生变化,数据的映射关系也会变化,我们就需要进行 rehash 来将所有数据重新映射到正确的位置上。

但是问题来了,这 10w 台机器的数据如果需要进行重新映射,花费的时间几乎是不可想象的,我们不可能说为了迁移数据而让服务器宕机数月之久,所以这种方法是不可能行得通的。


一致性哈希

为了弥补简单哈希的缺陷,引入了一致性哈希算法。以避免扩容后 rehash 带来的所有数据迁移问题。一致性哈希将哈希构造成一个 0~232-1 的环形结构,并将余数从原来的机器数量修改值为整型最大值(也可以是比这个更大的):

机器编号 = hash(QQ号) % 2^32

因为这个数据足够大,所以无需担心后续机器数增加导致的 rehash 问题。我们将环中的某一区间映射到某台服务器,让这台服务器管理这个区间,这样就能让这 10w 台服务器来切分这个闭环结构。

在这里插入图片描述

哈希环上的数据节点向顺时针方向寻找到的第一个服务器就是管理它的服务器。
在这里插入图片描述

当我们要查询某个数据的时候,根据哈希函数算出的映射位置来找到包含该位置的区间所对应的服务器,然后在那个服务器中进行操作即可。

如果原先的服务器不够用了,此时增加 5w 个服务器,也不需要像之前一样对所有机器的数据进行迁移,我们只需要迁移负载重的机器即可。

在这里插入图片描述

同理,如果一个服务器宕机了,那么该服务器的上的数据就会被顺时针方向的下一个服务器接管:

在这里插入图片描述
在这里插入图片描述

但是这样的接管容易引发雪崩,即C节点由于承担了B节点的数据,所以C节点的负载会变高,C节点很容易也宕机,这样依次下去,这样造成整个集群都挂了。

虚拟节点

为此,引入了虚拟节点的概念:即把想象在这个环上有很多虚拟节点,数据的存储是沿着环的顺时针方向找一个虚拟节点,每个虚拟节点都会关联到一个真实节点。

在这里插入图片描述

图中的A1、A2、B1、B2、C1、C2、D1、D2都是虚拟节点,机器A负载存储A1、A2的数据,机器B负载存储B1、B2的数据,机器C负载存储C1、C2的数据。由于这些虚拟节点数量很多,均匀分布,因此不会造成“雪崩”现象。

通过虚拟节点,我们可以做到不增加真实的服务器数量即可解决数据分布不均匀。

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

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

相关文章

分布式系统概念 | 分布式事务:2PC、3PC、本地消息表

文章目录分布式事务2PC&#xff08;二阶段提交协议&#xff09;执行流程优缺点3PC&#xff08;三阶段提交协议&#xff09;执行流程优缺点本地消息表&#xff08;异步确保&#xff09;分布式事务 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分…

数据结构算法 | 单调栈

文章目录算法概述题目下一个更大的元素 I思路代码下一个更大元素 II思路代码132 模式思路代码接雨水思路算法概述 当题目出现 「找到最近一个比其大的元素」 的字眼时&#xff0c;自然会想到 「单调栈」 。——三叶姐 单调栈以严格递增or递减的规则将无序的数列进行选择性排序…

最长下降子序列

文章目录题目解法DP暴搜思路代码实现贪心二分思路代码实现题目 给出一组数据 nums&#xff0c;求出其最长下降子序列&#xff08;子序列允许不连续&#xff09;的长度。&#xff08;类似于lc的最长递增子序列&#xff09; 示例&#xff1a; 输入&#xff1a; 6 // 数组元素个…

Linux 服务器程序规范、服务器日志、用户、进程间的关系

文章目录服务器程序规范日志rsyslogd 守护进程syslog函数openlog函数setlogmask函数closelog函数用户进程间的关系进程组会话系统资源限制改变工作目录和根目录服务器程序后台化服务器程序规范 Linux 服务器程序一般以后台进程&#xff08;守护进程[daemon]&#xff09;形式运…

IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO

文章目录IO模型阻塞IO非阻塞IO信号驱动IO多路复用IO异步IOIO模型 根据各自的特性不同&#xff0c;IO模型被分为阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO五类。 最主要的两个区别就是阻塞与非阻塞&#xff0c;同步与异步。 阻塞与非阻塞 阻塞与非阻塞最主要的区别就…

Tomcat服务器集群与负载均衡实现

一、前言 在单一的服务器上执行WEB应用程序有一些重大的问题&#xff0c;当网站成功建成并开始接受大量请求时&#xff0c;单一服务器终究无法满足需要处理的负荷量&#xff0c;所以就有点显得有点力不从心了。另外一个常见的问题是会产生单点故障&#xff0c;如果该服务器坏掉…

Linux服务器 | 事件处理模式:Reactor模式、Proactor模式

文章目录Reactor模式Proactor模式同步I/O模型模拟Proactor模式两者的优缺点ReactorProactor同步I/O模型通常用于实现 Reactor 模式&#xff0c;异步I/O模型通常用于实现 Proactor 模式。&#xff08;不是绝对的&#xff0c;同步I/O也可模拟出 Proactor 模式&#xff09; React…

Linux服务器 | 服务器模型与三个模块、两种并发模式:半同步/半异步、领导者/追随者

文章目录两种服务器模型及三个模块C/S模型P2P模型I/O处理单元、逻辑单元、存储单元并发同步与异步半同步/半异步模式变体&#xff1a;半同步/半反应堆模式改进&#xff1a;高效的半同步/半异步模式领导者/追随者模式组件 &#xff1a;句柄集、线程集、事件处理器工作流程两种服…

字符串匹配之KMP(KnuthMorrisPratt)算法(图解)

文章目录最长相等前后缀next数组概念代码实现图解GetNext中的回溯改进代码实现代码复杂度分析最长相等前后缀 给出一个字符串 ababa 前缀集合&#xff1a;{a, ab, aba, abab} 后缀集合&#xff1a;{a, ba, aba, baba} 相等前后缀 即上面用同样颜色标识出来的集合元素&#…

Android入门(一) | Android Studio的配置与使用

文章目录安装配置Android Studio使用Android Studio模拟器更改Android SDK的路径Hello World&#xff01;安装配置Android Studio 从这一步开始&#xff1a; 一直点 next 即可&#xff0c;直到存储路径的选择上&#xff0c;可以放到非 C 盘&#xff0c;这里我放到 D 盘了&am…

Android 入门(四) | Intent 实现 Activity 切换

文章目录Intent显式 Intent定义两个 xml 文件android:orientationmatch_parent 和 wrap_contentIntent函数定义两个 Activity隐式 Intent更多隐式 Intent 的用法用隐式 Intent 打开系统浏览器自建 Activity 以响应打开网页的 Intent向下一个活动传递数据返回数据给上一个活动In…

Android入门(二) | 项目目录及主要文件作用分析

文章目录项目目录分析app目录分析AndroidManifest.xml 分析MainActivity.kt 分析build.gradle 分析最外层目录下的 build.gradleapp 目录下的 build.gradle项目目录分析 我们来看一下 src/main/res 下的一些文件&#xff1a; .gradle 和 .idea &#xff1a;这两个目录下放置…

Android入门(三) | Android 的日志工具 Logcat

文章目录日志工具类 android.util.LogLogcat 中的过滤器日志工具类 android.util.Log Log 从属日志工具类 android.util.Log &#xff0c;该类提供了五个方法供我们打印日志&#xff1a; Log.v() &#xff1a;用于打印那些最为琐碎的、意义最小的日志信息。对应级别 verbose&…

Android入门(五) | Activity 的生命周期

文章目录Activity 的状态及生命周期实现管理生命周期FirstActivitySecondActivityDialogActivity运行结果旧活动被回收了还能返回吗&#xff1f;Activity 的状态及生命周期 Android 的应用程序运用 栈&#xff08;Back Stack&#xff09; 的思想来管理 Activity&#xff1a; …

Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧

文章目录Activity 的启动模式standardsingleTopsingleTasksingleInstance技巧了解当前界面是哪个 Activity随时随地退出程序启动活动的最佳写法Activity 的启动模式 standard&#xff1a;默认的启动方式&#xff0c;每次启动一个活动都会重新创建singleTop&#xff1a;如果该活…

Android入门(七) | 常用控件

文章目录TextView 控件&#xff1a;文本信息Button 控件&#xff1a;按钮EditText 控件&#xff1a;输入框ImageView 控件&#xff1a;图片ProgressBar 控件&#xff1a;进度条AlertDialog 控件&#xff1a;提示框ProgressDialog 控件&#xff1a;带有进度条的提示框TextView 控…

Android入门(八) | 常用的界面布局 及 自定义控件

文章目录LinearLayout &#xff1a;线性布局android:layout_gravity &#xff1a;控件的对齐方式android:layout_weight&#xff1a;权重RelativeLayout &#xff1a;相对布局相对于父布局进行定位相对于控件进行定位边缘对齐FrameLayout &#xff1a;帧布局Percent &#xff1…

Android入门(九)| 滚动控件 ListView 与 RecyclerView

文章目录ListView内置类型的简单运用定制数据类型提升效率点击事件RecyclerView布局管理器点击事件ListView 内置类型的简单运用 由于手机屏幕空间有限&#xff0c;能够一次性在屏幕上显示的内容不多&#xff0c;当我们的程序有大量数据需要显示的时候就可以借助 ListView 来…

Android入门(10)| Fragment碎片详解

文章目录为什么要使用碎片&#xff08;Fragment&#xff09;实例布局文件FragmentActivity动态添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期为什么要使用碎片&#xff08;Fragment&#xff09; 我们在手机上看新闻可能是这样的&#xff1a; Re…

Android开发(1) | Fragment 的应用——新闻应用

文章目录Item&#xff1a;标题子项布局文件Java代码标题碎片布局文件Java代码新闻内容碎片布局文件Java代码新闻内容活动布局文件Java代码首界面布局文件Java代码Item&#xff1a;标题子项 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…