MongoDB教學(xué)介紹為什麼要使用複製集
推薦(免費(fèi)):MongoDB教學(xué)
為什麼要使用複製集
1.備份資料
透過自帶的mongo_dump/mongo_restore
工具也可以實現(xiàn)備份,但畢竟沒有複製集的自動同步備份方便。
2.故障自動轉(zhuǎn)移
部署了複製集,當(dāng)主節(jié)點(diǎn)掛了後,叢集會自動投票再從節(jié)點(diǎn)中選出一個新的主節(jié)點(diǎn),繼續(xù)提供服務(wù)。而且這一切都是自動完成的,對維運(yùn)人員和開發(fā)人員是透明的。當(dāng)然,發(fā)生故障了還是得人工及時處理,不要過度依賴複製集,萬一都掛了,那就連喘息的時間都沒有了。
3.在某些特定的場景下提高讀取效能
預(yù)設(shè)情況下,讀取和寫入都只能在主節(jié)點(diǎn)上進(jìn)行。
下面是MongoDB的客戶端支援5種複製集讀選項:
- primary:預(yù)設(shè)模式,所有的讀取操作都在複製集的 主節(jié)點(diǎn) 進(jìn)行的。
- primaryPreferred:在大多數(shù)情況時,讀取操作在 主節(jié)點(diǎn) 上進(jìn)行,但是如果主節(jié)點(diǎn)不可用了,讀取操作就會轉(zhuǎn)移到 從節(jié)點(diǎn) 上執(zhí)行。
- secondary:所有的讀取操作都在複製集的 從節(jié)點(diǎn) 上執(zhí)行。
- secondaryPreferred:在大多數(shù)情況下,讀取操作都是在 從節(jié)點(diǎn) 上進(jìn)行的,但是當(dāng) 從節(jié)點(diǎn) 不可用了,讀取操作會轉(zhuǎn)移到 主節(jié)點(diǎn) 上進(jìn)行。
- nearest:讀取操作會在 複製集 中網(wǎng)路延時最小的節(jié)點(diǎn)上進(jìn)行,與節(jié)點(diǎn)類型無關(guān)。
來源:http://docs.mongoing.com/manual-zh/core/re...
不建議在從節(jié)點(diǎn)上進(jìn)行讀取操作,因為從節(jié)點(diǎn)上的資料可能不是最新資料(主要原因)。
在從節(jié)點(diǎn)上進(jìn)行讀取操作的場景很有限,官方手冊中寫明了適用的場景和不推薦從節(jié)點(diǎn)讀取操作的多個原因:http://docs.mongoing.com/manual-zh/ core/re...
說說我自己的看法:複製集並不是為了提高讀取效能而存在的,除了個別場景,不建議在從節(jié)點(diǎn)上進(jìn)行讀取操作。如果想提升讀取效能,那麼請使用索引和分片。插一句,如果資料規(guī)模不大,就沒必要使用分片了。我們線上資料庫中單一集合記錄有將近 2 億條,效能還比較 OK(當(dāng)然,機(jī)器配置也不差,而且上面就只跑了一個 Redis 和一個 MongoDB)。
如何部署複製集
##請看手冊:http://docs.mongoing.com/manual-zh/tutoria...如何在程式中使用MongoDB 複製集故障自動轉(zhuǎn)移的特性
以PHP 的mongo 驅(qū)動為例。$client?=?new?MongoClient('mongodb://192.168.1.2:27018,192.168.1.3:27019,192.168.1.4:27020',?array('replicaSet'?=>?'rs0'));這樣設(shè)定後,如果只是其中一臺 MongoDB 服務(wù)掛接後,剩餘的節(jié)點(diǎn)會自動選出新的主節(jié)點(diǎn),程式還是可以繼續(xù)正常運(yùn)作。在選舉的過程中,程序還是會拋出異常的,儘管選舉過程很快,但是為了程序的健壯性,必須考慮異常的處理。當(dāng)然,如果選舉不出新的主節(jié)點(diǎn),那麼整個 MongoDB 就不可用了。 (根據(jù)上面講的,如果複製集的讀取選項是配置的
primaryPreferred。如果沒有了主節(jié)點(diǎn),但是從節(jié)點(diǎn)還可用的話,那麼讀取操作將轉(zhuǎn)移到從節(jié)點(diǎn)上去,這樣整個MongoDB 複製集還能提供讀取操作服務(wù))
'replicaSet' => 'rs0',那麼就算不列出所有節(jié)點(diǎn)位址,只寫一個有效節(jié)點(diǎn)位址,mongo 驅(qū)動程式會自動取得到所有有效節(jié)點(diǎn),
$client->getHosts() 方法可以查看所有有效節(jié)點(diǎn)的位址。
所有我建議配置完整的節(jié)點(diǎn)位址清單。
同步的原理是什麼
開啟複製集後,會在local 函式庫下產(chǎn)生一個集合叫
oplog.rs,這是一個有限集合,也就是大小是固定的。每次資料庫的寫入操作都會被記錄到這個集合裡面。複製集中的節(jié)點(diǎn)就是透過讀取其他節(jié)點(diǎn)上面的 oplog 來實現(xiàn)資料同步的。
舉個例子:
用客戶端向主節(jié)點(diǎn)添加了 100 條記錄,那么 oplog 中也會有這 100 條的 insert 記錄。從節(jié)點(diǎn)通過獲取主節(jié)點(diǎn)的 oplog,也執(zhí)行這 100 條 oplog 記錄。這樣,從節(jié)點(diǎn)也就復(fù)制了主節(jié)點(diǎn)的數(shù)據(jù),實現(xiàn)了同步。
需要說明的是:并不是從節(jié)點(diǎn)只能獲取主節(jié)點(diǎn)的 oplog。
為了提高復(fù)制的效率,復(fù)制集中所有節(jié)點(diǎn)之間會互相進(jìn)行心跳檢測(通過ping)。每個節(jié)點(diǎn)都可以從任何其他節(jié)點(diǎn)上獲取oplog。
還有,用一條語句批量刪除 50 條記錄,并不是在 oplog 中只記錄一條數(shù)據(jù),而是記錄 50 條單條刪除的記錄。
oplog中的每一條操作,無論是執(zhí)行一次還是多次執(zhí)行,對數(shù)據(jù)集的影響結(jié)果是一樣的,i.e 每條oplog中的操作都是冪等的。
什么情況下需要重新同步
在上一個問題中得知:oplog 大小是固定的,而且 oplog 里面的記錄數(shù)不一定和節(jié)點(diǎn)中的數(shù)據(jù)量成正比。那么,新記錄肯定會將前面的老記錄給覆蓋。
如果,有天一個從節(jié)點(diǎn)掛了,其他節(jié)點(diǎn)還在正常運(yùn)行,繼續(xù)有寫操作,oplog 繼續(xù)增長。而這個掛掉的節(jié)點(diǎn)一直不能從其他節(jié)點(diǎn)那里同步最新的 oplog 記錄,當(dāng)其他節(jié)點(diǎn)的 oplog 已經(jīng)發(fā)生的覆蓋。即使這個從節(jié)點(diǎn)后來恢復(fù)了正常,也不會和其他節(jié)點(diǎn)保持?jǐn)?shù)據(jù)一致了。因為,覆蓋的就永遠(yuǎn)回不來了。
那么,這個時候就得重新同步了。恩,回不去的就永遠(yuǎn)回不去了,再找個新的重新開始吧。(逃
如何重新同步
參見:復(fù)制集成員的重新同步
什么時候應(yīng)該使用投票節(jié)點(diǎn)
當(dāng)復(fù)制集中有偶數(shù)個節(jié)點(diǎn)時,應(yīng)該再加一個投票節(jié)點(diǎn),用于打破投票僵局。
比如:我線上共有3臺服務(wù)器,其中1臺是作為 Web 服務(wù)器;其余2臺作為 DB 服務(wù)器,各部署了1個MongoDB節(jié)點(diǎn),構(gòu)成了2個節(jié)點(diǎn)的復(fù)制集。這個時候,我并沒有多余的機(jī)器了。在這個情況下,如果任意一臺 DB 服務(wù)器上的 MongoDB 掛了,那么另外一臺的 MongoDB 必然變?yōu)?SECONDARY 節(jié)點(diǎn),那么就意味著 MongoDB 是不可用的了。為了避免這種情況,提高服務(wù)的可用性,可以在 Web 服務(wù)器上部署一個投票節(jié)點(diǎn)。投票節(jié)點(diǎn)并不存儲數(shù)據(jù),因此不能升職為 PRIMARY 節(jié)點(diǎn),它對于硬件資源要求很低,并不會對 Web 服務(wù)器上的其他程序產(chǎn)生太大影響。這種情況下,如果任意一臺 DB 服務(wù)器掛了,另外一臺服務(wù)器上的 MongoDB 將成為 PRIMARY 節(jié)點(diǎn),此時 MongoDB 還是依舊對外提供服務(wù)的。乘此時機(jī),趕緊排查出故障的那臺服務(wù)器的原因,盡快恢復(fù)服務(wù)。
為了讓投票節(jié)點(diǎn)可以占用更少的資源,可以在配置文件中添加以下幾個配置項:
journal?=?false smallfiles?=?true noprealloc?=?true
主從復(fù)制
master-slave 復(fù)制架構(gòu)已經(jīng)不推薦使用了,建議使用 replica sets 復(fù)制集架構(gòu)。
參見:http://docs.mongoing.com/manual-zh/core/ma...
以上是講講關(guān)於 MongoDB 複製集的幾個問題的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

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

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

