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

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集群搭建与实战的更多相关文章

  1. mongodb集群搭建过程记录

    mongodb集群搭建花费比较长的时间,在此记录下过程,方便以后使用 一 软件环境 系统:ubuntu 18.04,mongodb 社区版4.2 https://docs.mongodb.com/ma ...

  2. Mongodb 集群搭建以及常见错误

    Mongodb 集群搭建以及常见错误 1 关于Replica Sets +Sharding(主从复制加分片)搭建,不这详细去说,网上有很多,大部分的例子就三台服务器之间做主从复制,分2个shard,架 ...

  3. MongoDB集群搭建-副本集

    MongoDB集群搭建-副本集 概念性的知识,可以参考本人博客地址: 一.Master-Slave方案: 主从: 二.Replica Set方案: 副本集: 步骤:(只要按步骤操作,100%成功) 1 ...

  4. Mongodb集群搭建之 Replica Set

    Mongodb集群搭建之 Replica Set Replica Set 中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的.其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了, ...

  5. MongoDB集群搭建-分片

    MongoDB集群搭建-分片 一.场景: 1,机器的磁盘不够用了.使用分片解决磁盘空间的问题. 2,单个mongod已经不能满足写数据的性能要求.通过分片让写压力分散到各个分片上面,使用分片服务器自身 ...

  6. Mongodb集群搭建的三种方式

    转自:http://blog.csdn.net/luonanqin/article/details/8497860 MongoDB是时下流行的NoSql数据库,它的存储方式是文档式存储,并不是Key- ...

  7. Mongodb集群搭建

    搭建高可用Mongodb集群 http://www.lanceyan.com/category/tech/mongodb/page/2 再看MongoDB副本集  http://blog.itpub. ...

  8. Mongodb集群搭建之 Sharding+ Replica Sets集群架构(2)

    参考http://blog.51cto.com/kaliarch/2047358 一.概述 1.1 背景 为解决mongodb在replica set每个从节点上面的数据库均是对数据库的全量拷贝,从节 ...

  9. windows下mongodb集群搭建

    本文介绍在windows环境下如何搭建一个高可用性的mongodb集群.系统环境为win7,mongodb版本为3.6.3. 本文采用的是分片+副本集的方式搭建集群,将分别介绍如何使用副本集和分片来提 ...

  10. mongodb集群搭建(分片+副本)

    原文地址:https://www.cnblogs.com/ityouknow/p/7344005.html 相关概念 先来看一张图: 从图中可以看到有四个组件:mongos.config server ...

随机推荐

  1. Linux Daemon进程

    模型 创建孤儿进程 fork() 创建新的会话 setid() 改变当前目录为根目录chdir() 重设文件权限掩码umask() 关闭文件描述符close() 创建孤儿进程 创建孤儿进程只需要将父进 ...

  2. android 图片叠加效果——两种方法

    效果图: 第一种: 第二种: 第一种是通过canvas画出来的效果: public void first(View v) { // 防止出现Immutable bitmap passed to Can ...

  3. JavaScript 闭包详解

    一.Javascript闭包的用途 事实上,通过使用闭包,我们可以做很多事情.比如模拟面向对象的代码风格:更优雅,更简洁的表达出代码:在某些方面提升代码的执行效率. 1.匿名自执行函数 我们知道所有的 ...

  4. Spark connect to Database

    Cannect to Cassandra: 用spark-cassandra-connector, 注意spark,cassandra和connector的版本要配套,Cassandra至少要版本2以 ...

  5. 怎么在html页面和js里判断是否是IE浏览器

    HTML里: HTML代码中,在编写网页代码时,各种浏览器的兼容性是个必须考虑的问题,有些时候无法找到适合所有浏览器的写法,就只能写根据浏览器种类区别的代码,这时就要用到判断代码了.在HTML代码中, ...

  6. thinkphp excel txt文件上传实现

    <?php/************************************************************************************** ***  ...

  7. strlen源码剖析

      学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++ Runtime Library)作为底层的函数库,实现必然高效.恰好手中就有glibc和VC的CRT源代码,于是挑了一个相对简 ...

  8. Plupload上传插件自定义图片的修改

    若自定义的一个上传图片效果,代码(可能不全),当用户再次点击所有或任意一个上传图片的input时,uploader.files已经多了客户再次上传的图片,但是你就想要最后的两张图片,这就可以使用到up ...

  9. 基于TCP 协议的RPC

    前言: 环境: windown 10 Eclipse JDK 1.8 RPC的概念: RPC 是远程过程调用,是分布式网站的基础. 实验 SayHelloService.java 接口类,用于规范 S ...

  10. base | Tread类

    Tread类 Linux中,每个进程有一个pid,类型pid_t,由getpid()取得.Linux下的POSIX线程也有一个id,类型 pthread_t,由pthread_self()取得,该id ...