分散式系統中的數據複製

来源:https://www.cnblogs.com/waynaqua/archive/2023/07/19/17564497.html
-Advertisement-
Play Games

本文翻譯自國外論壇 medium,原文地址: # 什麼是數據複製? 數據複製是指將數據複製到一個或多個數據容器以確保可用性的過程。複製的數據通常存儲在不同的資料庫實例中,即使一個實例發生故障,我們也可以從其他實例獲取數據。 一種流行數據複製的實現架構是主從架構。 > 推薦博主開源的 H5 商城項目* ...


本文翻譯自國外論壇 medium,原文地址:https://medium.com/@interviewready/data-replication-in-distributed-system-87f7d265ff28

什麼是數據複製?

數據複製是指將數據複製到一個或多個數據容器以確保可用性的過程。複製的數據通常存儲在不同的資料庫實例中,即使一個實例發生故障,我們也可以從其他實例獲取數據。

一種流行數據複製的實現架構是主從架構。

推薦博主開源的 H5 商城項目waynboot-mall,這是一套全部開源的微商城項目,包含三個項目:運營後臺、H5 商城前臺和服務端介面。實現了商城所需的首頁展示、商品分類、商品詳情、商品 sku、分詞搜索、購物車、結算下單、支付寶/微信支付、收單評論以及完善的後臺管理等一系列功能。 技術上基於最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中間件。分模塊設計、簡潔易維護,歡迎大家點個 star、關註博主。

github 地址:https://github.com/wayn111/waynboot-mall

主從架構

為了理解這個架構,我們舉一個例子。

  • 我們有四個客戶端,每個客戶端都連接到一個負載均衡器。
  • 然後負載均衡器將請求分發到三個應用程式伺服器。
  • 每台伺服器連接到一個資料庫實例。

你能註意到這裡有什麼問題嗎?

我們的資料庫存在單點故障。如果它崩潰了,我們的整個系統就會停止工作。

為了避免這種單點故障,我們可以使用另一個資料庫(最好是不同的資料庫實例)來存儲原始數據的副本(一般我們成為從庫)。現在如果原始資料庫(主庫)崩潰,我們可以將請求轉到從庫。

但是我們如何保持從庫與主庫同步呢?這有兩種方法。

同步複製數據

  • 在這種方法中,數據同時寫入主庫和從庫
  • 數據始終一致。即數據如果寫入主庫,它也會寫入從庫
  • 資料庫負載較高

非同步複製數據

  • 在這種方法中,首先將數據寫入主庫,並定期將更新寫入從庫
  • 由於複製以固定間隔進行,因此存在數據丟失和不一致的可能性
  • 資料庫負載相對較低

這裡我們的一般定義是收到寫請求的主庫資料庫是 master)。從庫被稱為 slaves。

主從架構

如上圖我們的主站也就是 Server2 維護事務日誌。他會更新從站中(Server1)的數據,它發送命令,然後從站以相同的順序執行這些命令。

如果伺服器向從站發送寫入請求會發生什麼?

有兩種方法可以處理這種情況

  • 不允許對從站的寫請求,從站無法寫入資料庫,它只能去讀從庫數據。
  • 允許從站寫入數據。我們將允許從站寫入數據。然後從站將更改複製到主站。在這種情況下,從站就接替了主站的角色。所以不再是主從架構而是主主架構

主主架構的問題

網路故障可能會導致主主架構中的數據不一致。

讓我們用一個例子來理解這一點,假設我們有兩個資料庫實例 A 和 B。

  • 兩人都是 master。
  • 它們之間的路由器出現故障。所以 A 認為 B 離線,B 認為 A 離線。
  • 他們有一個數據項 X,其值最初為 100。

現在用戶發送以下請求,

  • X 減去 20,該請求被路由到 A,此時 A 中 X 的值為 80。
  • X 減去 80,這個請求被路由到 B(因為都是 master,所以寫請求可以路由到任何資料庫)。現在 B 中 X 的值為 20。

    由於存在通信故障,A 和 B 無法同步,它們具有不同的數據值,因此不一致。

  • 現在,如果用戶發出讀請求,他/她將獲得不同的值,具體取決於他/她將連接到的資料庫。

