搜尋
首頁資料庫MongoDB講講關於 MongoDB 複製集的幾個問題

MongoDB教學介紹為什麼要使用複製集

講講關於 MongoDB 複製集的幾個問題

推薦(免費):MongoDB教學

為什麼要使用複製集

1.備份資料
透過自帶的mongo_dump/mongo_restore 工具也可以實現備份,但畢竟沒有複製集的自動同步備份方便。

2.故障自動轉移
部署了複製集,當主節點掛了後,叢集會自動投票再從節點中選出一個新的主節點,繼續提供服務。而且這一切都是自動完成的,對維運人員和開發人員是透明的。當然,發生故障了還是得人工及時處理,不要過度依賴複製集,萬一都掛了,那就連喘息的時間都沒有了。

3.在某些特定的場景下提高讀取效能
預設情況下,讀取和寫入都只能在主節點上進行。
下面是MongoDB的客戶端支援5種複製集讀選項:

  • primary:預設模式,所有的讀取操作都在複製集的 主節點 進行的。
  • primaryPreferred:在大多數情況時,讀取操作在 主節點 上進行,但是如果主節點不可用了,讀取操作就會轉移到 從節點 上執行。
  • secondary:所有的讀取操作都在複製集的 從節點 上執行。
  • secondaryPreferred:在大多數情況下,讀取操作都是在 從節點 上進行的,但是當 從節點 不可用了,讀取操作會轉移到 主節點 上進行。
  • nearest:讀取操作會在 複製集 中網路延時最小的節點上進行,與節點類型無關。

來源:http://docs.mongoing.com/manual-zh/core/re...

不建議在從節點上進行讀取操作,因為從節點上的資料可能不是最新資料(主要原因)。
在從節點上進行讀取操作的場景很有限,官方手冊中寫明了適用的場景和不推薦從節點讀取操作的多個原因:http://docs.mongoing.com/manual-zh/ core/re...

說說我自己的看法:複製集並不是為了提高讀取效能而存在的,除了個別場景,不建議在從節點上進行讀取操作。如果想提升讀取效能,那麼請使用索引和分片。插一句,如果資料規模不大,就沒必要使用分片了。我們線上資料庫中單一集合記錄有將近 2 億條,效能還比較 OK(當然,機器配置也不差,而且上面就只跑了一個 Redis 和一個 MongoDB)。

如何部署複製集

##請看手冊:http://docs.mongoing.com/manual-zh/tutoria...

如何在程式中使用MongoDB 複製集故障自動轉移的特性

以PHP 的mongo 驅動為例。

$client = new MongoClient('mongodb://192.168.1.2:27018,192.168.1.3:27019,192.168.1.4:27020', array('replicaSet' => 'rs0'));
這樣設定後,如果只是其中一台 MongoDB 服務掛接後,剩餘的節點會自動選出新的主節點,程式還是可以繼續正常運作。在選舉的過程中,程序還是會拋出異常的,儘管選舉過程很快,但是為了程序的健壯性,必須考慮異常的處理。當然,如果選舉不出新的主節點,那麼整個 MongoDB 就不可用了。 (根據上面講的,如果複製集的讀取選項是配置的

primaryPreferred。如果沒有了主節點,但是從節點還可用的話,那麼讀取操作將轉移到從節點上去,這樣整個MongoDB 複製集還能提供讀取操作服務)

其實如果指定了複製集名

'replicaSet' => 'rs0',那麼就算不列出所有節點位址,只寫一個有效節點位址,mongo 驅動程式會自動取得到所有有效節點,$client->getHosts() 方法可以查看所有有效節點的位址。

但是如果你只寫了一個節點位址,剛好是那個節點掛掉了,那就連不上了。

所有我建議配置完整的節點位址清單

同步的原理是什麼

開啟複製集後,會在

local 函式庫下產生一個集合叫oplog.rs,這是一個有限集合,也就是大小是固定的。每次資料庫的寫入操作都會被記錄到這個集合裡面。複製集中的節點就是透過讀取其他節點上面的 oplog 來實現資料同步的。

举个例子:
用客户端向主节点添加了 100 条记录,那么 oplog 中也会有这 100 条的 insert 记录。从节点通过获取主节点的 oplog,也执行这 100 条 oplog 记录。这样,从节点也就复制了主节点的数据,实现了同步。

需要说明的是:并不是从节点只能获取主节点的 oplog。

为了提高复制的效率,复制集中所有节点之间会互相进行心跳检测(通过ping)。每个节点都可以从任何其他节点上获取oplog。

还有,用一条语句批量删除 50 条记录,并不是在 oplog 中只记录一条数据,而是记录 50 条单条删除的记录。

oplog中的每一条操作,无论是执行一次还是多次执行,对数据集的影响结果是一样的,i.e 每条oplog中的操作都是幂等的。

什么情况下需要重新同步

在上一个问题中得知:oplog 大小是固定的,而且 oplog 里面的记录数不一定和节点中的数据量成正比。那么,新记录肯定会将前面的老记录给覆盖。

如果,有天一个从节点挂了,其他节点还在正常运行,继续有写操作,oplog 继续增长。而这个挂掉的节点一直不能从其他节点那里同步最新的 oplog 记录,当其他节点的 oplog 已经发生的覆盖。即使这个从节点后来恢复了正常,也不会和其他节点保持数据一致了。因为,覆盖的就永远回不来了。

