摘要:注意記住的作用始終是把集群中具有投票權的節點總數湊成奇數用,防止腦裂。其代表的意義是集群中必須有大多數節點收到并確認了一個寫操作,這個寫操作才算成功。無論源或者目標片中不能夠滿足大多數時,遷移都會失敗。在有可能的情況下,應盡量使用代替。
前言
在技術社區混了這么長時間,因為一些常見的技術問題反復被問到,總是想寫寫文章把它們講清楚。無奈很多時候看似基礎的技術問題背后都隱藏著很深的原因,想要一次性說清楚太花時間,而平時又沒有很多時間能花在上面(主要是懶),所以產生了寫一系列文章的想法,講講我或我的客戶使用MongoDB過程中經常遇到的各種“坑”。話雖如此,難者不會會者不難,希望看了這些講解你就不再認為這些是“坑”了。
在講解這些問題前,我會假設讀者已經對MongoDB有了最基礎的了解,因此一些基本名詞和概念就不做過多的解釋,請自己查閱相關資料。
PSS vs PSA 什么是PSS/PSA?在MongoDB復制集中,存在三種類型的角色:
PRIMARY: 主節點(P)
SECONDARY: 從節點(S)
ARBITER: 仲裁節點(A)
構建一個復制集至少需要3個節點,所以用戶就有了兩種選擇,即PSS和PSA。
注意:記住A的作用始終是把集群中具有投票權的節點總數湊成奇數用,防止“腦裂”。因此諸如PAA,PSSAA之類的配置是沒有存在的意義的,極端情況下還會擾亂集群的正常工作。
最直接的好處:省錢啊!隨便找臺機器,不消耗什么資源就可以運行一個A,比一個S的成本小多了。
PSA有什么問題? 讀寫失效最直接的問題來自于MongoDB中的一個配置選項{w: "majority"},這個配置決定了一次成功的寫入操作需要到達多少個節點才算真正的成功,w可以定義為1,2,...n(n<=集群節點總數)或majority。而majority是保證在集群故障時不丟失數據的必要配置(關于majority和w以后再專門寫文章討論)。其代表的意義是:集群中必須有大多數節點收到并確認了一個寫操作,這個寫操作才算成功。
在三個節點的集群中,{w: "majority"} == {w: 2}。因此如果集群配置是PSA,由于A是不存數據的,所以集群中能夠確認寫操作的節點只有P和S,剛好是2。到這里可能有人已經看出問題了:在PSA中如果有一個數據節點宕機,則再也不能滿足{w: "majority"},所有使用這種配置的寫操作都會失敗。因此可以說,PSA在一定程度上丟失了高可用性,因為任何一個數據節點的失效都會導致{w: "majority"}類型寫入的失敗。
引申一下,ReadConcern同樣有可選值majority,因此同樣可能因為一個數據節點的失效而失效。
可能你會覺得:什么{w: "majority"}沒聽說過啊,我也不在乎丟失數據,那用PSA是不是就沒有問題了?當然不是!在很多你沒注意到的場景都存在著{w: "majority"}。比如:
分片集群數據遷移。無論源或者目標片中不能夠滿足大多數時,遷移都會失敗。
分片集群管理。包括但不限于以下這些操作實際上都隱含著{w: "majority"}。一旦不能滿足,這些操作都會失?。?/p>
db.dropDatabase()
db.collection.drop()
db.collection.dropIndex({...})
sh.shardCollection(...)
db.createUser(...)
結論majority比你想象的更重要,PSA不能夠提供足夠的可用數據節點來保證majority,因此在很多場景下會引發隱藏的錯誤。在有可能的情況下,應盡量使用PSS代替PSA。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19415.html
摘要:前言數據更新,中的,對任何數據庫而言都是最基本的操作。你并不能保證數據在被你讀出來到寫回去期間是否有別人已經改了數據庫中的記錄,這就是第一個風險,操作存在潛在的可能性會覆蓋掉別人更新過的數據。 前言 數據更新,CRUD中的U,對任何數據庫而言都是最基本的操作。看似簡單的更新操作中會藏著哪些坑?今天聊一聊這個話題。 在寫這個系列文章時,我會假設讀者已經對MongoDB有了最基礎的了解,因...
摘要:本質上所有查詢的數據都是從游標來的。的作用是從游標中提取一批數據,具體提取多少則是由決定。同時注意我們已經有了一個游標。為了便于理解,我們下面還是稱之為游標超時。 前言 聊一聊一個最基本的問題,游標的使用??赡苣銖膩頉]有注意過它,但其實它在MongoDB的使用中是普遍存在的,也存在一些常見的坑需要引起我們的注意。 在寫這個系列文章時,我會假設讀者已經對MongoDB有了最基礎的了解,因...
摘要:與動態鏈接庫配套的,會有相應的頭文件,來聲明動態鏈接庫中對外暴露的方法。結構體映射結構體映射類編寫類,繼承,表示這個一個結構體。聲明字段與,并且設置訪問屬性為。計算機狀態結構體結構體指針結構體具體的值至此,功能完成。 問題描述 虛擬化項目,需要用到Java調用原生代碼的技術,我們使用的是開源庫JNA(Java Native Access)。 Native(C/C++)代碼,編譯生成動態...
摘要:可以發現,整個同步過程是依賴于來進行的。不考慮導致的問題,正常的應用升級也會導致應用中斷運行。注意事項為了避免被回滾的更新被發布出去,選擇只在一個變更到達大多數節點不可能被回滾時,才會將這些變更發布到應用。 Change Stream是MongoDB從3.6開始支持的新特性。這個新特性有哪些奇妙之處,會給我們帶來什么便利?本次的文章將就這個主題進行初步討論。 Change Stream...
摘要:微信登錄的核心代碼依然采用這個庫。核心概念表結構中控機中控機為同一引導用戶登錄的微信登錄服務器,其中此機器做的為截圖部分的,引導用戶授權,微信回調到此中控機,拿到。微信回調到后,拿著,跳轉到對應的客戶域名。 背景 SaaS 作為一種服務,需要為不同的客戶定制不同的域名以滿足客戶定制化的需求。而微信登錄時需要填寫一個回調地址,單一的回調地址是難以處理多客戶域名的業務需求的,經過不同的 S...
閱讀 25629·2021-09-29 09:41
閱讀 4787·2021-09-10 11:20
閱讀 1918·2021-09-09 09:32
閱讀 1881·2019-08-30 15:44
閱讀 3192·2019-08-29 17:13
閱讀 2809·2019-08-29 14:14
閱讀 2062·2019-08-29 14:11
閱讀 3221·2019-08-29 12:36