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 抽象的体系结构
1.3 MongoDB 和RDBMS对比
| RDBMS | MongoDB |
|---|---|
| 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
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
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
5. 访问MongoDB
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
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