自建 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 作为接下来所有的演示操作,当然我们也可以选择其他发行版。
[root@mongo01 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
系统设置
[root@mongo01 ~]# echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
[root@mongo01 ~]# echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
上述是临时性的设置,系统重启就会失效。永久性设置:
[root@mongo01 ~]# cat >> /etc/rc.d/rc.local <<EOF
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF
由于 /etc/rc.d/rc.local
文件默认没有可执行权限,需要增加可执行权限,那么在下次开机时它会自动执行。如下:
[root@mongo01 ~]# chmod +x /etc/rc.d/rc.local
[root@mongo01 ~]# ls -l /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 725 Jul 29 02:32 /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:
(venv36) [root@mongo01 ~]# cat >> /etc/yum.repos.d/mongodb-org-4.4.repo <<"EOF"
[mongodb-org-4.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.4.asc
EOF
接着进行安装:
(venv36) [root@mongo01 ~]# yum install -y mongodb-org
安装完毕,查看已经安装的软件包:
[root@mongo01 ~]# rpm -qa |grep mongod
mongodb-org-server-4.4.15-1.el7.x86_64
mongodb-org-mongos-4.4.15-1.el7.x86_64
mongodb-org-shell-4.4.15-1.el7.x86_64
mongodb-org-database-tools-extra-4.4.15-1.el7.x86_64
mongodb-org-tools-4.4.15-1.el7.x86_64
mongodb-database-tools-100.5.4-1.x86_64
mongodb-org-4.4.15-1.el7.x86_64
MongoDB 社区版包含以下软件包:
通过 YUM 方式安装的 MongoDB,其会自动创建如下两个目录:
-
/var/lib/mongo
(数据目录) -
/var/log/mongodb
(日志目录)
而且会使用 mongod
用户运行 MongoDB。接下来启动服务:
(venv36) [root@mongo01 ~]# systemctl start mongod
(venv36) [root@mongo01 ~]# systemctl status mongod
● mongod.service - MongoDB Database Server
Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2022-07-29 02:09:03 UTC; 3s ago
Docs: https://docs.mongodb.org/manual
Process: 3716 ExecStart=/usr/bin/mongod $OPTIONS (code=exited, status=0/SUCCESS)
Process: 3713 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 3710 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS)
Process: 3708 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)
Main PID: 3720 (mongod)
CGroup: /system.slice/mongod.service
└─3720 /usr/bin/mongod -f /etc/mongod.conf
Jul 29 02:09:03 mongo01.tyun.cn systemd[1]: Starting MongoDB Database Server...
Jul 29 02:09:03 mongo01.tyun.cn mongod[3716]: about to fork child process, waiting until server is ready for connections.
Jul 29 02:09:03 mongo01.tyun.cn mongod[3716]: forked process: 3720
Jul 29 02:09:03 mongo01.tyun.cn mongod[3716]: child process started successfully, parent exiting
Jul 29 02:09:03 mongo01.tyun.cn systemd[1]: Started MongoDB Database Server.
(venv36) [root@mongo01 ~]# ps -ef |grep mongo |grep -v grep
mongod 3720 1 1 02:09 ? 00:00:00 /usr/bin/mongod -f /etc/mongod.conf
安装及启动完毕,我们就可以进入 MongoDB 的命令行了。在命令行中输入 mongo
即可进入 MongoDB:
[root@mongo01 ~]# mongo
MongoDB shell version v4.4.15
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("50f98507-a80d-4e23-84a2-321718a2132d") }
MongoDB server version: 4.4.15
---
The server generated these startup warnings when booting:
2022-07-29T02:35:51.390+00:00: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine. See http://dochub.mongodb.org/core/prodnotes-filesystem
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
---
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).
The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> exit
bye
我们看到输出中有一些警告信息(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),主要是没有开启认证。接下来我们创建管理员用户,并为其创建密码。操作如下:
> use admin
> db.createUser(
{
user: "tyun",
pwd: passwordPrompt(),
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
}
)
输入上述指令后,MongoDB 会提示我们输入 tyun
管理员的密码:
Enter password:
按照提示输入密码即可,这样密码就不会回显在终端上,加强安全性。
passwordPrompt()
方法提示我们输入密码,这样密码就不会回显在控制台上了。不过我们可以使用字符串直接指定密码,不过我们不建议这么做,以免在终端上留下历史记录,让别人看到。
MongoDB 提供的免费集群
MongoDB 官网提供了一个免费版的集群(512 MB 的存储空间,对于个人学习是完全够用的),我们只需要注册一个账号即可。然后根据提示进行集群的创建即可,创建完成之后的界面如下:
集群详情页面:
在使用的时候最好设置白名单,以增加安全性:
还有好用的 Charts(类似 Kibana 的 Dashboard):
打开 Dashboard:
创建用户
我们看到输出中有一些警告信息,主要是没有开启认证。接下来我们创建管理员用户,并为其创建密码。操作如下:
> use admin
> db.createUser(
{
user: "tyun",
pwd: passwordPrompt(),
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
}
)
输入上述指令后,MongoDB 会提示我们输入密码:
Enter password:
按照提示输入密码即可,这样密码就不会回显在终端上,加强安全性。
passwordPrompt()
方法提示我们输入密码,这样密码就不会回显在控制台上了。不过我们可以使用字符串直接指定密码,不过我们不建议这么做,以免在终端上留下历史记录,让别人看到。
userAdminAnyDatabase
角色允许用户做如下操作:
· 可以创建用户
· 可以为用户授予或回收角色
· 可以创建或修改定制的角色
如何创建一个具有 root
权限的用户:
> use admin
switched to db admin
> db.createUser({user: "root", pwd: passwordPrompt(), roles: [{role: "root", db: "admin" }]})
Enter password:
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
编辑 /etc/mongod.conf
配置文件,打开安全配置:
security:
authorization: enabled
之后重启 mongod
服务,并再次进入 MongoDB shell,就会发现警告已经没有了:
[root@mongo01 ~]# systemctl restart mongod
[root@mongo01 ~]# mongo --authenticationDatabase "admin" -u "tyun" -p
MongoDB shell version v4.4.15
Enter password: 在此处输入密码
connecting to: mongodb://127.0.0.1:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("00dbddb9-43c4-4ce1-92cd-3ff38cccec44") }
MongoDB server version: 4.4.15
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> exit
bye
文章转载自公众号:新钛云服