docker搭建mongodb單節(jié)點(diǎn)副本集的實(shí)現(xiàn)
背景
在開(kāi)發(fā)中,我們很容易通過(guò)docker啟動(dòng)一個(gè)普通的mongodb數(shù)據(jù)庫(kù)服務(wù)。但是有時(shí)候?yàn)榱吮3峙c線上環(huán)境一致,或者為了利用mongodb副本集的某些特性,我們需要在本地部署mongodb副本集。副本集往往需要啟動(dòng)多個(gè)mongodb服務(wù)作為副本集成員,而通常用于開(kāi)發(fā)的筆記本資源比較有限。鑒于此,官方文檔給了解決辦法,可以直接將一個(gè)單節(jié)點(diǎn)mongodb服務(wù)轉(zhuǎn)換為單節(jié)點(diǎn)副本集(standlone replica set)(https://www.mongodb.com/docs/manual/tutorial/convert-standalone-to-replica-set/)
啟動(dòng)步驟
按照官方文檔的說(shuō)明,如果利用docker部署服務(wù),那么依次有如下步驟:
第一步, 假如已經(jīng)存在一個(gè)運(yùn)行中的普通mongodb容器服務(wù)。此時(shí),需要關(guān)閉服務(wù),并通過(guò)指定
--replSet參數(shù)重啟該服務(wù)或者重新啟動(dòng)一個(gè)新的mongodb容器。假如mongodb的服務(wù)名及容器名均為
mongodb_rs,運(yùn)行端口映射為27017:27017,副本集名稱為rs0,數(shù)據(jù)存儲(chǔ)目錄指定為/srv/mongodb/db0,數(shù)據(jù)卷掛載目錄為./data:/srv/mongodb/db0。那么docker-compose.yaml文件可編寫如下:version: "3" services: mongodb_rs: network_mode: bridge container_name: mongodb_rs image: mongo:latest ports: - "27017:27017" restart: always # environment: # MONGO_INITDB_ROOT_USERNAME: username # MONGO_INITDB_ROOT_PASSWORD: pwd command: mongod --port 27017 --replSet rs0 --dbpath /srv/mongodb/db0 volumes: - ./data:/srv/mongodb/db0第二步,執(zhí)行如下命令啟動(dòng)mongodb服務(wù)
docker-compose up -d mongodb_rs
第三步,進(jìn)入容器mongosh,執(zhí)行初始化副本集命令
docker exec -it mongodb_rs mongo
# mongosh rs.initiate() # --- # > rs.initiate() # { # "info2" : "no configuration specified. Using a default configuration for the set", # "me" : "f76081e20602:27017", # "ok" : 1 # } # rs0:SECONDARY> # rs0:PRIMARY>|第四步,退出容器,容器服務(wù)正常運(yùn)行
可能遇到的問(wèn)題
按照上述步驟執(zhí)行后,通常情況下容器服務(wù)可以正常運(yùn)行,應(yīng)用程序可以正常進(jìn)行連接,到這里基本就成功了。以golang代碼測(cè)試:
package main
import (
"context"
"fmt"
"log"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
func main() {
clientOpts := options.Client().ApplyURI("mongodb://localhost:27017/?replicaSet=rs0")
client, err := mongo.Connect(context.TODO(), clientOpts)
if err != nil {
log.Fatal(err)
}
colls, _ := client.Database("admin").ListCollectionNames(context.TODO(), bson.M{})
fmt.Printf("colls: %v\n", colls)
}
// colls: [system.keys system.version]但是有時(shí)候可能會(huì)出現(xiàn)本地程序代碼無(wú)法連接副本集服務(wù),控制臺(tái)會(huì)報(bào)類似連接錯(cuò)誤的問(wèn)題,報(bào)錯(cuò)的原因在于副本集無(wú)法識(shí)別成員host。
在單節(jié)點(diǎn)副本集下,本機(jī)既是主也是從,在容器的mongo shell中可進(jìn)行查看, members只有一個(gè)成員,其name為"f76081e20602:27017", 所以如果你遇到無(wú)法連接或者其他類似錯(cuò)誤,根本原因在于本地啟動(dòng)的這個(gè)副本集無(wú)法識(shí)別f76081e20602這個(gè)host。
rs.status()
---
rs0:PRIMARY> rs.status()
{
"set" : "rs0",
"date" : ISODate("2022-05-06T18:59:21.417Z"),
# ...
"members" : [
{
"_id" : 0,
"name" : "f76081e20602:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1433,
"optime" : {
"ts" : Timestamp(1651863555, 1),
"t" : NumberLong(1)
},
# ...
}
],
# ...
}解決辦法
曾經(jīng)遇到上述問(wèn)題,百度csdn上有多篇內(nèi)容一樣的文章,都說(shuō)這種情況需要將應(yīng)用程序也通過(guò)容器進(jìn)行啟動(dòng),并將應(yīng)用程序與mongdb副本集服務(wù)置于同一個(gè)docker網(wǎng)絡(luò)中,就可以正常連接了。這樣做確實(shí)也可行,但似乎過(guò)于麻煩了,有點(diǎn)走歪路的感覺(jué)。
從上述內(nèi)容已經(jīng)知道是副本集成員host的識(shí)別問(wèn)題,那么在初始化mongodb副本集時(shí),我們可以顯式的去指定成員host,不使用默認(rèn)的副本集配置。具體而言,將啟動(dòng)步驟中的第三步更改為:
進(jìn)入
mongoshdocker exec -it mongodb_rs mongo
自定義配置
# mongosh conf = { _id : "rs0", members: [ { _id: 0, host: "<本機(jī)ip地址>:27017" }, ] }初始化副本集
# mongosh rs.initiate(conf)
如此,通過(guò)指定成員ip,mongo單節(jié)點(diǎn)副本集就可以準(zhǔn)確的識(shí)別到副本集成員,對(duì)于多節(jié)點(diǎn)副本集如果出現(xiàn)連接問(wèn)題,此方法同樣適用。
到此這篇關(guān)于docker搭建mongodb單節(jié)點(diǎn)副本集的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)docker搭建mongodb單節(jié)點(diǎn)副本集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于docker-compose構(gòu)建Mongodb副本集的示例詳解
- 聊聊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 remote api一鍵TLS加密的實(shí)現(xiàn)
本文主要介紹了docker remote api一鍵TLS加密的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
docker文件存放路徑, 獲取容器啟動(dòng)命令操作
這篇文章主要介紹了docker文件存放路徑, 獲取容器啟動(dòng)命令操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
docker部署數(shù)據(jù)可視化平臺(tái)Metabase
Metabase 把數(shù)據(jù)分析常用的查詢通過(guò)一個(gè)個(gè)易于操作的界面呈現(xiàn),本文主要介紹了docker部署數(shù)據(jù)可視化平臺(tái)Metabase,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
Docker一鍵部署SpringBoot項(xiàng)目的多種方式
這篇文章主要介紹了Docker一鍵部署SpringBoot項(xiàng)目的多種方式,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-12-12
解決Mac Docker x509證書(shū)的問(wèn)題
這篇文章主要介紹了解決Mac Docker x509證書(shū)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
使用Docker部署Nacos并配置MySQL數(shù)據(jù)源的詳細(xì)步驟
Nacos是阿里巴巴開(kāi)源的服務(wù)發(fā)現(xiàn)、配置管理和服務(wù)管理平臺(tái),它提供了注冊(cè)中心和配置中心的功能,能夠輕松地管理微服務(wù)的注冊(cè)與發(fā)現(xiàn),以及動(dòng)態(tài)配置的管理,這篇文章主要給大家介紹了關(guān)于使用Docker部署Nacos并配置MySQL數(shù)據(jù)源的超詳細(xì)步驟,需要的朋友可以參考下2024-05-05
詳解Docker容器運(yùn)行多條命令(supervisor)
本篇文章主要介紹了詳解Docker容器運(yùn)行多條命令(supervisor),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Docker compose up -d與Docker restart的區(qū)別
本文主要介紹了Docker compose up -d與Docker restart的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

