【有书共读】MongoDB实战第二版第一章
包含图的部分可以查看博文https://blog.csdn.net/YuYunTan/article/details/84369704
第24期牛客有书共读栏目《MongoDB实战(第二版)》
为什么开发者喜欢MongoDB?
MongoDB为快速开发互联网应用而设计的数据库系统。其数据模型和持久化策略就是为了构建高读/写吞吐量和高自动灾备伸缩性的系统。无论系统是单节点还是多节点,都可以提供高性能,不会有伸缩困境的出现。
最大理由可能不是其伸缩策略特性而是直观数据的模型。
MongoDB在文档中存储数据而不是在行里。
MongoDB数据模型-基于文档
MongoDB基于文档模型存储数据,文档模型是基于JSON(JavaScript Object Notation)的一种流行的数据存储格式,该数据格式由键值对构成,也可以内置嵌套。
文档的例子如下:
{
_id:10,
username:'peter',
email:'pbak@gmail.com'
}
模型的优势
文档模型的优势在于无需关心数据模型的变化,可以表示丰富的、多层次的数据结构,可以处理无需多表关联的工作。
比如每个用户有多个email,关系型数据库需要创建email表,然后外键关联,而MongoDB只需如下的文档解决:
{
_id:10,
username:'peter',
email:[
'pbak@gmail.com',
'kkid@163.com'
]
}
仅需email数组就可解决。
MongoDB优势
MongoDB查询用于处理结构化文档,在电商例子中无需关联SQL查询得到商品信息,而是对应查询一个文档信息。
MongoDB定义对象可以持久化保存,减少对象映射复杂性。
MongoDB键特性
数据库很大程度由其数据模型定义。
文档数据模型
MongoDB的JSON文档,除了数值类型,其他都需要一对引号。
引号不是非必须
文档是包含一系列名称和值的集合。值可以是简单数据类型(字符串,数字和日期等),也可以是复杂类型(数组甚至JSON文档)。
MongoDB以二进制JOSN格式存储文档数据,或叫BSON。BSON有相似数据结构,但专为文档存储设计。当MongoDB查询并返还结果,这些数据会转换为易于阅读的数据格式。
关系型数据库包含表,MongoDB拥有集合。换句话说,MySQL在表行里保存数据,而MongoDB在集合文档里保存数据了(把集合当做一组文档数据)。
集合中数据存储在磁盘上,大部分查询需要指定查询目标集合。
MongoDB把文档归集到集合,集合不需要定义任何schema。理论上每个集合中的文档可以拥有不同数据结构。实际上,集合中文档是相对一致的。
无schema模型优点
(1)应用程序代码强制数据结构而不是数据库。在频繁修改数据定义时可加速应用程序开发。(2)允许用户使用真正变量属性表示数据。(3)可以动态添加新属性,不必担心未来可能数据字段变化。
ad hoc查询
主动查询模式(ad hoc queries)是指不需要事先定义系统接收何种查询。
关系型数据库很容易支持,而键值数据库只支持查询键,以牺牲丰富查询功能换取更简单伸缩模型。
MongoDB设计目标之一是保留大部分关系数据库功能。
索引
MongoDB索引使用了B-树(平衡树)数据结构。新引擎MongoDB3.2支持日志结构合并树(LSM)。
辅助索引使得可以用单个行或文档建立索引。MongoDB支持多个辅助索引用以优化用户不同查询。
MongoDB允许对每个集合创建64个索引,支持升序、降序、复合键、哈希、文本以及地理空间索引【允许查询经纬度点信息】。
复制
MongoDB用可复制集合(replica set)提供数据库复制特性。
可复制集合可在多个机器上分布式存储数据,在服务器或者网络出错时实现数据冗余存储和自动灾备。复制还可以用于伸缩数据库读操作。
可复制集合由多态服务器组成,每个服务器有独立物理机,分主从节点,与主从类似,主节点接受读/写操作,从节点只能读操作。
独一无二的特性是支持自动化灾备。若主节点失败则集群中选择一个从节点自动提升为主节点,主节点回归则继续变成从节点。
加速和持久化
写入速度(write speed)理解为数据库在给定时间内插入、更新和删除的容量。
持久性(durability)指写操作被永久保持的保证机制。
数据库领域,二者存在矛盾关系。
MongoDB让用户选择写入语义维持速度和持久性之间平衡,决定是否启用日志。
- MongoDB2.0默认启用日志功能(每100毫秒写一次日志),日志会重启服务器确保MongoDB数据文件恢复为一致状态。【MongoDB最安全方式】
- 可以配置MongoDB为fire-and-forget,即写命令不需要等待确认结果
- 可以配置确保已经写入各个可复制集群节点在返回确认结果
可以通过关闭日志提高写入性能。
若关闭日志功能,推荐主从模式,保证数据完整性。
伸缩
- 简单的方式:升级服务器硬件(磁盘,内存及CPU)。提升单节点参数方案称为垂直扩展(vertical scaling或scaling up)
- 水平扩展(horizontally或scaling out)指多台机器上分布式存储数据库,而非单节点配置,可以减少硬件成本。降低了单个节点宕机带来的风险。
- MongoDB目标是利用水平伸缩。利用基于范围的分区机制(也称分片机制)自动化管理每个分布式节点存储数据。还有基于哈希和基于tag的分配机制,也是基于范围的分片机制的一种。
- 分片系统处理额外的分片节点,还会处理自动化灾备。每个独立节点是一个可复制集合,至少由2台机器组成,确保节点失败可自动恢复。
mongoDB可以在几种模式下运行,比如独立模式,可复制集群模式。生产环境中推荐使用可复制集群模式。可复制集群由两个服务器架设mongod作为裁判,最后还有个独立的mongos路由服务器,用来在分片集群中转发不同请求到服务器。
命令行工具
- mongodump和mongorestore--备份和恢复数据库工具。mongodump前者将数据保存为原生BSON格式,适合备份。尤其适合热备份,可使用mongorestore恢复。
- mongoexport和mongoimport--导入或到处JSON,CSV,TSV格式数据。mongoimport可以导入大数据集合,只是经常需要在导入前调整数据模型以便发挥MongoDB最大优势。最简单的导入方式是使用自定义脚本。
- mongosniff -- 一个用于查看发送给数据库命令的嗅探根据,把BSON转换为人类可读的shell语句。
- mongostat--与iostat类似,用来轮询MongoDB,提供有帮战的状态信息。包括每秒的操作数(增删改查等),分配虚拟内存数量和服务器连接数。
- mongotop--与top类似,用来轮询MongoDB,显示在每个集合里花费的读取和写入时间总数。
- mongoperf--帮助了解MongoDB实例磁盘操作情况。
- mongooplog--展示MongoDB操作日志里的信息
- Bsondump--把BSON文件转换成人类可读格式,包括JSON
MongoDB设计目标
(1)设计组合键值对存储和关系数据库的最近特性。因为简单,所以键值对存储十分快,且易于神说。(2)最终目标是易于伸缩,存储丰富数据结构,提供复杂查询语言。
MongoDB使用场景
(1)做web应用、分析应用的首要数据库。(2)易于存储无schema数据,即弱数据结构数据。(3)存储无法事先知道数据结构的数据。
MongoDB与其他数据库对比
例子 | 数据模型 | 伸缩性模型 | 使用场景 | |
---|---|---|---|---|
简单的键值存储 | Mem***d | 键值,值是二进制对象 | 变换的Mem***d可以跨节点伸缩,把所有可用的RAM变成一个存储库 | 缓存、web网站等 |
复杂键值存储 | HBase,Cassandra,Riak KV,Redis,CouchDB | 变化的,Cassandra使用的键值结果是列;HBase和Redis存储二进制对象,CouchDB存储JSON文档 | 最终一致性、多节点、分布式高可用和容易灾备 | 高吞吐量(活动源、消息队列)、缓存、web网站等 |
关系型数据库 | Oracle数据库,IBM DB2,MySWL,PostgreSQL,Microsoft SQL Server | 表 | 垂直伸缩,限制支持集群和手动分区 | 需要事务的系统(银行和金融)或SQL、规范化数据模型 |
简单键值存储是指索引值基于提供的Key键。
复制键值存储是完善简单键值存储来处理复杂读/写模式或提供更丰富的数据类型。
MongoDB使用场景和部署
(1)web应用;(2)敏捷开发;(3) 分析和日志;(4)缓存;(5)可变schema【使得无需提前声明数据结构】
MongoDB提示和限制
- 通常用于64位系统
- 对于数据库服务器,MongoDB最好运行在专门的服务器上。
- 处理数据超出内存查询效率变慢
- 用来存储集合和文档数据结构,从数据大小看并非最有效
- 查询语言和SQL差别大,MongoDB针对是开发人员而非分析员
- 运行大规模集群需要维护成本
- 不会在所有分片节点上复制数据而是在每个可复制集群里复制,配置MongoDB集群需要单独配置和管理