分布式文件存储数据库 MongoDB

MongoDB 简介

  Mongo 并非芒果(Mango)的意思,而是源于 Humongous(巨大的;庞大的)一词。

  MongoDB 是一个基于分布式文件存储的 NoSQL 数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。关于什么是 NoSQL 可阅读《学了那么多 NoSQL 数据库 NoSQL 究竟是啥

  MongoDB 是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系数据库的。

  MongoDB 使用 BSON(Binary JSON)对象来存储,与 JSON 格式的键值对(key/value)类似,字段值可以包含其他文档,数组及文档数组。支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系型数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB 历史

  2007 年,Dwight Merriman,Eliot Horowitz 和 Kevin Ryan 成立 10gen 软件公司,在成立之初,这家的公司目标是进军云计算行业,为企业提供云计算服务。在开发云计算产品时,他们准备开发一个类似于数据库的组件,为云计算产品提供存储服务。当时是关系型数据库一统天下的时间,他们觉得传统的关系型数据库无法满足他们的要求,他们想要一款程序员不懂SQL语言也可以使用的数据存储产品。

  在网络上找了一圈,不管是开源的还是闭源的产品,都没找到让他们满意的东西,既然找不到,那就自己开发吧,反正他们也有那个技术实力,10gen 的创始人都来自谷歌,他们创建的网络广告公司 DoubleClick 被谷歌收购了,这是他们的第二次创业。

  10gen 公司不使用关系型数据库是有一定原因的,当时他们还在 DoubleClick 公司的时候,就吃过关系型数据库的苦头。DoubleClick 是一家网络广告公司,服务美国众多的知名公司,该公司每秒提供 40 万个广告,但在可伸缩性和敏捷性方面经常遇到困难,因此他们不得不经常自己开发和使用许多自定义数据存储来解决现有关系型数据库的不足,这让他们很是苦恼。

  因此他们决定开发一款数据库产品解决他们在 DoubleClick 时遇到的问题,并为自己的云计算产品提供存储服务。

  • MongoDB 最初于 2007 年开发,由位于纽约的一个名为 10gen 的组织开发,现在被称为 MongoDB Inc.
  • 2009 年,经过将近 2 年的开发,10gen 开发出了 MongoDB 的雏形并将它开源以及正式命名为 MongoDB,同时成立开源社区,通过社区运营 MongoDB。
  • 2009 年 02 月 MongoDB 1.0 发布,提供了大部分基本的查询功能。
  • 2009 年 12 月 MongoDB 1.2 发布,引入了 map-reduce,支持大规模数据处理。
  • MongoDB 的第一个真正产品是从 2010 年 03 月发布的 MongoDB 1.4 版本开始的。
  • 2010 年 8 月 MongoDB 1.6 发布,引入了一些主要特性,比如用于水平伸缩的分片、具备自动故障转移能力的副本集以及对 IPv6 的支持。
  • 2012 年 05 月 23 日,MongoDB 2.1 发布。该版本采用全新架构,包含诸多增强。
  • 2012 年 06 月 06 日,MongoDB 2.0.6 发布,分布式文档数据库。
  • 2012 年 8 月 MongoDB 2.2 发布,引入了聚合管道,可以将多个数据处理步骤组合成一个操作链。
  • 2013 年 MongoDB 推出第一款商业版本 MongoDB Enterprise Advanced。
  • 2013 年 04 月 23 日,MongoDB 2.4.3 发布,此版本包括了一些性能优化,功能增强以及 bug 修复。
  • 2013 年 08 月 20 日,MongoDB 2.4.6 发布,仍然是以性能优化,功能增强和 bug 修复为主。
  • 2015 年 03 月 MongoDB 3.0 发布,包含了新的 WiredTiger 存储引擎、可插拔存储引擎 API、增加了 50 个副本集限制和安全改进。同年晚些时候又发布了 3.2 版本,支持文档验证、部分索引和一些主要的聚合增强。
  • 2016 年 MongoDB 推出了 Atlas 服务,MongoDB Atlas,与公有云服务厂商(谷歌、微软Azure)合作。这一年,MongoDB 爆出了非常严重的安全门事件,黑客通过 MongoDB 的默认监听地址 0.0.0.0 删除数据,并且通过此漏洞进行勒索,支付 0.2 到 0.5 的比特币就可以恢复数据。
  • 2017 年 10 月 MongoDB 公司成立 10 周年之际,顺利通过 IPO 在纽交所上市。开盘 24 美元,公司估值达到 16 亿美元,并获得 1.92 美元的筹资。
  • 2017 年 11 月 MongoDB 3.6 发布,为多集合连接查询、变更流和使用 JSON 模式进行文档验证提供了更好的支持。
  • 2018 年 06 月 MongoDB 4.0 发布,这一版本的发布获得了广泛的关注,提供了跨文档事务处理能力。这是一个重要的里程碑,MongoDB 已经为高数据完整性需求做好了准备。
  • 2019 年 03 月 18 日,Forrester 授予 MongoDB NoSQL 领导者称号。
  • 2019 年 10 月 MongoDB 4.2 发布,开始支持分布式事务。
  • 截至 2020 年 10 月,MongoDB 的社区版版本是 4.4.1,扩展性和性能增强,降低复制延迟,可用性和容错性增强,查询能力和易用性增强,MongoDB 云平台的功能更新。MongoDB 逐渐的从一个专注于数据库服务的厂商,转变为提供数据平台服务的厂商。

  截至 2020 年,MongoDB 的全球下载量达到了 1.1 亿次。MongoDB 公司目前有 2000 多名员工,有超过 18000 名付费客户,其中有很多客户同时使用 MongoDB Atlas 和 MongoDB 企业版。大多数大公司在内部的一些场景中仍然使用的是社区版。MongoDB 社区版仍然是开源的,除了一些关键特性外,它与 MongoDB 企业版差不多。

