文章目录
第五章 MongoDB
5.1 简介
MongoDB是一种非关系型的数据库,其存储类型是文档存储
5.1.1 文档存储的特点
保证海量数据存储的同时,具有良好的查询性能。用类Json格式进行存储
5.1.2 MongoDB的简单介绍
- C++语言编写
- 基于分布式文件存储的开源数据库系统
- 在高负载的情况下,添加更多的节点,可以保证服务器性能
- 旨在为WEB应用提供可扩展的高性能数据存储解决方案
5.1.3 MongoDB的存储方式(文档存储)
- 将数据存储为一个文档,数据结构由键值(key value)对组成
- 字段值可以包含其他文档,数组及文档数组
文档类似于 JSON 对象
5.1.4 MongoDB的特点
- 面向集合存储,易存储对象类型的数据
- 模式自由
- 支持动态查询
- 支持完全索引,包含内部对象
- 支持查询
- 支持复制和故障恢复
- 使用高效的二进制数据存储,包括大型对象(如视频)
- 自动处理碎片,以支持云计算层次的扩展性
- 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言
- 文件存储格式为BSON(一种JSON的扩展)
- 可通过网络访问
5.1.5MongoDB的适用场景
- 网站数据
- 非常适合实时的插入,更新与查询
- 具备网站实时数据存储所需的复制及高度伸缩性
- 缓存
- 适合作为信息基础设施的缓存层
- 避免过载:在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载
- 大尺寸、低价值的数据
- 传统的关系型数据库存储某些数据代价可能会比较昂贵(在此之前,很多时候程序员往往会选择传统的文件进行存储)
- 高伸缩性的场景
- 非常适合由数十或数百台服务器组成的数据库
- Mongo 的路线图中已经包含对MapReduce引擎的内置支持(什么是路线图?)
- 内置对MapReduce引擎的支持
- 用于对象及JSON 数据的存储
- Mongo 的BSON 数据格式非常适合文档化格式的存储及查询
5.1.6 MongoDB不适用的场景
- 高度事务性的系统
如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序
- 传统的商业智能应用
- 针对特定问题的BI 数据库会产生高度优化的查询方式
- 数据仓库可能是更合适的选择
- 需要SQL 的问题
5.2 数据模型
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
table join | 无 | 表连接(MongoDB不支持) |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
Mongodb中基本的概念是文档、集合、数据库
5.2.1 SQL->MongoDB
注意:"_id"在集合内唯一标识一行
5.2.2 MongoDB中的数据类型(了解)
除了普通的String,Integer,Boolean,Double,Arrays(各种类型的数组),TimeStamp(时间戳),Date外,还提供了一些特殊的格式:
数据类型 | 描述 |
---|---|
Min/Max keys | 将一个值与BSON(二进制的JSON)元素的最低值和最高值相对比 |
Object | 用于内嵌文档 |
Null | 用于创建空值 |
Symbol | 符号,基本等同于字符串类型,但一般采用特殊符号类型的语言 |
Object ID | 对象ID,用于创建文档的ID |
Binary Data | 二进制数据 |
Code | 用于存储js代码 |
Regular expresslon | 用于存储正则表达式 |
5.3 MongoDB操作(了解)
5.3.1 连接
- shell连接
5.3.2 增删改查
- 查看所有数据库:
show dbs
- 创建:
use [database_name]
如果没有创建会自动创建,但这个时候使用
show dbs
是看不到刚创建的数据库的,必须真正的插入了数据后该数据库才会被创建
- 删除:
db.dropDatabase()
删除当前的数据库 - 集合(表)操作:创建集合,获取某集合,查看所有集合,删除集合(这里集合基本等同于表)
- 插入:
db.[collection_name].insert(...something...)
- 查看:
db.[collection_name].find()
- 条件操作符:
$type
- 还有其他的赋值,更新,删除,查询等操作…
- 聚合操作
具体可以查看菜鸟教程
5.3.3 子文档的存储方法
有嵌入式文档和引用式文档两种类型
5.3.4 索引
MongDB支持按某个字段,包括内嵌字段进行排序。
- 如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录
- 而扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的
具体操作(索引的删除和建立方式)参考菜鸟教程-MongoDB 索引
索引的查询限制:
- 索引不能被包含正则表达式,非操作符,算术运算符,$where子句的查询使用
- 一个集合中索引不能超过64个
- 索引名长度不超过125个字符
- 一个复合索引最多有31个字段
通过
explain
命令可以查看语句是否使用索引
5.3.5 JAVA连接
略
5.4 数据复制
复制是将数据同步在多个服务器的过程
5.4.1 复制的作用
- 保障数据的安全性
- 数据高可用性 (24*7)
- 灾难恢复
- 无需停机维护(如备份,重建索引,压缩)
- 分布式读取数据
5.4.2 复制需求
- 复制最少需要两个节点:一个是主节点,负责处理客户端请求,其余均为从节点,负责复制主节点上的数据。
- MongoDB搭配中一主一从和一主多从均可
5.4.3 数据复制原理
主节点记录在其上的所有操作生成操作日志(oplog),从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致
5.4.4 MongoDB的副本集特性
副本集在主机宕机后,副本会接管主节点成为主节点而不会宕机(常见的主从模式在主机宕机后所有服务将停止)
5.5 分片
当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量
5.5.1 使用分片的原因
- 复制所有的写入操作到主节点
- 延迟的敏感数据会在主节点查询
- 单个副本集限制在12个节点
- 请求量巨大时会出现内存不足
- 本地磁盘不足而垂直扩展价格昂贵
5.5.2 MongoDB的分片集群结构
Shard:用于存储实际的数据块,实际生产环境中一个shard server
角色可由几台机器组各一个replica set
承担,防止主机单点故障
Config Server:mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
Query Routers:前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
5.6 MongoDB的其他特性(了解)
5.6.1 数据备份
mongodump命令来备份MongoDB数据,导出所有数据到指定目录中
mongodump -h dbhost -d dbname -o dbdirectory
5.6.2 数据恢复
mongorestore 命令来恢复备份的数据
mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
5.6.3 运行情况监控
mongostat 命令
- mongostat是Mongodb自带的状态检测工具,在命令行下使用
- 它会间隔固定时间获取mongodb的当前运行状态,并输出
- 如果发现数据库突然变慢或者有其他问题的话,第一手的操作就考虑采用mongostat来查看mongo的状态
mongotop 命令
- mongotop提供了一个方法,用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据
- mongotop提供每个集合的水平的统计数据
- 默认情况下,mongotop返回值的每一秒