在開發(fā)一個電商網(wǎng)站時,我遇到了一個棘手的問題:如何為用戶提供個性化的商品推薦。最初,我嘗試了一些簡單的推薦算法,但效果並不理想,用戶的滿意度也因此受到影響。為了提升推薦系統(tǒng)的精度和效率,我決定採用更專業(yè)的解決方案。最終,我通過Composer安裝了andres-montanez/recommendations-bundle,這不僅解決了我的問題,還大大提升了推薦系統(tǒng)的性能。可以通過一下地址學(xué)習(xí)composer:學(xué)習(xí)地址

CentOS系統(tǒng)上GitLab數(shù)據(jù)庫部署指南選擇合適的數(shù)據(jù)庫是成功部署GitLab的關(guān)鍵步驟。 GitLab兼容多種數(shù)據(jù)庫,包括MySQL、PostgreSQL和MongoDB。本文將詳細(xì)介紹如何選擇並配置這些數(shù)據(jù)庫。數(shù)據(jù)庫選擇建議MySQL:一款廣泛應(yīng)用的關(guān)係型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),性能穩(wěn)定,適用於大多數(shù)GitLab部署場景。 PostgreSQL:功能強(qiáng)大的開源RDBMS,支持複雜查詢和高級特性,適合處理大型數(shù)據(jù)集。 MongoDB:流行的NoSQL數(shù)據(jù)庫,擅長處理海

