【有书共读】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提示和限制

  1. 通常用于64位系统
  2. 对于数据库服务器,MongoDB最好运行在专门的服务器上。
  3. 处理数据超出内存查询效率变慢
  4. 用来存储集合和文档数据结构,从数据大小看并非最有效
  5. 查询语言和SQL差别大,MongoDB针对是开发人员而非分析员
  6. 运行大规模集群需要维护成本
  7. 不会在所有分片节点上复制数据而是在每个可复制集群里复制,配置MongoDB集群需要单独配置和管理
#MongoDB#
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务