最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于docker-compose構(gòu)建Mongodb副本集的示例詳解

 更新時間:2024年01月30日 09:03:01   作者:Moment  
副本集是?MongoDB?高可用性和數(shù)據(jù)安全性策略的基礎(chǔ),適用于對數(shù)據(jù)安全性和服務(wù)可用性有較高要求的場景,本文給大家介紹了如何基于docker-compose構(gòu)建Mongodb副本集,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下

MongoDB 副本集是一組維護(hù)相同數(shù)據(jù)集的 MongoDB 服務(wù)器。它提供了數(shù)據(jù)的高可用性和數(shù)據(jù)冗余。在一個副本集中,有一個節(jié)點被選舉為 主節(jié)點(Primary),負(fù)責(zé)處理客戶端的所有寫操作。其他的 次節(jié)點(Secondary) 復(fù)制主節(jié)點的數(shù)據(jù)。

副本集的主要特點和作用包括:

  • 高可用性:在主節(jié)點不可用時,副本集能自動選舉一個新的主節(jié)點,確保服務(wù)的連續(xù)性。這對于維護(hù)業(yè)務(wù)的正常運行至關(guān)重要。

  • 數(shù)據(jù)冗余:通過在不同服務(wù)器上復(fù)制數(shù)據(jù),副本集提供了數(shù)據(jù)冗余,增加了數(shù)據(jù)的安全性。

  • 故障恢復(fù):在發(fā)生硬件故障或數(shù)據(jù)丟失時,可以從次節(jié)點恢復(fù)數(shù)據(jù)。

  • 讀寫分離:雖然所有寫操作都在主節(jié)點上進(jìn)行,但讀操作可以在次節(jié)點上進(jìn)行,這樣可以分散讀操作帶來的壓力,提高讀取性能。

  • 災(zāi)難恢復(fù):通過在物理位置不同的地方部署次節(jié)點,副本集可以提供地理冗余,從而在發(fā)生災(zāi)難時保護(hù)數(shù)據(jù)不受影響。

副本集是 MongoDB 高可用性和數(shù)據(jù)安全性策略的基礎(chǔ),適用于對數(shù)據(jù)安全性和服務(wù)可用性有較高要求的場景。

副本集使用場景一

假設(shè)有這樣的一個場景,當(dāng)多個用戶或操作同時修改多條數(shù)據(jù)時,MongoDB 如何處理這些操作取決于是否使用了事務(wù)以及所使用的隔離級別。

沒有使用事務(wù)

MongoDB 在沒有使用事務(wù)的情況下,對于單個文檔提供原子性,但不保證多個操作或多個文檔更新的原子性或隔離性。這意味著如果你的第二次修改涉及到由第一次修改影響的數(shù)據(jù),可能會遇到以下情況:

  • 臟讀:可能讀取到其他用戶正在修改但尚未完成的數(shù)據(jù)。
  • 不可重復(fù)讀:在同一事務(wù)內(nèi)多次讀取同一數(shù)據(jù)集時,可能會看到不同的數(shù)據(jù)(即,第一次讀取時看到一個值,第二次讀取時看到另一個值)。
  • 幻讀:在一次事務(wù)中,一個事務(wù)讀取了幾行數(shù)據(jù),然后另一個并發(fā)事務(wù)插入了一些數(shù)據(jù)。在第一個事務(wù)再次讀取時,會發(fā)現(xiàn)多了一些原本不存在的記錄。

使用了事務(wù)

對于副本集,MongoDB 支持多文檔事務(wù)。在 4.2 版本中,這個支持被擴(kuò)展到了分片集群。在多文檔事務(wù)中,可以包含對多個文檔的多次讀寫操作,MongoDB 保證了以下幾點:

  • 原子性:事務(wù)內(nèi)的所有操作要么全部成功,要么全部失敗。
  • 隔離性:默認(rèn)情況下,MongoDB 提供了快照隔離級別,這意味著事務(wù)將看到一致的數(shù)據(jù)快照,并且在事務(wù)提交之前,其他操作無法看到事務(wù)內(nèi)的更改。

如果你的第二次修改是在一個事務(wù)中,并且涉及到第一次修改的數(shù)據(jù),MongoDB 會確保按照隔離級別處理這些更改。如果兩個操作在不同的事務(wù)中,第二個事務(wù)會看到第一個事務(wù)提交的結(jié)果,前提是第一個事務(wù)已經(jīng)成功提交。

雖然事務(wù)提供了更強(qiáng)的一致性保障,但也可能對性能有所影響。尤其是在高負(fù)載或大規(guī)模數(shù)據(jù)操作時,事務(wù)可能會導(dǎo)致延遲增加或資源消耗增大。

基于 docker-compose 來搭建 Mongodb 副本集

