
自建 MongoDB 实践:MongoDB 的安装及基本使用
接下来的一些列文章会为大家介绍日常工作中常用的 NoSQL 产品 MongoDB。主要涉及到:
1、MongoDB 的安装及基本使用
2、MongoDB 文档查询
3、MongoDB 复制集的介绍及搭建
4、MongoDB 分片集群的介绍及搭建
5、MongoDB 的备份及恢复
6、MongoDB 安全加密
7、MongoDB Change Stream 功能介绍及代码演示
8、MongoDB 其他
我们会用八篇文章近五万字来阐述 MongoDB 运维相关的日常实战事宜。您当前看到的是系列文章的第一篇:《MongoDB 的安装及基本使用》。
闲篇
在进入正题前,我们先自问自答一下为什么要自建 MongoDB?如果不自建则使用公有云厂商提供的 SaaS 版,其费用会怎样呢?我们这里以阿里云为例。首先看下SaaS 版(分片集群所需要的配置)的费用问题。
那么上述配置的费用为:96.316 * 24 * 365 = 843728.16
元。如果觉得上述配置比较高,可以考虑降低一些配置,那么费用如下图所示:
那么上述配置的费用为:58.774 * 24 * 365 = 514860.24
元。
可以看到,如果对数据安全性要求比较高,使用分片集群的话,每年的费用至少是 50 ~ 80 万元。如果不差钱到无所谓,如果预算有限,项目上还必须要使用的话,就必须要自己来搭建维护了。
文档
MongoDB 将数据记录存储为 BSON 文档。BSON 是 JSON 文档的二进制表示形式,尽管它包含的数据类型比 JSON 多。有关 BSON 规范,请参阅 bsonspec.org(http://bsonspec.org/)。另请参阅 BSON
MongoDB 将 BSON 文档(即数据记录)存储在集合中;将集合存储在数据库中。文档是 MongoDB 的核心概念。多个键及其关联的值有序地放置在一起便是文档。
· 文档中的键/值对是有序的。
· 文档中的值不仅可以是在双引号里面的字符串,还可以是其它几种数据类型。
· 文档的键是字符串。除了少数例外情况,键可以是任意 UTF8 字符。
· 键不能含有 \0(空字符)。这个字符用来表示键的结尾。
· 和 $ 有特别的意义,只有在特定环境下才能使用。
· 以下划线 _ 开头的键是保留的,虽然这个并不是严格要求的。
MongoDB 不但区分类型,也区分大小写。MongoDB 的文档不能有重复的键。
集合
集合就是一组文档。如果说 MongoDB 中的文档类似于关系型数据库中的行,那么集合就如同表。
数据库
MongoDB 中多个文档组成集合,同样多个集合可以组成数据库。一个 MongoDB 实例可以承载多个数据库,它们之间可视为完全独立的。每个数据库都有独立的权限控制,即便是在磁盘上,不同的数据库也放置在不同的文件中。
与关系型数据库的对比
与关系型数据库的区别:
总结一下 MongoDB 与 RDBMS 的区别:
· 数据库及索引 (类似 SQL 的数据库)
· 集合 (类似 SQL 的表)
· 文档 (类似 SQL 的行)
· 字段 (类似 SQL 的列)
· 嵌入及关联的文档 (类似 SQL 的连接(join))
一些更具体的对比如下表格:
MongoDB 的特点及使用场景
一些关键特征如下:
- 它是一个通用数据库:与为特定目的构建的其他 NoSQL 数据库(例如图形数据库)不同,MongoDB 可以在应用程序中提供异构负载和多种用途。在 4.0 版本还引入多文档 ACID 事务。
- 灵活的模式设计:具有可以随时修改的非定义属性的面向文档的方法是 MongoDB 和关系数据库之间的关键对比。
- 轻松实现高可用性:在我们可用性为五个九的时代,这必须是理所当然的。再加上检测到服务器故障时的自动故障转移,这有助于实现高正常运行时间。
- 功能丰富:提供全方位的SQL 等效运算符,以及 MapReduce、聚合框架、Time to Live 和上限集合以及二级索引等功能,无论需求多么多样化,MongoDB 都可以适应许多用例。
- 可扩展性和负载平衡:它是为垂直和(主要是)水平缩放而构建的。使用分片,架构师可以在不同实例之间共享负载,并实现读写可扩展性。数据平衡通过碎片均衡器自动进行(对用户透明)。
- 聚合框架:在数据库中内置 ETL 框架意味着开发人员可以在数据离开数据库之前执行大部分 ETL 逻辑,在许多情况下,无需复杂的数据管道。
- 原生复制:数据将在副本集中复制,而无需复杂的设置。
- 安全功能:将身份验证和授权都考虑在内,以便架构师可以保护他们的 MongoDB 实例。
- 用于存储和传输文档的JSON(BSON和二进制JSON)对象:JSON 在网络上广泛用于前端和 API 通信,因此,当数据库使用相同的协议时会更容易。
- MapReduce:尽管 MapReduce 引擎不如专用框架先进,但它仍然是构建数据管道的绝佳工具。
- 多文档ACID事务:从 4.0 版本开始,MongoDB 支持跨多个文档的 ACID 事务。
- 成熟工具:MongoDB 的工具已发展到支持从 DBaaS 到 Sync、Mobile 和无服务器(Stitch)。
其许多最成功的用例集中在以下领域:
· 整合简洁数据,提供单一视图
· IoT 物联网
· 移动应用程序
· 实时分析
· 个性化
· 目录管理
· 内容管理
安装
版本选择
通常情况下,我们应该选择偶数版本(如:4.2)。奇数版本(如:4.3)是开发版本,不适合在生产环境中使用。目前,MongoDB 已经发展到了 6.0 版本。但从公有云厂商提供的版本(3.4、4.0、4.2)来看,4.x 版本依然是主流。因此,我们这里选择了最新的 4.4 版本。
环境准备
我们这里选择 CentOS 7.9 作为接下来所有的演示操作,当然我们也可以选择其他发行版。
系统设置
上述是临时性的设置,系统重启就会失效。永久性设置:
由于 /etc/rc.d/rc.local
文件默认没有可执行权限,需要增加可执行权限,那么在下次开机时它会自动执行。如下:
开始安装
可以参考官方安装文档:https://www.mongodb.com/docs/v4.4/administration/install-on-linux/,写的非常详细,里面包含了各种 Gnu/Linux 发行版的安装方式。
yum 方式安装
创建 /etc/yum.repos.d/mongodb-org-4.4.repo
文件,这样我们就可以通过 yum
命令进行安装 MongoDB:
接着进行安装:
安装完毕,查看已经安装的软件包:
MongoDB 社区版包含以下软件包:
通过 YUM 方式安装的 MongoDB,其会自动创建如下两个目录:
-
/var/lib/mongo
(数据目录) -
/var/log/mongodb
(日志目录)
而且会使用 mongod
用户运行 MongoDB。接下来启动服务:
安装及启动完毕,我们就可以进入 MongoDB 的命令行了。在命令行中输入 mongo
即可进入 MongoDB:
我们看到输出中有一些警告信息(2022-07-29T02:35:52.346+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted),主要是没有开启认证。接下来我们创建管理员用户,并为其创建密码。操作如下:
输入上述指令后,MongoDB 会提示我们输入 tyun
管理员的密码:
按照提示输入密码即可,这样密码就不会回显在终端上,加强安全性。
passwordPrompt()
方法提示我们输入密码,这样密码就不会回显在控制台上了。不过我们可以使用字符串直接指定密码,不过我们不建议这么做,以免在终端上留下历史记录,让别人看到。
MongoDB 提供的免费集群
MongoDB 官网提供了一个免费版的集群(512 MB 的存储空间,对于个人学习是完全够用的),我们只需要注册一个账号即可。然后根据提示进行集群的创建即可,创建完成之后的界面如下:
集群详情页面:
在使用的时候最好设置白名单,以增加安全性:
还有好用的 Charts(类似 Kibana 的 Dashboard):
打开 Dashboard:
创建用户
我们看到输出中有一些警告信息,主要是没有开启认证。接下来我们创建管理员用户,并为其创建密码。操作如下:
输入上述指令后,MongoDB 会提示我们输入密码:
按照提示输入密码即可,这样密码就不会回显在终端上,加强安全性。
passwordPrompt()
方法提示我们输入密码,这样密码就不会回显在控制台上了。不过我们可以使用字符串直接指定密码,不过我们不建议这么做,以免在终端上留下历史记录,让别人看到。
userAdminAnyDatabase
角色允许用户做如下操作:
· 可以创建用户
· 可以为用户授予或回收角色
· 可以创建或修改定制的角色
如何创建一个具有 root
权限的用户:
编辑 /etc/mongod.conf
配置文件,打开安全配置:
之后重启 mongod
服务,并再次进入 MongoDB shell,就会发现警告已经没有了:
文章转载自公众号:新钛云服
