查看原文
其他

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

DotNet 2021-09-23

(给DotNet加星标,提升.Net技能

转自:痴者工良
cnblogs.com/whuanle/p/13832578.html

安装 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)


适合网络不会或者离线安装,有 tgz、deb 、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 管理器,查看集合。



- EOF -



推荐阅读  点击标题可跳转
.NET 5.0 RC2 发布,正式版将在11月发布IdentityServer4 3.1.x 迁移到 4.x如何实现监控手机屏幕?(附源码)


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

好文章,我在看❤️

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存