MongoDB 是一款 NoSQL 数据,通常用来存储非结构化数据,我们的产品中也有用到,例如:一些文件存储在 MongoDB 的 GridFS 中。
MongoDB 有三种方式来实现高可用:
本文中选择 MongoDB 的副本集的方式来进行演示,副本集相对简单,也能达到高可用的目的,架构图如下:
为了方便,在一台服务器上使用多个容器的方式来进行部署,真实场景下只需要把三个容器分别部署到三台服务器上即可,具体步骤如下:
1、准备一台 CentOS 服务器,安装好 Docker 和 docker-compose 。
2、在 /home 目录创建 mongodb 目录,进入 mongodb 目录创建 data 目录,data 目录中分别创建 mongo1、mongo2、mongo3 用来存放三个节点的数据。
3、使用命令 chmod -R 777 data 给 data 目录设置权限。
4、在 mongodb 目录中创建文件 docker-compose.yml ,用来构建容器,内容如下:
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 27017
5、在 mongodb 目录下执行 docker-compose up -d 进行容器的构建,成功后如下图:
6、随便进入一个 MongoDB 容器,下面命令为进入容器名 mongo1 的容器内部。
docker exec -it mongo1 bash
7、进入容器内部后,输入 mongo 命令进入 MongoDB 的命令行模式,在该模式执行下面的命令进行副本集的初始化:
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、继续在 MongoDB 的命令行模式执行 rs.status() ,这个命令可以查看副本集的状态信息,包括成员、主节点和副本集配置。
9、在 Navicat 中配置连接副本集,如下图:
10、到这里,MongoDB 在 Docker 中部署副本集就已经完成,接下来可以通过一些场景测试下是否能故障自动转移,我验证的场景如下:
11、使用 .NET Core 程序进行验证,创建一个 .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);
}
在高可用部署中,一定要结合实际情况进行权衡后,采取既能解决问题,又驾轻就熟的方案,否则,出现问题,如果不能及时解决,效果还不如单机。
文章题目:高可用:MongoDB容器部署
文章起源:http://www.csdahua.cn/qtweb/news1/424051.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网