掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
MongoDB 是一款 NoSQL 數(shù)據(jù),通常用來存儲非結(jié)構(gòu)化數(shù)據(jù),我們的產(chǎn)品中也有用到,例如:一些文件存儲在 MongoDB 的 GridFS 中。

MongoDB 有三種方式來實現(xiàn)高可用:
本文中選擇 MongoDB 的副本集的方式來進(jìn)行演示,副本集相對簡單,也能達(dá)到高可用的目的,架構(gòu)圖如下:
為了方便,在一臺服務(wù)器上使用多個容器的方式來進(jìn)行部署,真實場景下只需要把三個容器分別部署到三臺服務(wù)器上即可,具體步驟如下:
1、準(zhǔn)備一臺 CentOS 服務(wù)器,安裝好 Docker 和 docker-compose 。
2、在 /home 目錄創(chuàng)建 mongodb 目錄,進(jìn)入 mongodb 目錄創(chuàng)建 data 目錄,data 目錄中分別創(chuàng)建 mongo1、mongo2、mongo3 用來存放三個節(jié)點的數(shù)據(jù)。
3、使用命令 chmod -R 777 data 給 data 目錄設(shè)置權(quán)限。
4、在 mongodb 目錄中創(chuàng)建文件 docker-compose.yml ,用來構(gòu)建容器,內(nèi)容如下:
version: '3'
services:
mongo1:
image: mongo:5.0
container_name: mongo1
restart: always
ports:
- "27017:27017"
volumes:
- ./data/mongo1:/data/db
command: mongod --replSet rs0 --bind_ip_all --port 27017
mongo2:
image: mongo:5.0
container_name: mongo2
restart: always
ports:
- "27018:27017"
volumes:
- ./data/mongo2:/data/db
command: mongod --replSet rs0 --bind_ip_all --port 27017
mongo3:
image: mongo:5.0
container_name: mongo3
restart: always
ports:
- "27019:27017"
volumes:
- ./data/mongo3:/data/db
command: mongod --replSet rs0 --bind_ip_all --port 270175、在 mongodb 目錄下執(zhí)行 docker-compose up -d 進(jìn)行容器的構(gòu)建,成功后如下圖:
6、隨便進(jìn)入一個 MongoDB 容器,下面命令為進(jìn)入容器名 mongo1 的容器內(nèi)部。
docker exec -it mongo1 bash7、進(jìn)入容器內(nèi)部后,輸入 mongo 命令進(jìn)入 MongoDB 的命令行模式,在該模式執(zhí)行下面的命令進(jìn)行副本集的初始化:
rs.initiate({_id: "rs0", members: [
{_id: 0, host: "10.211.55.3:27017"},
{_id: 1, host: "10.211.55.3:27017"},
{_id: 2, host: "10.211.55.3:27017"}
]})8、繼續(xù)在 MongoDB 的命令行模式執(zhí)行 rs.status() ,這個命令可以查看副本集的狀態(tài)信息,包括成員、主節(jié)點和副本集配置。
9、在 Navicat 中配置連接副本集,如下圖:
10、到這里,MongoDB 在 Docker 中部署副本集就已經(jīng)完成,接下來可以通過一些場景測試下是否能故障自動轉(zhuǎn)移,我驗證的場景如下:
11、使用 .NET Core 程序進(jìn)行驗證,創(chuàng)建一個 .NET 6 的控制臺程序,引用 NuGet 包 MongoDB.Driver 。
12、Program 類的代碼如下:
using MongoDB.Bson;
using MongoDB.Driver;
var mongoConnectionString = "mongodb://10.211.55.3:27017,10.211.55.3:27018,10.211.55.3:27019/test?replicaSet=rs0&readPreference=primary";
var mongoClient = new MongoClient(mongoConnectionString);
var database = mongoClient.GetDatabase("test");
var collection = database.GetCollection("test");
// 插入一條文檔
var document = new BsonDocument { { "name", "oec2003" }, { "age", 30 } };
collection.InsertOne(document);
var documents = await collection.Find(Builders.Filter.Empty).ToListAsync();
foreach (var doc in documents)
{
Console.WriteLine(doc);
} 在高可用部署中,一定要結(jié)合實際情況進(jìn)行權(quán)衡后,采取既能解決問題,又駕輕就熟的方案,否則,出現(xiàn)問題,如果不能及時解決,效果還不如單機(jī)。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流