【后端面試題】【中間件】【NoSQL】MongoDB提高可用性的方案(主從結構、仲裁節點、分片、寫入語義)

主從結構

MongoDB的高可用和別的中間件的高可用方案基本類似。比如在MySQL里,接觸了分庫分表和主從同步;在Redis里,Redis也有主從結構;在Kafka里,分區也是有主從結構的。
所以先介紹啟用了主從同步

我們的系統有一個關鍵組件 - MongoDB,但是在最開始的時候,MongoDB沒有啟用主從,是一個單節點的。因此每年總會有一兩次,MongoDB崩潰不可用。所以我把MongoDB改成了主從同步,最開始的時候業務量不多,為了節省成本,我們用了推薦的配置一主兩從。這種改變的好處是:當主節點崩潰后,從節點可以選舉出一個新的主節點。

直接說用了幾個主從節點,如果問到主從同步的話,回答oplog的內容。

引入仲裁節點

另一種思路是引入仲裁節點,所謂仲裁節點是指這個節點參與主從集群的主節點選舉,但是只參與投票,類似于Elasticsearch里的僅投票節點
這種機制在別的中間件也見過了,這類節點的好處在于它們只參與投票,也就是只關心主從選舉,所以只需要很少的資源就可以運行起來
在這里插入圖片描述

最開始的時候,我們只是部署了一主兩從,兩個從節點都會同步數據。后面為了進一步提高可用性,引入了仲裁節點。這些仲裁節點被部署在輕量級的服務器上,成本非常低。在引入了這些仲裁節點后,就算有一個從節點崩潰了,整個集群也基本沒什么影響,因為這個時候還是有足夠的節點可以投票

啟用主從模式的配置服務器

我們MongoDB最開始部署的時候,配置服務器并沒有啟用主從模式,畢竟當時想節省資源。但是后面發現,配置服務器這個對集群的影響太大了,一旦不可用,整個集群就基本不可用了。這種情況下,我們只好引入了主從結構的配置服務器。目前配置服務器本身就有一主兩從。

在這里插入圖片描述

雖然主節點還是存在崩潰的可能,但是在主節點崩潰之后會有主從選舉。更加重要的是,在主節點崩潰之后,整個配置服務集群還是可讀的。而我們也知道,在一個 MongoDB 集群里面,元數據也是讀多寫少的。兩者一結合,整個 MongoDB 集群的可用性就提高了。

多數據中心的主從結構

在MongoDB里有一個推薦的架構
在這里插入圖片描述
不過整除來說,大部分公司沒那么多資源部署,一個簡化版本就是用兩個數據中心,部署一主三從或兩從。

我們公司本身業務規模比較大,對MongoDB的依賴也很嚴重,所以我們還部署了多數據中心的主從結構。有兩個數據中心(可以同域,可以異地),其中一個數據中心,部署了一主一從,另外一個數據中心部署了兩個從節點。萬一一個數據中心崩潰了,另一個數據中心也還是可用的。

在這里插入圖片描述
在主從選舉的時候,我們也會傾向于選擇和主節點在同一個數據中心的從節點,也就是圖里面深黃色的從節點。因為正常來說,同一個數據中心內部的從節點,數據會比較新

同時為了保證在主從選舉的時候優先選擇同一個數據中心的節點,我們還調整了從節點的優先級。

在整個主從結構都面完了之后,你進一步總結一下。

基本上目前主流的這種大型中間件,在提高可用性上用的方法無外乎就是分片和主從結構。除了 MongoDB,類似的還有 Redis、Elasticsearch、Kafka。

引入分片

分片既可以提高可用性,也可以提高性能。在MongoDB里,引入分片比關系型數據庫簡單很多,可以直接說在開發新業務的時候就啟用了分片功能

隨著業務的增長,后面使用MongoDB的時候,都要求開啟分片功能,來進一步提高可用性的性能。

另一種思路是為已有的數據添加分片功能。
最后也要總結下

目前來說,支持大數據高并發的中間件基本上也有類似的分片功能。或者說,這一類的中間件明面上都是對等結構,而對等結構里面的每一個“節點”又是一個主從集群。就算是關系型數據庫的分庫分表,也可以看作是這種對等結構 + 主從結構的模式。

