基于docker-compose構(gòu)建Mongodb副本集的示例詳解
MongoDB 副本集是一組維護(hù)相同數(shù)據(jù)集的 MongoDB 服務(wù)器。它提供了數(shù)據(jù)的高可用性和數(shù)據(jù)冗余。在一個(gè)副本集中,有一個(gè)節(jié)點(diǎn)被選舉為 主節(jié)點(diǎn)(Primary)
,負(fù)責(zé)處理客戶端的所有寫(xiě)操作。其他的 次節(jié)點(diǎn)(Secondary)
復(fù)制主節(jié)點(diǎn)的數(shù)據(jù)。
副本集的主要特點(diǎn)和作用包括:
高可用性:在主節(jié)點(diǎn)不可用時(shí),副本集能自動(dòng)選舉一個(gè)新的主節(jié)點(diǎn),確保服務(wù)的連續(xù)性。這對(duì)于維護(hù)業(yè)務(wù)的正常運(yùn)行至關(guān)重要。
數(shù)據(jù)冗余:通過(guò)在不同服務(wù)器上復(fù)制數(shù)據(jù),副本集提供了數(shù)據(jù)冗余,增加了數(shù)據(jù)的安全性。
故障恢復(fù):在發(fā)生硬件故障或數(shù)據(jù)丟失時(shí),可以從次節(jié)點(diǎn)恢復(fù)數(shù)據(jù)。
讀寫(xiě)分離:雖然所有寫(xiě)操作都在主節(jié)點(diǎn)上進(jìn)行,但讀操作可以在次節(jié)點(diǎn)上進(jìn)行,這樣可以分散讀操作帶來(lái)的壓力,提高讀取性能。
災(zāi)難恢復(fù):通過(guò)在物理位置不同的地方部署次節(jié)點(diǎn),副本集可以提供地理冗余,從而在發(fā)生災(zāi)難時(shí)保護(hù)數(shù)據(jù)不受影響。
副本集是 MongoDB 高可用性和數(shù)據(jù)安全性策略的基礎(chǔ),適用于對(duì)數(shù)據(jù)安全性和服務(wù)可用性有較高要求的場(chǎng)景。
副本集使用場(chǎng)景一
假設(shè)有這樣的一個(gè)場(chǎng)景,當(dāng)多個(gè)用戶或操作同時(shí)修改多條數(shù)據(jù)時(shí),MongoDB 如何處理這些操作取決于是否使用了事務(wù)以及所使用的隔離級(jí)別。
沒(méi)有使用事務(wù)
MongoDB 在沒(méi)有使用事務(wù)的情況下,對(duì)于單個(gè)文檔提供原子性,但不保證多個(gè)操作或多個(gè)文檔更新的原子性或隔離性。這意味著如果你的第二次修改涉及到由第一次修改影響的數(shù)據(jù),可能會(huì)遇到以下情況:
- 臟讀:可能讀取到其他用戶正在修改但尚未完成的數(shù)據(jù)。
- 不可重復(fù)讀:在同一事務(wù)內(nèi)多次讀取同一數(shù)據(jù)集時(shí),可能會(huì)看到不同的數(shù)據(jù)(即,第一次讀取時(shí)看到一個(gè)值,第二次讀取時(shí)看到另一個(gè)值)。
- 幻讀:在一次事務(wù)中,一個(gè)事務(wù)讀取了幾行數(shù)據(jù),然后另一個(gè)并發(fā)事務(wù)插入了一些數(shù)據(jù)。在第一個(gè)事務(wù)再次讀取時(shí),會(huì)發(fā)現(xiàn)多了一些原本不存在的記錄。
使用了事務(wù)
對(duì)于副本集,MongoDB 支持多文檔事務(wù)。在 4.2 版本中,這個(gè)支持被擴(kuò)展到了分片集群。在多文檔事務(wù)中,可以包含對(duì)多個(gè)文檔的多次讀寫(xiě)操作,MongoDB 保證了以下幾點(diǎn):
- 原子性:事務(wù)內(nèi)的所有操作要么全部成功,要么全部失敗。
- 隔離性:默認(rèn)情況下,MongoDB 提供了快照隔離級(jí)別,這意味著事務(wù)將看到一致的數(shù)據(jù)快照,并且在事務(wù)提交之前,其他操作無(wú)法看到事務(wù)內(nèi)的更改。
如果你的第二次修改是在一個(gè)事務(wù)中,并且涉及到第一次修改的數(shù)據(jù),MongoDB 會(huì)確保按照隔離級(jí)別處理這些更改。如果兩個(gè)操作在不同的事務(wù)中,第二個(gè)事務(wù)會(huì)看到第一個(gè)事務(wù)提交的結(jié)果,前提是第一個(gè)事務(wù)已經(jīng)成功提交。
雖然事務(wù)提供了更強(qiáng)的一致性保障,但也可能對(duì)性能有所影響。尤其是在高負(fù)載或大規(guī)模數(shù)據(jù)操作時(shí),事務(wù)可能會(huì)導(dǎo)致延遲增加或資源消耗增大。
基于 docker-compose 來(lái)搭建 Mongodb 副本集
首先我們?cè)陧?xiàng)目的根目錄下創(chuàng)建一個(gè)名為 docker-compose.yml 的文件,并且編寫(xiě)如下代碼:
version: "3" services: mongodb-primary: image: mongo:latest container_name: mongodb-primary ports: - "27017:27017" environment: MONGO_INITDB_ROOT_USERNAME: moment MONGO_INITDB_ROOT_PASSWORD: moment volumes: - ./mongo-keyfile:/opt/keyfile/mongo-keyfile command: mongod --replSet rs0 --auth --keyFile /opt/keyfile/mongo-keyfile networks: - my-network mongodb-secondary: image: mongo:latest container_name: mongodb-secondary depends_on: - mongodb-primary environment: MONGO_INITDB_ROOT_USERNAME: moment MONGO_INITDB_ROOT_PASSWORD: moment volumes: - ./mongo-keyfile:/opt/keyfile/mongo-keyfile command: mongod --replSet rs0 --auth --keyFile /opt/keyfile/mongo-keyfile networks: - my-network mongodb-arbiter: image: mongo:latest container_name: mongodb-arbiter depends_on: - mongodb-primary environment: MONGO_INITDB_ROOT_USERNAME: moment MONGO_INITDB_ROOT_PASSWORD: moment volumes: - ./mongo-keyfile:/opt/keyfile/mongo-keyfile command: mongod --replSet rs0 --auth --keyFile /opt/keyfile/mongo-keyfile --oplogSize 128 networks: - my-network networks: my-network: driver: bridge
在上面的這些配置中,我們定義了三個(gè)服務(wù):mongodb-primary、mongodb-secondary 和 mongodb-arbiter。這三個(gè)服務(wù)共同構(gòu)成了一個(gè) MongoDB 副本集。
mongodb-primary: 這是副本集的主節(jié)點(diǎn)。它負(fù)責(zé)處理所有的寫(xiě)操作,并將數(shù)據(jù)更改復(fù)制到次節(jié)點(diǎn)。
mongodb-secondary: 這是副本集的次節(jié)點(diǎn)。它從主節(jié)點(diǎn)復(fù)制數(shù)據(jù),并可以在主節(jié)點(diǎn)不可用時(shí)被選舉為新的主節(jié)點(diǎn)。
mongodb-arbiter: 仲裁者節(jié)點(diǎn)不持有數(shù)據(jù),它的作用是在主節(jié)點(diǎn)故障時(shí)參與選舉新的主節(jié)點(diǎn)。它存在是為了在有偶數(shù)個(gè)數(shù)據(jù)持有節(jié)點(diǎn)時(shí)提供投票機(jī)制,確??偸悄軌蜻x出一個(gè)主節(jié)點(diǎn)。
除了這些內(nèi)容之外,還有一些關(guān)鍵配置項(xiàng):
image: 指定使用的 Docker 鏡像,這里使用的是最新版的 MongoDB 官方鏡像。
container_name: 為每個(gè)容器指定一個(gè)名字,如 mongodb-primary。
ports: 將容器內(nèi)的 27017 端口映射到宿主機(jī)的 27017 端口上,使得可以從宿主機(jī)訪問(wèn) MongoDB 服務(wù)。
environment: 設(shè)置環(huán)境變量,包括 MONGO_INITDB_ROOT_USERNAME 和 MONGO_INITDB_ROOT_PASSWORD,這些變量將被用來(lái)創(chuàng)建一個(gè)具有 root 權(quán)限的用戶。
volumes: 將宿主機(jī)上的密鑰文件 mongo-keyfile 掛載到容器內(nèi)的/opt/keyfile/mongo-keyfile。這個(gè)密鑰文件用于副本集成員之間的認(rèn)證。
command: 容器啟動(dòng)時(shí)執(zhí)行的命令。這里啟動(dòng)了 MongoDB 服務(wù),并通過(guò)一系列參數(shù)配置了副本集、認(rèn)證和密鑰文件。
networks: 指定容器連接的網(wǎng)絡(luò)。這里定義了一個(gè)名為 my-network 的自定義網(wǎng)絡(luò),確保容器之間能夠相互通信。
depends_on: 對(duì)于次節(jié)點(diǎn)和仲裁者節(jié)點(diǎn),這個(gè)選項(xiàng)指定了它們啟動(dòng)的依賴關(guān)系,確保它們?cè)谥鞴?jié)點(diǎn)啟動(dòng)后再啟動(dòng)。
這些配置完成之后,我們繼續(xù)在 docker-compose.yml 當(dāng)前文件目錄下繼續(xù)執(zhí)行一個(gè)命令:
openssl rand -base64 756 > mongo-keyfile
在上面的這些命令中,它將生成一個(gè) 1024 位左右的 Base64 編碼的隨機(jī)密鑰,并將其保存到名為 mongo-keyfile 的文件中。這個(gè)文件隨后可以被 MongoDB 的副本集配置用作認(rèn)證密鑰。
keyFile 用于內(nèi)部節(jié)點(diǎn)之間的認(rèn)證。所有副本集成員使用這個(gè)共享的密鑰進(jìn)行相互認(rèn)證,以確保只有被授權(quán)的節(jié)點(diǎn)可以加入副本集。
最終生成的文件內(nèi)容如下圖所示:
這些命令都執(zhí)行完成之后,我們就可以執(zhí)行 docker-compose up -d
命令來(lái)創(chuàng)建和啟動(dòng) Mongodb 了。
當(dāng)命令執(zhí)行完成之后,我們可以查看 docker 容器,最終都被創(chuàng)建成功了
接下來(lái)我們就要執(zhí)行下一個(gè)命令了,該命令的作用是啟動(dòng)并連接到名為 mongodb-primary 的運(yùn)行中的 Docker 容器的 bash shell。一旦進(jìn)入,你將能夠直接在容器的命令行界面中執(zhí)行命令,就像在任何標(biāo)準(zhǔn)的 Unix/Linux 命令行界面中一樣:
docker exec -it mongodb-primary bash
命令執(zhí)行成功之后,你會(huì)看到這樣的效果:
這個(gè)時(shí)候我們需要在終端里繼續(xù)執(zhí)行以下命令:
mongosh "mongodb://moment:moment@localhost:27017/?authSource=admin"
這段命令的作用是啟動(dòng) MongoDB Shell 并嘗試使用用戶名 moment 和密碼 moment 在本地機(jī)器上的默認(rèn)端口 27017 連接到 MongoDB 服務(wù),并在 admin 數(shù)據(jù)庫(kù)上進(jìn)行認(rèn)證
看到這個(gè)效果的時(shí)候說(shuō)明我們的數(shù)據(jù)庫(kù)已經(jīng)連接成功了。
這個(gè)時(shí)候我們還差最后一步,繼續(xù)在終端中輸入以下命令:
rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "mongodb-primary:27017" }, { _id: 1, host: "mongodb-secondary:27017" }, { _id: 2, host: "mongodb-arbiter:27017" }, ], });
該命令的作用是創(chuàng)建一個(gè)名為 rs0 的副本集,其中包含三個(gè)成員:一個(gè)主節(jié)點(diǎn)、一個(gè)次級(jí)節(jié)點(diǎn)和一個(gè)仲裁者節(jié)點(diǎn)。
當(dāng)命令執(zhí)行完成之后,我們?cè)趫?zhí)行 rs.status() 來(lái)檢查當(dāng)前實(shí)例狀態(tài),如下圖所示,這樣的結(jié)果表示執(zhí)行成功:
總結(jié)
在本篇文章中,我們學(xué)習(xí)到了如何使用 docker 來(lái)創(chuàng)建一個(gè)副本集,以及副本集有什么應(yīng)用場(chǎng)景。
以上就是基于docker-compose構(gòu)建Mongodb副本集的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于docker構(gòu)建Mongodb副本集的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- docker搭建mongodb單節(jié)點(diǎn)副本集的實(shí)現(xiàn)
- 聊聊MongoDB?帶訪問(wèn)控制的副本集部署問(wèn)題
- MongoDB 副本集的搭建過(guò)程
- mongodb 4.0副本集搭建的全過(guò)程
- Mongodb副本集和分片示例詳解
- mongodb3.4集群搭建實(shí)戰(zhàn)之高可用的分片+副本集
- Mongodb3.0.5 副本集搭建及spring和java連接副本集配置詳細(xì)介紹
- 詳解MongoDB中用sharding將副本集分配至服務(wù)器集群的方法
- MongoDB的主從復(fù)制及副本集的replSet配置教程
- MongoDB副本集部署完整教程(最新推薦)
相關(guān)文章
Docker從0到1實(shí)現(xiàn)項(xiàng)目編排部署
Docker編排是管理和協(xié)調(diào)多個(gè)Docker容器的工具和技術(shù),目的是簡(jiǎn)化容器的部署、擴(kuò)展和管理流程,本文主要介紹了Docker從0到1實(shí)現(xiàn)項(xiàng)目編排部署,感興趣的可以了解一下2025-03-03docker實(shí)現(xiàn)重新打tag并刪除原tag的鏡像
這篇文章主要介紹了docker實(shí)現(xiàn)重新打tag并刪除原tag的鏡像,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11docker 查詢或獲取私有倉(cāng)庫(kù)(registry)中的鏡像的方法
這篇文章主要介紹了docker 查詢或獲取私有倉(cāng)庫(kù)(registry)中的鏡像的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05docker如何進(jìn)入啟動(dòng)容器查看內(nèi)部目錄結(jié)構(gòu)
這篇文章主要介紹了docker如何進(jìn)入啟動(dòng)容器查看內(nèi)部目錄結(jié)構(gòu)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09遠(yuǎn)程連接Docker上的Mysql失敗的分析與解決方案
這篇文章主要介紹了遠(yuǎn)程連接Docker上的Mysql失敗的分析與解決方案的相關(guān)資料,需要的朋友可以參考下2023-01-012023年windows?DockerDeskTop最新款4.18.0?全程保姆級(jí)安裝圖文教程
這篇文章主要介紹了2023年windows?DockerDeskTop最新款4.18.0?全程保姆級(jí)安裝圖文教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04解決Docker network Create加--subnet后遇到問(wèn)題
這篇文章主要介紹了解決Docker network Create加--subnet后遇到問(wèn)題。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11