MongoDB - 概述篇(概念、结构、BSON、适用场景、安装部署启动)

865 阅读7分钟

1. 什么是MongoDB?

MongoDB是一个基于分布式文件/文档存储的数据库。 由C++编写,可以为web应用提供可拓展、高性能、易部署的数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富、最像关系数据库的。

在高负载的情况下,可以通过添加更多的节点,保证服务器性能。

1.1 NoSQL和MongoDB

NoSQL(not only sql)支持类似SQL的功能,与RDBMS(关系数据库)相辅相成。其性能较高,不使用SQL意味着没有结构化的存储要素之后,架构更加灵活。

NoSQL四大家族:

  • 列存储Hbase
  • 键值(key-value)存储redis
  • 图像存储Neo4j
  • 文档存储MongoDB

1.2 抽象的体系结构

image.png

1.3 MongoDB 和RDBMS对比

RDBMSMongoDB
database(数据库)database(数据库)
table(表)collation(集合)
row(行)document(BSON文档
column(列)field(字段)
index(唯一索引、主键索引)index(支持地理位置索引、全文索引、哈希索引)
join(主外建关联)embedded Document(嵌套文档)
primary key(指1至N个列做主键)primary key(指定_id field作为主键)

2. 什么是BSON?

BSON(Binary JSON)是一种类似JSON的一种二进制形式的存储格式。 他和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和Binary Data类型。BSON可以作为网络数据交换的一种存储格式, 是一种schema-less的存储形式,他的优点是灵活性高,缺点是空间利用率不佳。

举个栗子:

{key:value,key2:value2}
  • 其中key是字符串类型,后面的value值,它的类型一般是字符、double、Array、ISODate等类型。

BSON有三个特点:

  • 轻量性
  • 可便利性
  • 高效性

BSON在MongoDB中的使用

MongoDB使用了BSON这种结构来存储数据和网络数据交换。把这种格式转化成一文档这个概念(Document),这里的一个Document也可以理解成关系数据库中的一条记录(Record),只是这里的Document的变化更丰富一些,如Document可以嵌套。

MongoDB中Document 中可以出现的数据类型:

数据类型说明解释说明Document举例
String字符串UTF-8编码的字符串才是合法的{key:"abc"}
Integer整型数值根据你采用的服务器,可以分为32位和64位{key:1}
Boolean布尔型用于存储布尔值(真/假){key:true}
Double双精度浮点型用于存储浮点值{key:3.14}
ObjectId对象ID用于创建文档的ID{id:new ObjectId()}
Array数组用于将数组或列表或多个值存储为一个键{arr:["a","b"]}
Timestamp时间戳从开始纪元开始的毫秒数{ts:new Timestamp()}
Object内嵌文档文档可以作为文档中某个 key的value{o:{foo:“bar”}}
Null空值表示空值或者未定义的对象{key:null}
Date或者ISODate格林尼治时间日期时间,用Unix日期格式来存储当前日期或时间{birth:new Date()}
Code代码可以包含JS代码{x:function(){}}

特殊数据类型file:

  • 二进制转码小于16M,用base64存储
  • 二进制转码大于16M,用GridFS存储
    • GridFS用两个集合来存储一个文件:fs.files和fs.chunk 举例:真正存储需要使用mongofiles -d gridfs put song.mp3

3. 如何抉择是否使用MongoDB

应用特征Yes / No
应用不需要事务及复杂 join 支持YES
新应用,需求会变,数据模型无法确定,想快速迭代开发YES
应用需要2000-3000以上的读写QPS(更高也可以)YES
应用需要TB甚至 PB 级别数据存储YES
应用发展迅速,需要能快速水平扩展YES
应用要求存储的数据不丢失YES
应用需要99.999%高可用YES
应用需要大量的地理位置查询、文本查询YES

3.1 适用场景

  • 网站数据:MongoDB 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 缓存:由于性能很高,MongoDB 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
  • 大尺寸、低价值的数据:使用传统的关系型数据库存储一些大尺寸低价值数据时会比较浪费,在此之前,很多时候程序员往往会选择传统的文件进行存储。
  • 高伸缩性的场景:MongoDB 非常适合由数十或数百台服务器组成的数据库,Mongo的路线图中已经包含对MapReduce引擎的内置支持以及集群高可用的解决方案。
  • 用于对象及JSON 数据的存储:Mongo的BSON 数据格式非常适合文档化格式的存储及查询

3.2 行业具体应用场景

  • 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新。
  • 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。
  • 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
  • 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。
  • 直播,使用 MongoDB 存储用户信息、礼物信息等。

4. 安装与启动

# 1.下载社区版 MongoDB 4.1.3
# 下载地址:https://www.mongodb.com/download-center#community
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.1.3.tgz

# 2.将压缩包解压即可
mkdir /usr/local/hero/
tar -zxvf mongodb-linux-x86_64-rhel70-4.1.3.tgz -C /usr/local/hero/

# 3.创建数据目录和日志目录
cd /usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3
mkdir datas
mkdir logs
mkdir conf
touch logs/mongodb.log

# 4.创建mongodb.conf文件
vim /usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/conf/mongo.conf

# 5.指定配置文件方式的启动服务端
/usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/bin/mongod -f /usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/conf/mongo.conf

4.1 配置文件

#监听的端口,默认27017
port=27017

#数据库目录,默认/data/db
dbpath=/usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/datas

#日志路径
logpath=/usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/logs/mongodb.log

#是否追加日志
logappend=true

#是否已后台启动的方式登陆
fork=true

#监听IP地址,默认全部可以访问
bind_ip=0.0.0.0

# 是开启用户密码登陆
auth=false

image.png

4.2 启动脚本start-mongo.sh

touch start-mongo.sh
chmod 755 start-mongo.sh
vim start-mongo.sh
#! /bin/bash
clear
/usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/bin/mongod -f /usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/conf/mongo.conf
echo "start mongo..."
ps -ef | grep mongodb

image.png

4.3 关闭脚本stop-mongo.sh

touch stop-mongo.sh
chmod 755 stop-mongo.sh
vim stop-mongo.sh
#! /bin/bash
clear
/usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/bin/mongod --shutdown -f /usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/conf/mongo.conf

echo "stop mongo..."
ps -ef | grep mongodb

image.png

5. 访问MongoDB

image.png

5.1 客户端登录

# 启动mongo shell
/usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/bin/mongo

# 退出
exit

# 指定主机和端口的方式启动
/usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/bin/mongo --host=主机IP --
port=端口

/usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3/bin/mongo --host=127.0.0.1
--port=27017

配置环境变量:

vim /etc/profile

export MONGO_HOME=/usr/local/hero/mongodb-linux-x86_64-rhel70-4.1.3
export PATH=$MONGO_HOME/bin:$PATH

source /etc/profile

image.png

5.2 GUI工具

  • MongoDB Compass Community
    • MongoDB提供GUI MongoDB工具
    • 借助内置模式可视化,用户可以分析文档并显示丰富的结构。为了监控服务器的负载,它提供了数据库操作的实时统计信息
    • Compass有两个版本:Enterprise(付费),Community(免费)
    • 适用于Linux,Mac或Windows
  • MongoBooster
    • 是MongoDB CLI界面中非常流行的GUI工具。它正式名称为MongoBooster
    • NoSQLBooster是一个跨平台,它带有一堆MongoDB 工具来管理数据库和监控服务器
    • 这个Mongodb工具包括服务器监控工具,Visual Explain Plan,查询构建器,SQL查询,ES2017语法支持等等......
    • 适用于Linux,Mac或Windows
  • Navicat