MongoDB 支持语言

MongoDB 与关系型数据库术语对比

MongoDB 数据类型

MongoDB 下载与安装

下载

  官网:https://www.mongodb.com/

  下载地址:https://www.mongodb.com/try/download/community

  在页面中选择 MongoDB Community Server 社区版,根据自己的系统选择对应的版本,我自己使用的是 CentOS 版本。而 MongoDB 只有 RedHat 版本,下载使用即可。

  CentOS 是 Community ENTerprise Operating System 的简称,也可以叫它社区企业操作系统,是 Linux 操作系统中的一个发行版本。

>

  CentOS 并不是全新的 Linux 发行版,它是 Red Hat 家族发行的企业版的产品 Red Hat Enterprise Linux(以下称之为 RHEL)的克隆版本。RHEL 是很多企业采用的 Linux 发行版本,需要向 Red Hat 付费才可以使用,并能得到付费对应的服务,技术支持和版本升级。CentOS 可以像 RHEL 一样的构筑 Linux 系统环境,但不需要向 Red Hat 支付任何的产品和服务费用,同时也得不到任何有偿技术支持和升级服务。

  还可以通过:https://docs.mongodb.com/manual/installation/ 确认该版本软件是否支持你的操作系统。

安装

  将资源上传至服务器 /usr/local/src,解压至 /usr/local 并重命名为 mongodb

# 创建 mongodb 目录mkdir -p /usr/local/mongodb# 解压 mongodb 至指定目录tar -zxvf /usr/local/src/mongodb-linux-x86_64-rhel70-4.4.1.tgz -C /usr/local/# 重命名解压目录为 mongodbmv /usr/local/mongodb-linux-x86_64-rhel70-4.4.1/ /usr/local/mongodb

创建数据/日志目录

  创建用于存放数据和日志的文件夹,并修改其权限增加读写权限。

# 创建存放数据的目录mkdir -p /usr/local/mongodb/data/db# 创建存放日志的目录mkdir -p /usr/local/mongodb/logs# 创建日志记录文件touch /usr/local/mongodb/logs/mongodb.log

启动 MongoDB

前台启动

  MongoDB 的默认启动方式为前台启动。所谓的前台启动就是 MongoDB 启动进程后会占用当前的终端窗口。

# 切换至指定目录cd /usr/local/mongodb/# 前台启动bin/mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0
  • --dbpath:指定数据文件存放目录
  • --logpath:指定日志文件,注意是指定文件不是目录
  • --logappend:使用追加的方式记录日志
  • --port:指定端口,默认为 27017
  • --bind_ip:绑定服务 IP,若绑定 127.0.0.1,则只能本机访问,默认为本机地址

后台启动

  所谓的后台启动就是以守护进程的方式启动 MongoDB。命令中添加 --fork 即可。

# 后台启动bin/mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork

  通过命令启动的方式并不适合管理,毕竟每次输入命令都需要考虑各参数的配置。我们可以通过配置文件来配置启动参数,然后通过指定配置文件的方式启动服务,这样在管理 MongoDB 上就比较方便了。

配置文件

  在 bin 目录下增加一个 mongodb.conf 配置文件。