這個問題被稱為裂腦問題。

解決裂腦問題

解決裂腦問題

我們可以通過添加第三個節點(資料庫實例)來解決裂腦問題。

這裡我們假設一個節點崩潰以及其他兩個節點之間的路由器崩潰的可能性極小。

讓我們考慮三個資料庫實例 A、B 和 C。

  • 如果 C 崩潰,A 和 B 是主庫並且它們是同步的。所以他們處於一致的狀態。當 C 線上時,他們可以讀取 A 或 B 的內容。
  • 如果 A 和 B 之間出現通信故障
  • 當 A 收到寫入請求時,它將其狀態傳播到 C。最初狀態為 S0,然後轉移到 Sx。所以現在 A 和 C 都有 Sx。
  • 當 B 收到寫入請求時,它將其狀態從 S0 移至 Sy。它嘗試將其狀態傳播到 C,但失敗,因為 B 的先前狀態不等於 C。現在 B 中止寫入請求並將其狀態更新為 Sx。現在 B 可以接受寫入請求並將更改傳播到 C。

這稱為分散式共識。多個節點就特定值達成一致。在這種情況下,A、B 和 C 在最終狀態上達成一致。

最後

感謝您的閱讀,希望本文能對你理解分散式架構中的數據複製有所幫助。

關註公眾號【waynblog】每周分享技術乾貨、開源項目、實戰經驗、高效開發工具等,您的關註將是我的更新動力!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySQL8 概述、下載、安裝、使用(Windows2019和centos7.9) 1、MySQL概述 1.1 資料庫相關概念在這一部分,先瞭解三個概念:資料庫、資料庫管理系統、SQL。 名稱 全稱 簡稱 資料庫 存儲數據的倉庫,數據是有組織的進行存儲 DataBase(DB) 資料庫管理系統 操縱 ...
  • 一.介紹 1.什麼是ndk技術? 在學習ndk技術前,我們需要先瞭解一下JNI(Java Native Interface)技術,JNI技術是一種實現Java代碼和C/C++代碼之間交互的技術,它提供了一組編程介面,使得Java程式可以調用C/C++代碼並與其進行通信。通過JNI技術,開發者可以將C ...
  • # Vue引用js文件的多種方式 **1.vue-cli webpack全局引入jquery** (1)首先 npm install jquery --save (--save 的意思是將模塊安裝到項目目錄下,併在package文件的dependencies節點寫入依賴。) (2)在webpack. ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 🤭當我是if-else俠的時候 😶怕出錯 給我一個功能,我總是要寫很多if-else,雖然能跑,但是維護起來確實很難受,每次都要在一個方法裡面增加邏輯,生怕搞錯,要是涉及到支付功能,分分鐘炸鍋 😑難調試 我總是不知道之前寫的邏輯在哪 ...
  • 背景 後臺系統某功能按鈕需要訂單狀態和用戶許可權共同校驗是否顯示,將許可權校驗和v-if共同作用在同一div中,下方為實例代碼 <div v-if="status==0"> <div @click="function1"> 某按鈕功能 </div> </div> <div v-if="status==1 ...
  • 最近,群友貼了一個非常有意思的動畫效果,整體動畫效果如下: ![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9767a38b3ec04e3fb3082daed7ac75a0~tplv-k3u1fbpfcp-watermark.image?) ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 TypeScript是一種由微軟開發的自由和開源的編程語言。它是JavaScript的一個超集,而且本質上向這個語言添加了可選的靜態類型和基於類的面向對象編程。 一、! 非空斷言操作符 在上下文中當類型檢查器無法斷定類型時,一個新的尾碼表 ...
  • 1.概述 JavaScript,縮寫為JS,是一種高級的、多範式、解釋型的編程語言,是一門基於原型、函數先行的語言,它支持面向對象編程、命令式編程以及函數式編程,是目前web開發中不可缺少的腳本語言,不需要編譯即可運行 JavaScript主要用來向HTML頁面添加交互行為,可以直接嵌入HTML頁面 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...