.Net Core中使用MongoDB搭建集群与项目实战

目录
  • 安装MongoDB
    • apt直接安装(方法1)
    • apt仓库安装(方法2)
    • 方法1、2启动MongoDB
    • 通过二进制包安装(方法3)
      • 安装依赖
      • deb安装MongoDB
      • tgz安装MongoDB
      • 启动MongoDB
    • 卸载方法
      • apt卸载方法
      • tgz卸载方法
    • 指定启动的配置
      • 通过配置文件
      • 通过参数
    • MongoDB绑定IP、端口
      • 测试远程IP连接
    • 加上密码验证
      • 设置账号密码
      • 开启登录验证
    • 停止MongoDB
  • 搭建集群
    • 副本集
    • 故障转移
    • 方案
    • 设计实例名称
    • 如何创建集群
    • 启动两个实例(配置)
    • 副本集状态查看
  • .NETCore连接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)

适合网络不会或者离线安装,有 tgzdeb 、source 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)。

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 实例来维护相同数据集。

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

用一下官方的图:

故障转移

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

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

方案

主节点(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 的数据库:

副本集状态查看

查看复制延迟:

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 管理器,查看集合。

到此这篇关于.Net Core中使用MongoDB搭建集群与项目实战的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • .net Core连接MongoDB数据库的步骤详解

    前言 前两天在学习MongoDB相关的知识,做了个小Demo,做的是省份下面有多少所学校,嗯,做的比较粗暴... 我们在MongoDB的官方文档中看到,MongoDb的2.4以上的For .Net的驱动是支持.Net Core 2.0的. 所以,在我们安装好了MangoDB后,就可以开始MangoDB的.Net之旅了. 方法如下: 连接MongoDB首先要通过Nuget添加一个MongoDB的包,下载此包 安装完毕后开始写代码了,创建一个省份实体,一个学校实体 using MongoDB.Bso

  • MongoDB数据库介绍并用.NET Core对其进行编码

    浅入 MongoDB MonogoDB 是什么 MongoDB 是 NoSQL 型数据库,主要特征是存储结构化数据,MongoDB 是基于分布式文件存储的开源数据库系统. 结构化数据 以往我们使用 Mysql.SqlServer 等数据库,数据都是一条条的.MongoDB 的结构化数据正是区别于这种列-行式的数据. 结构化数据具有层级关系: 例如: { name: "MongoDB", type: "database", count: 1, info: { x: 2

  • .Net Core使用MongoDB的详细教程

    前言 MongoDB 是由C++语言编写的,是一个基于分布式且面向文档存储的开源数据库系统. 下载地址: https://www.mongodb.com/download-center/community 在.Net Core中使用需要引入核心包 MongoDB.Driver 添加数据: //与Mongodb建立连接 MongoClient client = new MongoClient("mongodb://127.0.0.1"); //获得数据库,没有则自动创建 IMongoDa

  • asp.net core集成MongoDB的完整步骤

    一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net core项目中,当然此篇文章中没有讲解mongodb的集群部署,等有机会分享一下. 首先,我们在MongoDB的官方文档中看到,MongoDb的2.4以上的For .Net的驱动是支持.Net Core 2.0的. 针对MongoDB,我想大家应该不陌生,没有用过也有听过. 1.mongodb是什么? MongoDB是一个基于分布式文件存储的数据库,为web应用提供

  • .Net Core如何对MongoDB执行多条件查询

    以前项目基本上全部使用MySQL数据库, 最近项目排期空出了一点时间leader决定把日志模块迁移到插入/查询性能更好的MongoDB上. 多条件查询的写法着实费了些功夫, 撰文记录一下. 一.准备工作 1. 安装过程, 不赘述了 2. 添加ReferencePackage dotnet add package mongodb.bson dotnet add package mongodb.driver 3. appsetting.json添加连接配置 "MongodbHost": {

  • .Net Core中使用MongoDB搭建集群与项目实战

    目录 安装MongoDB apt直接安装(方法1) apt仓库安装(方法2) 方法1.2启动MongoDB 通过二进制包安装(方法3) 安装依赖 deb安装MongoDB tgz安装MongoDB 启动MongoDB 卸载方法 apt卸载方法 tgz卸载方法 指定启动的配置 通过配置文件 通过参数 MongoDB绑定IP.端口 测试远程IP连接 加上密码验证 设置账号密码 开启登录验证 停止MongoDB 搭建集群 副本集 故障转移 方案 设计实例名称 如何创建集群 启动两个实例(配置) 副本集

  • .Net Core服务治理Consul搭建集群

    延续上一篇的话题继续,顺便放上一篇的传送门:点这里. 集群的必要性 consul本身就是管理集群的,现在还需要给consul搞个集群,这是为啥?因为consul单点也容易挂啊!万一管理集群的consul挂掉了,那么相当于上下游应用都变成了瞎子,看不到也调不到.所以集群的必要性不用我说了吧? Server & Client 生产环境下,可以选择上面两种模式,下面我就简称S端.C端.说说它俩有啥不一样: S端: 1.数量不宜过多,一般推荐3.5个,要求是奇数. 2.持久化保存节点数据. 3.多个S端

  • Docker 搭建集群MongoDB的实现步骤

    前言 由于公司业务需要,我们打算自己搭建 MongoDB 的服务,因为 MongoDB 的云数据库好贵,我们这次采用副本集的方式来搭建集群,三台服务器,一主.一副.一仲裁 基本概念 Replica Set 副本集:一个副本集就是一组 MongoDB 实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成 主节点(master):主节点接收所有写入操作.主节点将对其数据集所做的所有更改记录到其 oplog. 副节点(secondary):复制主节点的 oplog

  • Redis6搭建集群并在SpringBoot中使用RedisTemplate的实现

    目录 原理 搭建集群 SpringBoot中使用RedisTemplate 原理 Redis Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主节点,三个为从节点.三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点. 如上图所示,该集群中包含6个Redis节点3个主服务器3个从服务器,分别为M1,M2,M3,S1,S2,S3.除了主从 Redis 节点之间进行数据复制外,所有 Redis 节点之间采用 Gossip

  • 深入了解MongoDB 分布式集群

    在分布式应用系统中,mongodb 已经成为 NoSQL 经典数据库.要想很好的使用 mongodb,仅仅知道如何使用它是不够的.只有对其架构原理等有了充分认识,才能在实际运用中使其更好地服务于应用,遇到问题知道怎么处理,而不是抓瞎抹黑.这篇文章就带你进入 mongodb 集群的大门. 集群概览 mongodb 相关的进程分为三类: mongo 进程 – 该进程是 mongodb 提供的 shell 客户端进程,通过该客户端可以发送命令并操作集群: mongos 进程 – mongodb 的路由

  • 分布式文档存储数据库之MongoDB分片集群的问题

    前文我们聊到了mongodb的副本集以及配置副本集,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13953598.html:今天我们来聊下mongodb的分片: 1.什么是分片?为什么要分片? 我们知道数据库服务器一般出现瓶颈是在磁盘io上,或者高并发网络io,又或者单台server的cpu.内存等等一系列原因:于是,为了解决这些瓶颈问题,我们就必须扩展服务器性能:通常扩展服务器有向上扩展和向外扩展:所谓向上扩展就是给服务器加更大的磁盘,使用更大更好的内

  • 用apache和tomcat搭建集群(负载均衡)

    一.集群和负载均衡的概念 (一)集群的概念 集群(Cluster)是由两台或多台节点机(服务器)构成的一种松散耦合的计算节点集合,为用户提供网络服务或应用程序(包括数据库.Web服务和文件服务等)的单一客户视图,同时提供接近容错机的故障恢复能力.集群系统一般通过两台或多台节点服务器系统通过相应的硬件及软件互连,每个群集节点都是运行其自己进程的独立服务器.这些进程可以彼此通信,对网络客户机来说就像是形成了一个单一系统,协同起来向用户提供应用程序.系统资源和数据.除了作为单一系统提供服务,集群系统还

  • MongoDB分片集群部署详解

     一.环境说明 1.我们prod环境MongoDB的集群架构是做的分片集群的部署,但是目前我们没有分片,即所有数据都在一个分片上,后期如果数量大,需要分配,集群随时可以分片,对业务方透明 2.各个角色的部署情况 角色 IP 端口 复制集名称 mongos 172.21.244.101,172.21.244.102,172.21.244.94 27000 无 config server 172.21.244.101,172.21.244.102,172.21.244.94 27100 repl_c

  • 玩转Redis搭建集群之Sentinel详解

    前言 Redis作为内存数据库,需要具备高可用的特点,不然如果服务器宕机,还在内存里的数据就会丢失.我们最常用的高可用方法就是搭建集群,master机器挂了,可以让slave机器顶上,继续提供服务.但是Redis集群是不会自动进行主从切换的,也就是说,如果主节点非常不争气的在凌晨3点挂了,那么运维同学就要马上起床,把从节点改成主节点,这样的操作是非常繁琐低效的.为此,Redis官方提供了一种解决方案:Redis Sentinel 简介 Redis Sentinel集群通常由3到5个节点组成,如果

  • Apache及Tomcat搭建集群环境过程解析

    其实Apache把集群搭建起来并不麻烦,我这里也是从网上找了一些资料自己配置出来的,当然有一些参数需要自己设置下,做到最优 搭建集群首先是下载软件,因为公司这边的服务器是Win2003的,所以也节俭了一些操作: Apache下载地址:http://httpd.apache.org/ 我下载的是Apache httpd 2.2.27 Released Tomcat 下载地址:http://tomcat.apache.org/download-60.cgi 我下载的是6.0.39的解压版 首先是配置

随机推荐