.NET Core+MongoDB集群搭建与实战

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: .NET Core+MongoDB集群搭建与实战

安装 MongoDB


安装 MongoDB 网上有很多教程,MongoDB 官方文档:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

笔者这里简单写一下安装过程,笔者使用 ubuntu 系统。

要按照的目标版本:MongoDB 4.4 Community Edition


支持的系统:

  • 20.04 LTS (“Focal”)
  • 18.04 LTS (“Bionic”)
  • 16.04 LTS (“Xenial”)


更新软件源

sudo apt update
sudo apt upgrade


apt 直接安装(方法1)


如果你要安装稳定版本,则直接使用一条命令安装:

sudo apt install mongodb

执行命令检查 MingoDB 的状态:

sudo systemctl status mongodb


apt 仓库安装(方法2)


此种方式可以让你安装最新版本的 MongoDB 。

导入包管理系统使用的公钥

wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -

添加 MongoDB 的仓库源文件

/etc/apt/sources.list.d/mongodb-org-4.4.list

添加 MongoDB 的仓库源地址

# ubuntu 16.04
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
# ubuntu 18.04
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
# ubuntu 20.04
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

加载 MongoDB 的软件包

sudo apt-get update

安装最新稳定版本的 MongoDB

sudo apt-get install -y mongodb-org

如果你想安装指定版本:

sudo apt-get install -y mongodb-org=4.4.1 mongodb-org-server=4.4.1 mongodb-org-shell=4.4.1 mongodb-org-mongos=4.4.1 mongodb-org-tools=4.4.1


方法1、2启动 MongoDB


执行命令检查 MongoDB 的状态

sudo systemctl status mongodb

启动 MongoDB

sudo systemctl start mongod

开机启动 MongoDB

sudo systemctl enable mongod

查看 MongoDB 版本

mongo --version
mongod --version


注意:由于 Linux/Unix 系统会对文件描述符的数量或者线程数量加以限制,如果安装过程或者启动时报错,需要自行另外查找方法解决,这里不再赘述。


通过二进制包安装(方法3)


适合网络不会或者离线安装,有 tgzdebsource code 等方法安装,这里只使用 tgz 方式。


安装依赖

# ubuntu 16.04
sudo apt-get install libcurl3 openssl liblzma5
# ubuntu 18.04 & 20.04
sudo apt-get install libcurl4 openssl liblzma5


选择合适的系统下载二进制包

https://www.mongodb.com/try/download/community?tck=docs_server

Package 可以选择包的形式,如 shell(deb)、shell(tgz)。


注意,要在服务器下载的话,就不要点击 Download,而是点击 Copy Link 复制二进制包的下载链接。


请注意下载的软件版本,mongos 、tagz 包含全部功能;

其它的是单独提供 server 或者 client(shell) 功能。

本小节将提供安装 .deb 和 tgz 包的说明,请自行选择要安装的包!(建议直接下载 tgz)。

微信图片_20220504114732.png


deb 安装 MongoDB

如果下载了 .deb 文件,请使用下面命令安装。

wget {下载地址}
sudo dpkg -i {软件包名}.deb


tgz 安装 MongoDB

如果下载了 .tar.gz 文件,请使用下面命令安装。

tar -zxvf mongodb-{版本}.tgz
# 下面是示例
cd mongodb-linux-x86_64-ubuntu1604-4.4.1
... ...
|-- bin
|   `-- mongo
|-- LICENSE-Community.txt
|-- MPL-2
|-- README
`-- THIRD-PARTY-NOTICES


打开解压的目录,执行:

sudo cp bin/* /usr/local/bin/
# 实际上就是将二进制可执行文件放到 bin 目录


启动 MongoDB

创建数据存放目录

sudo mkdir -p /var/lib/mongo


创建日志存放目录:

sudo mkdir -p /var/log/mongodb


如果不是使用 root 用户登录,则需要获取文件权限:

# whoami是你的用户名
sudo chown `whoami` /var/lib/mongo
sudo chown `whoami` /var/log/mongodb


运行 MongoDB:

mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork


之后终端会提示已经成功启动;也可以查看 /var/log/mongodb/mongod.log 日志文件中的内容确定 MongoDB 的运行情况;

cat /var/log/mongodb/mongod.log 日志文件,会发现第一行:

pid=22639 port=27017


port 即 MongoDB 的连接端口。


卸载方法


apt 卸载方法

适合使用 镜像仓库安装的 MongoDB。

sudo apt-get purge mongodb mongodb-clients mongodb-server mongodb-dev
sudo apt-get purge mongodb-10gen
sudo apt-get autoremove

注:执行过程报错不用管。


tgz 卸载方法

适合卸载使用 .tar.gz 安装的包。

rm /usr/local/bin/mongo*


指定启动的配置


通过配置文件

如果前面提到过配置文件 /etc/mongod.conf,如果通过配置文件启动,则会方便很多,使用配置文件启动 MongoDB 的方法:

mongod --config /etc/mongod.conf


通过参数

通过参数启动 MongoDB 的话,每次启动都比较麻烦:

mongod  --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork


MongoDB 绑定IP、端口


查看 MongoDB 配置:

# 进入 shell
mongo
# 执行
use admin
db.runCommand( { getParameter : '*' } )


默认 MongoDB 是本地服务,外界无法访问主机的 MongoDB 服务,这里来配置一下,使其能够被外网访问。


在 MongoDB 启动后,执行以下命令修改配置。

# 绑定所有地址
mongod --bind_ip_all
# 修改端口
mongod --port 27017


或者停了 MongoDB 服务后,使用以下命令启动:

mongod  --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork


或者手动修改 /etc/mongod.conf 配置文件,把其中一段改成 0.0.0.0

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0

修改完毕后,需要关闭 MongoDB,再开启,请参考后面 ”停止 MongoDB“ 一节。


测试远程 IP 连接

测试连接指定 IP 和 port 的 MongoDB 服务:

mongo {你的服务器公网IP}:27017


加上密码验证


设置账号密码

mongo
# 进入 MongoDB shell 后
use admin
db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]})

如果不生效,请自行找方法解决,这里不再赘述~


开启登录验证

然后打开 /etc/mongod.conf 文件,将 #security: 改成:

security:
  authorization: enabled

如果不生效,请自行找方法解决,这里不再赘述~


停止 MongoDB


mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown


搭建集群


按照此方法,再炮制一台服务器就行。

建议使用 docker 一次性搞好,自己手动在物理机上面安装,太折腾了。

接下来,我们要根据官方文档,搭建简单的副本集群。

官方文档地址:https://docs.mongodb.com/manual/replication/


副本集

副本集是一组 MongoDB 实例来维护相同数据集。

官网文档解释:一个副本集包含多个数据承载节点和一个仲裁器节点(可选)。在数据承载节点中,只有一个成员被视为主要节点,而其他节点则被视为次要节点。

用一下官方的图:

微信图片_20220504114738.png


故障转移

图中有三台 MongoDB 实例,当 Primary 挂了后,Secondary 可以换掉挂了的服务器,成为新的 Primary。

微信图片_20220504114742.png

由于我只有两台服务器,因此只能组双机热备。


方案


主节点(Primary)

对外接收所有请求,然后将修改同步到所有 Secondary 中。

当 主节点(Primary) 挂了后,其它 Secondary 或者 Arbiter 节点就会重新选举一个主节点出来。


副本节点(Secondary)

副本节点是备胎,数据集跟主节点(Primary)一致,当主节点挂了后,有机会成为正胎(Primary)。


仲裁者(Arbiter)

不保存数据集,也不能成为(Primary)。作用是当主节点挂了后,投票给 Secondary,让 Secondary 成为 Primary。

但是怎么配置原有的 MongoDB 实例,使其成为 Primary - Secondary 集群呢?Google 了很久。

找到 MongoDB 官方的文档:

https://docs.mongodb.com/manual/tutorial/deploy-replica-set/


设计实例名称


在 primary 机器和 secondary 机器上,分别打开 /etc/mongod.conf 文件,找到 #replication,设置节点名称。

replication:
  replSetName: {名称}

primary 机器设置 primary,secondary 机器设置 beitai


replSetName 的作用解释如下:

https://docs.mongodb.com/manual/reference/configuration-options/#replication.replSetName


也可以在启动 MongoDB 时加上 --replSet "beitai" 的参数。

mongod --replSet "beitai" ... ...


请停止 MongoDB 后,使用长命令的方法启动 MongoDB

请在要设置为 Primary 的机器,执行:

mongod --replSet "primary" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork


请在要设置为 Secondary 的机器,执行:

mongod --replSet "beitai" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork


如何创建集群


必须要做到以下两点配置:

  • Add Members to a Replica Set
  • Deploy a Replica Set


笔者在这里踩了很大的坑,试了很多种方法和配置才成功。


启动两个实例(配置)


提前说明,如果使用 rs. 指令配置实例,想重新配置,出现 ”"errmsg" : "already initialized"“,可以使用 rs.reconfig() 清除配置。

rsconf = rs.conf()
rsconf.members = [{_id: 1, host: "本机的ip:27017"}]
rs.reconfig(rsconf, {force: true})


在 Secondary 机器,执行命令停止运行:

mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown


重新启动 Secondary 机器:

mongod --replSet "beitai" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork


设置为 Secondary 节点:

rs.initiate(
   {
      _id: "beitai",
      version: 1,
      members: [
         { _id: 0, host : "primary的ip:27017" }
         { _id: 1, host : "secondary的ip:27017" }
      ]
   }
)


注:id是优先级。

在 primary 机器,执行命令停止运行:

mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown


重新启动 primary:

mongod --replSet "beitai" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork


在 primary 进入 shell:

mongo


执行命令进行初始化并设置自己为 primary:

rs.initiate(
   {
      _id: "primary",
      version: 1,
      members: [
         { _id: 0, host : "primary的ip:27017" },
         { _id: 1, host : "secondary的ip:27017" }
      ]
   }
)


分别在两个实例打开 mongo shell,执行:

rs.status()


发现:

beitai:SECONDARY> 
...
primary:PRIMARY>


使用工具连接 MongoDB 并创建一个名为 Test 的数据库:

微信图片_20220504115046.png


副本集状态查看


查看复制延迟:

rs.printSlaveReplicationInfo()


执行结果:

WARNING: printSlaveReplicationInfo is deprecated and may be removed in the next major release. Please use printSecondaryReplicationInfo instead.
source: *.*.*.*:27017
  syncedTo: Sat Oct 17 2020 20:02:49 GMT+0800 (CST)
  0 secs (0 hrs) behind the freshest member (no primary available at the moment)
source: *.*.*.*:27017
  syncedTo: Thu Jan 01 1970 08:00:00 GMT+0800 (CST)
  1602936169 secs (445260.05 hrs) behind the freshest member (no primary available at the moment)


.NET Core 连接 MongoDB


.NET 程序要连接 MongoDB ,需要通过 Nuget 包安装 MongoDB.Driver 驱动。

我们来创建一个控制台程序,Nuget 搜索 MongoDB.Driver 并安装,接下来一步步使用连接 MongoDB。


文档地址:https://mongodb.github.io/mongo-csharp-driver/2.10/getting_started/


添加 using 引用:

using MongoDB.Bson;
using MongoDB.Driver;


连接 MongoDB

var client = new MongoClient("mongodb://primary的ip:27017,secondary的ip:27017");


获取数据库

IMongoDatabase database = client.GetDatabase("Test");


获取文档集合

var collection = database.GetCollection<BsonDocument>("MyCollection");


插入文档(json)

var document = new BsonDocument
            {
                { "name", "MongoDB" },
                { "type", "Database" },
                { "count", 1 },
                { "info", new BsonDocument
                {
                    { "x", 203 },
                    { "y", 102 }
                }}
            };


其源结构的 json 如下:

{
     "name": "MongoDB",
     "type": "database",
     "count": 1,
     "info": {
         x: 203,
         y: 102
     }
}


将文档插入到集合中:

collection.InsertOne(document);
            // 使用异步 await collection.InsertOneAsync(document);

然后执行程序,一会儿后,打开 MongoDB 管理器,查看集合。

微信图片_20220504115051.gif

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
10天前
|
开发框架 .NET 开发者
简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:&lt;https://github.com/khellang/Scrutor&gt;
32 5
|
2月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
28天前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
38 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
18天前
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
24 3
|
1月前
|
消息中间件 开发框架 .NET
.NET 8 强大功能 IHostedService 与 BackgroundService 实战
【11月更文挑战第7天】本文介绍了 ASP.NET Core 中的 `IHostedService` 和 `BackgroundService` 接口及其用途。`IHostedService` 定义了 `StartAsync` 和 `StopAsync` 方法,用于在应用启动和停止时执行异步操作,适用于资源初始化和清理等任务。`BackgroundService` 是 `IHostedService` 的抽象实现,简化了后台任务的编写,通过 `ExecuteAsync` 方法实现长时间运行的任务逻辑。文章还提供了创建和注册这两个服务的实战步骤,帮助开发者在实际项目中应用这些功能。
|
2月前
|
开发框架 NoSQL MongoDB
C#/.NET/.NET Core开发实战教程集合
C#/.NET/.NET Core开发实战教程集合
|
3月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
3月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
111 3
|
2月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
3月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
下一篇
DataWorks