那么,这个时候就得重新同步了。恩,回不去的就永远回不去了,再找个新的重新开始吧。(逃

如何重新同步

参见:复制集成员的重新同步

什么时候应该使用投票节点

当复制集中有偶数个节点时,应该再加一个投票节点,用于打破投票僵局。

比如:我线上共有3台服务器,其中1台是作为 Web 服务器;其余2台作为 DB 服务器,各部署了1个MongoDB节点,构成了2个节点的复制集。这个时候,我并没有多余的机器了。在这个情况下,如果任意一台 DB 服务器上的 MongoDB 挂了,那么另外一台的 MongoDB 必然变为 SECONDARY 节点,那么就意味着 MongoDB 是不可用的了。为了避免这种情况,提高服务的可用性,可以在 Web 服务器上部署一个投票节点。投票节点并不存储数据,因此不能升职为 PRIMARY 节点,它对于硬件资源要求很低,并不会对 Web 服务器上的其他程序产生太大影响。这种情况下,如果任意一台 DB 服务器挂了,另外一台服务器上的 MongoDB 将成为 PRIMARY 节点,此时 MongoDB 还是依旧对外提供服务的。乘此时机,赶紧排查出故障的那台服务器的原因,尽快恢复服务。

为了让投票节点可以占用更少的资源,可以在配置文件中添加以下几个配置项:

journal = false
smallfiles = true
noprealloc = true

主从复制

master-slave 复制架构已经不推荐使用了,建议使用 replica sets 复制集架构。
参见:http://docs.mongoing.com/manual-zh/core/ma...

以上是講講關於 MongoDB 複製集的幾個問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:learnku。如有侵權,請聯絡admin@php.cn刪除
MongoDB與Oracle:了解關鍵差異MongoDB與Oracle:了解關鍵差異Apr 16, 2025 am 12:01 AM

MongoDB适合处理大规模非结构化数据,Oracle适用于需要事务一致性的企业级应用。1.MongoDB提供灵活性和高性能,适合处理用户行为数据。2.Oracle以稳定性和强大功能著称,适用于金融系统。3.MongoDB使用文档模型,Oracle使用关系模型。4.MongoDB适合社交媒体应用,Oracle适合企业级应用。

MongoDB:擴展和績效注意事項MongoDB:擴展和績效注意事項Apr 15, 2025 am 12:02 AM

MongoDB在擴展性和性能方面的考慮包括水平擴展、垂直擴展和性能優化。 1.水平擴展通過分片技術實現,提高系統容量。 2.垂直擴展通過增加硬件資源提升性能。 3.性能優化通過合理設計索引和優化查詢策略實現。

MongoDB的力量:現代數據管理MongoDB的力量:現代數據管理Apr 13, 2025 am 12:04 AM

MongoDB是一種NoSQL數據庫,因其靈活性和可擴展性在現代數據管理中非常重要。它採用文檔存儲,適合處理大規模、多變的數據,並提供強大的查詢和索引能力。

mongodb怎麼批量刪除mongodb怎麼批量刪除Apr 12, 2025 am 09:27 AM

MongoDB 中批量刪除文檔可以使用以下方法:1. $in 操作符指定要刪除的文檔列表;2. 正則表達式匹配符合條件的文檔;3. $exists 操作符刪除具有指定字段的文檔;4. find() 和 remove() 方法先獲取再刪除文檔。請注意,這些操作無法使用事務,並可能刪除所有匹配的文檔,因此使用時需謹慎。

mongodb命令怎麼設置mongodb命令怎麼設置Apr 12, 2025 am 09:24 AM

要設置MongoDB數據庫,可以使用命令行(use和db.createCollection())或mongo Shell(mongo、use和db.createCollection())。其他設置選項包括查看數據庫(show dbs)、查看集合(show collections)、刪除數據庫(db.dropDatabase())、刪除集合(db.<collection_name>.drop())、插入文檔(db.<collecti

怎麼部署mongodb集群怎麼部署mongodb集群Apr 12, 2025 am 09:21 AM

部署 MongoDB 集群分五步:部署主節點,部署輔助節點,添加輔助節點,配置複製,驗證集群。包括安裝 MongoDB 軟件、創建數據目錄、啟動 MongoDB 實例、初始化複製集、添加輔助節點、啟用副本集功能、配置投票權,並驗證集群狀態和數據複製。

mongodb應用場景怎麼用mongodb應用場景怎麼用Apr 12, 2025 am 09:18 AM

MongoDB 廣泛應用於以下場景:文檔存儲:管理用戶資料、內容、產品目錄等結構化和非結構化數據。實時分析:快速查詢和分析日誌、監控儀錶盤展示等實時數據。社交媒體:管理用戶關係圖譜、活動流和消息傳遞。物聯網:處理設備監控、數據收集和遠程管理等海量時間序列數據。移動應用:作為後端數據庫,同步移動設備數據、提供離線存儲等。其他領域:電子商務、醫療保健、金融服務和遊戲開發等多樣化場景。

怎麼看mongodb版本怎麼看mongodb版本Apr 12, 2025 am 09:15 AM

如何查看 MongoDB 版本:命令行:使用 db.version() 命令。編程語言驅動程序:Python:print(client.server_info()["version"])Node.js:db.command({ version: 1 }, (err, result) => { console.log(result.version); });

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器