在這里插入圖片描述

調整寫入語義

寫入語義的調整一般有兩種思路,一是朝著可用性的角度調整,另一個是朝著性能的角度調整。

以可用性為例

最開始的時候,我們遇到過一個 Bug,就是數據寫入到 MongoDB 之后,偶爾會出現數據丟失的問題。因為之前我在 Kafka 上也遇到過類似的問題,所以我就懷疑是不是寫入語義沒做好。然后我就去排查,果然有發現,在這個數據丟失的場景下,Write Concern 的 w 取值不是默認的 majority,而是 1,也就是說只需要主節點寫入就可以。 很明顯,在這種情況下,萬一寫入之后主節點崩潰了,那么從節點就算被提升成主節點,也沒有這一條數據。所以,后面我就把這個改回了 majority。同時我還去排查了一個 j 參數,確認設置成了 true。這樣一來,數據就不太可能丟失了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38925.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38925.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38925.shtml

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

相關文章

基于Java的微信記賬小程序【附源碼】

摘 要 隨著我國經濟迅速發展,人們對手機的需求越來越大,各種手機軟件也都在被廣泛應用,但是對于手機進行數據信息管理,對于手機的各種軟件也是備受用戶的喜愛,記賬微信小程序被用戶普遍使用,為方便用戶能夠…

算法題中常用的C++功能

文章目錄 集合優先隊列雙端隊列排序時自定義比較函數最大數值字符串追加:刪除:子串: 元組vector查找創建和初始化賦值: 字典map引入頭文件定義和初始化插入元素訪問元素更新元素刪除元素檢查元素存在遍歷元素int和string轉換 集合…

Ubuntu20.04更新GLIBC到2.35版本

目錄 1 背景2 增加源2.1 標準源2.2 鏡像源 3 更新 1 背景 Ubuntu20.04默認GLIBC庫版本是2.31.今天碰到一個軟件需要2.35版本的GLIBC。 升級GLIBC庫有兩種方式: 下載高版本庫源碼,編譯后替換系統中低版本庫。由于GLIBC庫是Linux系統中最基礎庫&#xff…

你想活出怎樣的人生?

hi~好久不見,距離上次發文隔了有段時間了,這段時間,我是裸辭去感受了一下前端市場的水深火熱,那么這次咱們不聊技術,就說一說最近這段時間的經歷和一些感觸吧。 先說一下自己的個人情況,目前做前端四年&am…

深圳技術大學oj C : 生成r子集

Description 輸出給定序列按字典序的 � 組合,按照所有 � 個元素出現與否的 01 標記串 ����?1,...,�1 的字典序輸出. 此處01串的字典序指:先輸入的數字對應低位&#x…

移動智能終端數據安全管理方案

隨著信息技術的飛速發展,移動設備已成為企業日常運營不可或缺的工具。特別是隨著智能手機和平板電腦等移動設備的普及,這些設備存儲了大量的個人和敏感數據,如銀行信息、電子郵件等。員工通過智能手機和平板電腦訪問企業資源,提高…

【HICE】web服務搭建3

端口號的不同進行監聽 1.下載httpd協議&#xff1a;dnf install httpd -y 2.編輯vhost.conf cd /etc/httpd cd /conf.d [rootlocalhost conf.d]# cat 1.conf listen 9090 listen 9091 listen 9092 <directory /www> allowoverride none require all granted </d…

【機器學習】Datawhale-AI夏令營分子性質AI預測挑戰賽

參賽鏈接&#xff1a;零基礎入門 Ai 數據挖掘競賽-速通 Baseline - 飛槳AI Studio星河社區 一、賽事背景 在當今科技日新月異的時代&#xff0c;人工智能&#xff08;AI&#xff09;技術正以前所未有的深度和廣度滲透到科研領域&#xff0c;特別是在化學及藥物研發中展現出了巨…

SpringBoot+Vue集成AOP系統日志

新建logs表 添加aop依賴 <!-- aop依賴--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 新建獲取ip地址工具類 import javax.servlet.http.H…

React 函數式組件里面有生命周期嗎?沒有怎么辦?