# 数据文件存放目录dbpath = /usr/local/mongodb/data/db# 日志文件存放目录logpath = /usr/local/mongodb/logs/mongodb.log# 以追加的方式记录日志logappend = true# 端口默认为 27017port = 27017# 对访问 IP 地址不做限制,默认为本机地址bind_ip = 0.0.0.0# 以守护进程的方式启用,即在后台运行fork = true

启动

# 切换至指定目录cd /usr/local/mongodb/# 指定配置文件的方式启动服务bin/mongod -f bin/mongodb.conf

客户端访问

  可以通过 bin 目录中的 mongo 来访问 MongoDB 服务器。

  命令为:bin/mongo --host 连接的主机地址(默认127.0.0.1) --port 端口(默认27017)

[root@localhost mongodb]# bin/mongoMongoDB shell version v4.4.1connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodbImplicit session: session { "id" : UUID("2bf54fad-83bc-444c-8bee-166a224445b8") }MongoDB server version: 4.4.1---The server generated these startup warnings when booting:         2020-10-21T10:47:44.855+08:00: ***** SERVER RESTARTED *****        2020-10-21T10:47:47.024+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted        2020-10-21T10:47:47.024+08:00: You are running this process as the root user, which is not recommended        2020-10-21T10:47:47.024+08:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'        2020-10-21T10:47:47.024+08:00: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. We suggest setting it to 'never'        2020-10-21T10:47:47.024+08:00: Soft rlimits too low        2020-10-21T10:47:47.024+08:00:         currentValue: 1024        2020-10-21T10:47:47.024+08:00:         recommendedMinimum: 64000------        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()---> 

help 帮助命令。

> help	db.help()                    help on db methods	db.mycoll.help()             help on collection methods	sh.help()                    sharding helpers	rs.help()                    replica set helpers	help admin                   administrative help	help connect                 connecting to a db help	help keys                    key shortcuts	help misc                    misc things to know	help mr                      mapreduce	show dbs                     show database names	show collections             show collections in current database	show users                   show users in current database	show profile                 show most recent system.profile entries with time >= 1ms	show logs                    show the accessible logger names	show log [name]              prints out the last segment of log in memory, 'global' is default	use <db_name>                set current database	db.mycoll.find()             list objects in collection mycoll	db.mycoll.find( { a : 1 } )  list objects in mycoll where a == 1	it                           result of the last line evaluated; use to further iterate	DBQuery.shellBatchSize = x   set default number of items to display on shell	exit                         quit the mongo shell

db.version() 查看版本信息。

> db.version()4.4.1

show dbs 查看所有数据库。

> show dbsadmin   0.000GBconfig  0.000GBlocal   0.000GB

  这里先简单通过客户端进行访问测试,后面会详细罗列客户端操作 MongoDB 数据库、集合、文档、索引、内置函数等相关的操作。

关闭 MongoDB

前台启动关闭

  使用 Ctrl + c 即可关闭。

后台启动关闭

  使用 --shutdown 参数即可关闭。

# 命令启动方式的关闭bin/mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork --shutdown# 配置文件启动方式的关闭bin/mongod -f bin/mongodb.conf --shutdown

kill 命令关闭

  通过 kill -9 的方式强制关闭进程,一般这种方式都不怎么推荐使用。

# 查看 mongodb 运行的进程信息ps -ef | grep mongodb# kill -9 强制关闭kill -9 pid

MongoDB 函数关闭

  连接到 MongoDB 服务后,切换到 admin 数据库,并使用相关函数关闭服务。

# 连接 mongodbbin/mongo# 切换 admin 数据库use admin# 执行以下函数(2选1)即可关闭服务db.shutdownServer()db.runCommand(“shutdown”)

环境变量

  每次操作 MongoDB 都需要进入具体的目录才行,比如启动服务,客户端进行连接等,可不可以在任意目录都能进行操作。答案当然是可以的,只需要将 MongoDB 相关目录添加至系统环境变量即可。

  先通过 vim /etc/profile 编辑系统环境变量文件,添加以下内容。

# 添加环境变量export MONGODB_HOME=/usr/local/mongodbexport PATH=$PATH:$MONGODB_HOME/bin

  然后通过 source /etc/profile 重新加载系统环境变量。这样在系统任意目录下都可以直接操作 MongoDB 了。

  本文讲解了 MongoDB 的一些入门级内容,教会了大家如何基于 Linux 环境下载与安装 MongoDB。下文我们先从安全问题入手,看看 MongoDB 未加密导致的惨痛经历与教训,顺便再教大家一波实用的解决方案。

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/ae94f8b27f5060277f1a5b1f0
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券