MongoDB適合處理大規(guī)模非結(jié)構(gòu)化數(shù)據(jù),Oracle適用于需要事務(wù)一致性的企業(yè)級應(yīng)用。1.MongoDB提供靈活性和高性能,適合處理用戶行為數(shù)據(jù)。2.Oracle以穩(wěn)定性和強(qiáng)大功能著稱,適用于金融系統(tǒng)。3.MongoDB使用文檔模型,Oracle使用關(guān)系模型。4.MongoDB適合社交媒體應(yīng)用,Oracle適合企業(yè)級應(yīng)用。

MongoDB適合非結(jié)構(gòu)化數(shù)據(jù)和高擴(kuò)展性需求,Oracle適合需要嚴(yán)格數(shù)據(jù)一致性的場景。 1.MongoDB靈活存儲不同結(jié)構(gòu)數(shù)據(jù),適合社交媒體和物聯(lián)網(wǎng)。 2.Oracle結(jié)構(gòu)化數(shù)據(jù)模型確保數(shù)據(jù)完整性,適用於金融交易。 3.MongoDB通過分片橫向擴(kuò)展,Oracle通過RAC縱向擴(kuò)展。 4.MongoDB維護(hù)成本低,Oracle維護(hù)成本高但支持完善。

CentOS系統(tǒng)下MongoDB高效備份策略詳解本文將詳細(xì)介紹在CentOS系統(tǒng)上實施MongoDB備份的多種策略,以確保數(shù)據(jù)安全和業(yè)務(wù)連續(xù)性。我們將涵蓋手動備份、定時備份、自動化腳本備份以及Docker容器環(huán)境下的備份方法,並提供備份文件管理的最佳實踐。手動備份:利用mongodump命令進(jìn)行手動全量備份,例如:mongodump-hlocalhost:27017-u用戶名-p密碼-d數(shù)據(jù)庫名稱-o/備份目錄此命令會將指定數(shù)據(jù)庫的數(shù)據(jù)及元數(shù)據(jù)導(dǎo)出到指定的備份目錄。

要設(shè)置 MongoDB 用戶,請按照以下步驟操作:1. 連接到服務(wù)器並創(chuàng)建管理員用戶。 2. 創(chuàng)建要授予用戶訪問權(quán)限的數(shù)據(jù)庫。 3. 使用 createUser 命令創(chuàng)建用戶並指定其角色和數(shù)據(jù)庫訪問權(quán)限。 4. 使用 getUsers 命令檢查創(chuàng)建的用戶。 5. 可選地設(shè)置其他權(quán)限或授予用戶對特定集合的權(quán)限。

要啟動 MongoDB 服務(wù)器:在 Unix 系統(tǒng)中,運(yùn)行 mongod 命令。在 Windows 系統(tǒng)中,運(yùn)行 mongod.exe 命令。可選:使用 --dbpath、--port、--auth 或 --replSet 選項設(shè)置配置。使用 mongo 命令驗證連接是否成功。

在Debian系統(tǒng)上為MongoDB數(shù)據(jù)庫加密,需要遵循以下步驟:第一步:安裝MongoDB首先,確保您的Debian系統(tǒng)已安裝MongoDB。如果沒有,請參考MongoDB官方文檔進(jìn)行安裝:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/第二步:生成加密密鑰文件創(chuàng)建一個包含加密密鑰的文件,並設(shè)置正確的權(quán)限:ddif=/dev/urandomof=/etc/mongodb-keyfilebs=512