首先我們在項目的根目錄下創(chuàng)建一個名為 docker-compose.yml 的文件,并且編寫如下代碼:

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

在上面的這些配置中,我們定義了三個服務(wù):mongodb-primary、mongodb-secondary 和 mongodb-arbiter。這三個服務(wù)共同構(gòu)成了一個 MongoDB 副本集。

  • mongodb-primary: 這是副本集的主節(jié)點。它負(fù)責(zé)處理所有的寫操作,并將數(shù)據(jù)更改復(fù)制到次節(jié)點。

  • mongodb-secondary: 這是副本集的次節(jié)點。它從主節(jié)點復(fù)制數(shù)據(jù),并可以在主節(jié)點不可用時被選舉為新的主節(jié)點。

  • mongodb-arbiter: 仲裁者節(jié)點不持有數(shù)據(jù),它的作用是在主節(jié)點故障時參與選舉新的主節(jié)點。它存在是為了在有偶數(shù)個數(shù)據(jù)持有節(jié)點時提供投票機(jī)制,確??偸悄軌蜻x出一個主節(jié)點。

除了這些內(nèi)容之外,還有一些關(guān)鍵配置項:

  • image: 指定使用的 Docker 鏡像,這里使用的是最新版的 MongoDB 官方鏡像。

  • container_name: 為每個容器指定一個名字,如 mongodb-primary。

  • ports: 將容器內(nèi)的 27017 端口映射到宿主機(jī)的 27017 端口上,使得可以從宿主機(jī)訪問 MongoDB 服務(wù)。

  • environment: 設(shè)置環(huán)境變量,包括 MONGO_INITDB_ROOT_USERNAME 和 MONGO_INITDB_ROOT_PASSWORD,這些變量將被用來創(chuàng)建一個具有 root 權(quán)限的用戶。

  • volumes: 將宿主機(jī)上的密鑰文件 mongo-keyfile 掛載到容器內(nèi)的/opt/keyfile/mongo-keyfile。這個密鑰文件用于副本集成員之間的認(rèn)證。

  • command: 容器啟動時執(zhí)行的命令。這里啟動了 MongoDB 服務(wù),并通過一系列參數(shù)配置了副本集、認(rèn)證和密鑰文件。

  • networks: 指定容器連接的網(wǎng)絡(luò)。這里定義了一個名為 my-network 的自定義網(wǎng)絡(luò),確保容器之間能夠相互通信。

  • depends_on: 對于次節(jié)點和仲裁者節(jié)點,這個選項指定了它們啟動的依賴關(guān)系,確保它們在主節(jié)點啟動后再啟動。

這些配置完成之后,我們繼續(xù)在 docker-compose.yml 當(dāng)前文件目錄下繼續(xù)執(zhí)行一個命令:

openssl rand -base64 756 > mongo-keyfile

在上面的這些命令中,它將生成一個 1024 位左右的 Base64 編碼的隨機(jī)密鑰,并將其保存到名為 mongo-keyfile 的文件中。這個文件隨后可以被 MongoDB 的副本集配置用作認(rèn)證密鑰。

keyFile 用于內(nèi)部節(jié)點之間的認(rèn)證。所有副本集成員使用這個共享的密鑰進(jìn)行相互認(rèn)證,以確保只有被授權(quán)的節(jié)點可以加入副本集。

最終生成的文件內(nèi)容如下圖所示:

這些命令都執(zhí)行完成之后,我們就可以執(zhí)行 docker-compose up -d 命令來創(chuàng)建和啟動 Mongodb 了。

當(dāng)命令執(zhí)行完成之后,我們可以查看 docker 容器,最終都被創(chuàng)建成功了

接下來我們就要執(zhí)行下一個命令了,該命令的作用是啟動并連接到名為 mongodb-primary 的運行中的 Docker 容器的 bash shell。一旦進(jìn)入,你將能夠直接在容器的命令行界面中執(zhí)行命令,就像在任何標(biāo)準(zhǔn)的 Unix/Linux 命令行界面中一樣:

docker exec -it mongodb-primary bash

命令執(zhí)行成功之后,你會看到這樣的效果:

這個時候我們需要在終端里繼續(xù)執(zhí)行以下命令:

mongosh "mongodb://moment:moment@localhost:27017/?authSource=admin"

這段命令的作用是啟動 MongoDB Shell 并嘗試使用用戶名 moment 和密碼 moment 在本地機(jī)器上的默認(rèn)端口 27017 連接到 MongoDB 服務(wù),并在 admin 數(shù)據(jù)庫上進(jìn)行認(rèn)證

看到這個效果的時候說明我們的數(shù)據(jù)庫已經(jīng)連接成功了。

