分布式理論: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.pswp.cn/news/443729.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443729.shtml
英文地址,請注明出處:http://en.pswp.cn/news/443729.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Tomcat服務器性能優化

一、概述 本文檔主要介紹了Tomcat的性能調優的原理和方法。可作為公司技術人員為客戶Tomcat系統調優的技術指南&#xff0c;也可以提供給客戶的技術人員作為他們性能調優的指導手冊。 二、調優分類 由于Tomcat的運行依賴于JVM&#xff0c;從虛擬機的角度我們把Tomcat的調整分為…

分布式系統概念 | 分布式事務: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;句柄集、線程集、事件處理器工作流程兩種服…

香農信息熵之可憐的小豬

文章目錄題目解析香農熵公式樣例具體分析代碼題目 有 n 桶液體&#xff0c;其其中 正好 有一桶含有毒藥&#xff0c;其裝的都是水。它們從外觀看起來都一樣。為了弄清楚哪只水桶含有毒藥&#xff0c;你可以喂一些豬喝&#xff0c;通過觀察豬是否會死進行判斷&#xff0c;實驗對…

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

文章目錄最長相等前后綴next數組概念代碼實現圖解GetNext中的回溯改進代碼實現代碼復雜度分析最長相等前后綴 給出一個字符串 ababa 前綴集合&#xff1a;{a, ab, aba, abab} 后綴集合&#xff1a;{a, ba, aba, baba} 相等前后綴 即上面用同樣顏色標識出來的集合元素&#…

linux下tomcat6.0與jdk安裝詳細步驟

安裝Tomcat6.0和JDK1.6 在linux系統上安裝tomcat和jdk應該說是我學習linux知識的第一課了&#xff0c;之前只 是聽說過&#xff0c;從沒接觸過&#xff0c;但我們公司項目都是部署在linux系統上的&#xff0c;那天上司突 然給我發了幾個文檔&#xff0c;讓我看一下&#xff…

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 客戶端與服務器交互方式

突然想到一個問題就是Android客戶端與服務器交互有幾種方式&#xff0c;因為在腦袋里想當然的就是webservices和json。要在Android手機客戶端與pc服務器交互&#xff0c;需要滿足下面幾種條件&#xff1a;跨平臺、傳輸數據格式標準、交互方便...。 為了與服務器通訊其實無非就…

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 控…