React 函數式組件沒有像類組件那樣傳統的生命周期方法&#xff0c;但是通過 React Hooks&#xff0c;可以在函數式組件中實現類似的生命周期行為。 useEffect: 可以看作是類組件里的 componentDidMount, componentDidUpdate 和 componentWillUnmount 的結合體。它允許你在函數組…

在Linux環境下使用sqlite3時,如果嘗試對一個空表進行操作(例如插入數據),可能會遇到表被鎖定的問題。

在Linux環境下使用sqlite3時&#xff0c;如果嘗試對一個空表進行操作&#xff08;例如插入數據&#xff09;&#xff0c;可能會遇到表被鎖定的問題。這通常是因為sqlite3在默認情況下會對空表進行“延遲創建”&#xff0c;即在實際需要寫入數據之前&#xff0c;表不會被真正創建…

React Native V0.74 — 穩定版已發布

嗨,React Native開發者們, React Native 世界中令人興奮的消息是,V0.74剛剛在幾天前發布,有超過 1600 次提交。亮點如下: Yoga 3.0New Architecture: Bridgeless by DefaultNew Architecture: Batched onLayout UpdatesYarn 3 for New Projects讓我們深入了解每一個新亮點…

java 利用 gdal 生成遙感tif的縮略圖

簡要說明 在java&#xff0c;簡單使用gdal生成tif文件的縮略圖 maven依賴 <!--需要安裝完gdal后&#xff0c;本地install gdal包才能使用 --><!--gdal安裝可參考 https://blog.csdn.net/qq_41613913/article/details/135743562 --><dependency><groupI…

Docker精華篇 - 常用命令大全,入門到精通!

大家好,我是CodeQi! 我們都知道 Docker 的重要性,以及 Docker 如何在軟件開發生命周期中發揮重要作用 。 說實話,學習 Docker 很有趣,至少在我看來是這樣。 一旦掌握了基礎知識,這并不難。 困難的是記住所有這些命令。 因此,在這篇文章中,我收集了所有命令,或者更…

Patch embed 的映射矩陣多大?

假設我們有一個圖像&#xff0c;其大小為 (H \times W \times C)&#xff0c;其中 (H) 是圖像的高度&#xff0c;(W) 是圖像的寬度&#xff0c;(C) 是圖像的通道數&#xff08;例如&#xff0c;RGB 圖像的通道數為 3&#xff09;。 將圖像劃分成 patches: 假設我們將圖像劃分成…

命令可以不通過數據綁定進行配置

命令可以不通過數據綁定進行配置。在某些情況下&#xff0c;可能希望直接在代碼隱藏文件中處理命令邏輯&#xff0c;而不是通過數據綁定。以下是一個完整的例子&#xff0c;展示了如何在不使用數據綁定的情況下實現命令。 ### 1. 定義命令 首先&#xff0c;我們定義一個簡單的…

四十篇:內存巨擘對決:Redis與Memcached的深度剖析與多維對比

內存巨擘對決&#xff1a;Redis與Memcached的深度剖析與多維對比 1. 引言 在現代的系統架構中&#xff0c;內存數據庫已經成為了信息處理的核心技術之一。這類數據庫系統的高效性主要來源于其對數據的即時訪問能力&#xff0c;這是因為數據直接存儲在RAM中&#xff0c;而非傳統…

js學習--制作選項卡

選項卡制作 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>.text_one {width: 11.4%;height: 200px…

海致科技實施實習生面試

一、面試內容 注&#xff1a;此次是電話面試 1.是XX先生嗎 2.你是有考慮轉實施的嗎&#xff1f; 3.請講一下你對項目部署實施的理解和掌握 4.用過數據庫&#xff0c;會編寫SQL語句嗎&#xff1f; 5.講一下SQL的常用關鍵字 6.了解SQL中的函數嗎&#xff1f;談談函數 7.多…

Hutool 獲取中文日期

在開發過程中&#xff0c;有時會需要獲取全中文格式的日期&#xff0c;比如&#xff1a;二〇二四年七月三日。 此時就需要將日期轉換成該格式&#xff0c;Hutool 封裝了該工具&#xff1a; /*** 格式化為中文日期格式&#xff0c;如果isUppercase為false&#xff0c;則返回類似…