這個時候我們還差最后一步,繼續(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)建一個名為 rs0 的副本集,其中包含三個成員:一個主節(jié)點、一個次級節(jié)點和一個仲裁者節(jié)點。

當(dāng)命令執(zhí)行完成之后,我們在執(zhí)行 rs.status() 來檢查當(dāng)前實例狀態(tài),如下圖所示,這樣的結(jié)果表示執(zhí)行成功:

總結(jié)

在本篇文章中,我們學(xué)習(xí)到了如何使用 docker 來創(chuàng)建一個副本集,以及副本集有什么應(yīng)用場景。

以上就是基于docker-compose構(gòu)建Mongodb副本集的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于docker構(gòu)建Mongodb副本集的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • docker pull鏡像報錯:‘invalid checksum digest format‘解決

    docker pull鏡像報錯:‘invalid checksum digest 

    鏡像推送/拉取報錯,排查發(fā)現(xiàn)倉庫正常但Docker默認(rèn)連接443端口,配置了安全連接,最終因宿主機(jī)443端口被占用,停掉沖突服務(wù)后問題解決
    2025-08-08
  • 詳解基于docker-swarm搭建持續(xù)集成集群服務(wù)

    詳解基于docker-swarm搭建持續(xù)集成集群服務(wù)

    這篇文章主要介紹了詳解基于docker-swarm搭建持續(xù)集成集群服務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • 如何基于docker 部署Skywalking

    如何基于docker 部署Skywalking

    文章詳解使用Docker部署SkyWalking,涵蓋Elasticsearch單節(jié)點配置、OAPServer與UI服務(wù)的鏡像選擇、端口映射及依賴關(guān)系,以及客戶端Agent集成方法,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-09-09
  • Visual Studio發(fā)布 Docker 鏡像的實現(xiàn)步驟

    Visual Studio發(fā)布 Docker 鏡像的實現(xiàn)步驟

    本文詳細(xì)指導(dǎo)如何在Visual Studio中為ASP.NET Core WebAPI項目集成Docker支持,包括配置步驟、編寫Dockerfile、測試代碼、launchSettings.json配置及docker-compose.yml編寫,感興趣的可以了解一下
    2026-04-04
  • docker安裝OpenWebUI報錯500的原因及解決方法

    docker安裝OpenWebUI報錯500的原因及解決方法

    Open?WebUI是一個可擴(kuò)展、功能豐富且用戶友好的自托管WebUI,旨在完全離線操作,這篇文章主要介紹了docker安裝OpenWebUI報錯500的原因及解決方法,需要的朋友可以參考下
    2025-07-07
  • Dockerfile構(gòu)建Redis鏡像的方法實現(xiàn)(yum方式)

    Dockerfile構(gòu)建Redis鏡像的方法實現(xiàn)(yum方式)

    本文主要介紹了Dockerfile構(gòu)建Redis鏡像的方法實現(xiàn)(yum方式),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Docker如何安裝禪道

    Docker如何安裝禪道

    文章介紹了如何在服務(wù)器上安裝和運行禪道容器,包括查看容器、下載鏡像、安裝禪道、配置網(wǎng)絡(luò)和端口、以及初次登錄和修改密碼的步驟
    2024-11-11
  • Docker網(wǎng)絡(luò)IP地址沖突的解決方法

    Docker網(wǎng)絡(luò)IP地址沖突的解決方法

    本文主要介紹了Docker網(wǎng)絡(luò)IP地址沖突的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 解決Docker容器沒有vim命令的方法

    解決Docker容器沒有vim命令的方法

    這篇文章主要給大家介紹了關(guān)于解決Docker容器沒有vim命令的方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Docker容器具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Docker 中的掛載機(jī)制詳解

    Docker 中的掛載機(jī)制詳解

    Docker 的掛載機(jī)制允許將宿主機(jī)的文件或目錄掛載到 Docker 容器內(nèi)部,這樣容器就可以訪問宿主機(jī)上的文件系統(tǒng),本文給大家介紹Docker 中的掛載機(jī)制,感興趣的朋友跟隨小編一起看看吧
    2024-03-03

最新評論

凌源市| 哈尔滨市| 兴宁市| 陵水| 永年县| 华宁县| 古丈县| 西乡县| 昌邑市| 宣汉县| 兴仁县| 黔南| 新安县| 华亭县| 贺兰县| 崇文区| 濮阳市| 青州市| 通河县| 石景山区| 睢宁县| 密云县| 阿克苏市| 高阳县| 井陉县| 邯郸市| 丁青县| 开阳县| 新沂市| 新和县| 江口县| 木兰县| 从江县| 乐陵市| 曲沃县| 永宁县| 武汉市| 栾城县| 会同县| 温宿县| 辽宁省|