[读书笔记]数据库-初识MongoDB
2017-06-05 10:33
295 查看
这段时间,买了一大堆书,为了激励自己认真把书读完,决定每周写一篇读书笔记,主要是自己的一些感想和对书中内容的一些总结归纳,这是第一篇,初识MongoDB。书名为《MongoDB 实战(第二版)》。
MongoDB 是为快速开发互联网Web应用而设计的数据库系统,其数据模型和持久化策略就是为了构建高读/写吞吐量和高灾备伸缩性的系统。无论系统需要单个还是多个节点,MongoDB 都可以提供高性能。
MongoDB键特性
文档数据模型
MongoDB 最大的特性不是其伸缩策略特性,而是其直观的数据模型。MongoDB 在文档里储存数据而不是在行里。这种模型的优势是:假如需要为每个用户存储多个email。在关系型数据库中,需要创建单独的email表,然后通过外键关联起来,而MongoDB 提供了非常简单的方法来解决这个问题:
{
_id: 10,
username: 'peter',
email: [
'wgxshr@outlook.com',
'wgxshr@gmail.com'
]
}
只需要创建一个email数组就解决了问题,这点对开发者非常有用,在数据经常变化的时候只需要储存一个结构化文档即可,无需担心数据模型的变化。MongoDB的文档格式基于JSON,JSON 数据结构由键值对组成,也可以内置嵌套。基于文档的数据模型可以表示丰富的,多层次的数据结构,经常用来处理无须多表关联的工作。除了支持丰富的数据结构外,文档不需要遵循严格的数据定义schema。不强制定义schema带来了一些好处。首先,应用程序的代码强制数据结构而不是数据库,在 频繁修改数据定义的时候可以加速应用程序开发。
其次,无schema模型允许用户使用真正的变量属性来表示数据,这使得使用MongoDB开发应用时不许担心未来可能的数据字段的变化。
索引
随着数据库中添加的文档越来越多,查询的成本变得越来越高,这时需要添加数据库索引来提高搜索数据的效率。MongoDB 中的索引使用了B-树(平衡树),新的引擎已经支持日记结构合并树(LSM),可以在MongoDB3.2版本中使用。MongoDB 会给每一个文档对象一个主键(primary key),一个惟一的数据标识,每个主键会自动索引,这样就可以使用唯一的主键来高效的访问每一个数据。使用MongoDB,每个集合可以创建64个索引:升序,降序,复合键,哈希, 文本以及地理空间索引。
复制
MongoDB 提供了数据库复制特性,叫做可复制集合。可复制集合在多个机器上分布式存储数据名,在服务器或者网络出错时,实现数据冗余存储和自动灾备,此外,复制还用于伸缩数据库读操作。一些常见的网络项目通过分散读取压力到可复制集群的服务器来实现。可复制集合有多态服务器组成。调用这些节点,任意时刻,一个节点作为主节点,则其他的作为次节点,可复制节点的主节点可以同时接受读/写操作,但是从服务器只能进行读操作。真正让可复制集独一无二的是它可以支持自动化灾备:如果主节点失败,则集群中会选择一个从节点自动提升为主节点。当之前的主节点回归时,它会继续作为从节点。
加速与持久化
要理解MongoDB的持久化方法,需要理解一些概念。写入速度可以理解为数据库在给定时间内插入,更新和删除的容量,持久性指的是这些写操作被永久保存的保证级别。从MongoDB2.0开始,日志功能默认是启用的。启用日志功能后,默认每100毫秒就会写一次日志文件。如果服务器意外关机,日志会通过重启服务器来确保MongoDB数据文件恢复为一致状态。这是MongoDB最安全的方式。对于写入压力,可以通过关闭日志功能以提高性能。坏处是意外关机后可能导致数据文集冲突,因此,关闭日志功能,就应该使用主从复制模式,推荐一个服务器,即使一个机器关机,还有一台机器保证数据的完整性。
伸缩
伸缩数据库最简单的方式就是升级服务器硬件。如果应用是运行在单个节点上,则通常可行的方案就是组合添加更快的磁盘,更多的内存以及更强大的CPU来解决数据库性能瓶颈,这被成为垂直扩展数据库的水平扩展是指在多台机器上分布式存储数据库,而不是提升单个节点的性能,通常可以减少硬件成本,而且跨机器分布式存储数据可以降低宕机带来的丢失数据的后果。设计MongoDB的目标就是利用其水平伸缩。它通过基于范围的分区机制来实现水平扩展,成为分片机制,可以自动化管理每个分布式节点存储的数据。分片系统处理额外的分片节点,而且它还会处理自动化灾备。每个独立的节点是一个可复制集合,至少由两台机器组成,确保节点失败的时候可以自动恢复。
MongoDB 与其他数据库对比
MongoDB 的适用场景
MongoDB 非常适合做web应用的主存储数据库,可以很好的解决高吞吐量的web网站需求。MongoDB 通常适用于实现较短的开发周期的项目,以及敏捷,中型规模的团队。MongoDB 的速度以及它的两个特性:针对性原子更新和盖子集合使得MongoDB 非常适用于分析和日志。许多web应用使用缓存层来帮助快速返回内容数据。允许支持更多对象结构的数据模型,结合更快地查询速度,经常允许MongoDB 可以作为支持更多查询功能的缓存使用,或者直接与缓存层集成到一起。
MongoDB 是为快速开发互联网Web应用而设计的数据库系统,其数据模型和持久化策略就是为了构建高读/写吞吐量和高灾备伸缩性的系统。无论系统需要单个还是多个节点,MongoDB 都可以提供高性能。
MongoDB键特性
文档数据模型
MongoDB 最大的特性不是其伸缩策略特性,而是其直观的数据模型。MongoDB 在文档里储存数据而不是在行里。这种模型的优势是:假如需要为每个用户存储多个email。在关系型数据库中,需要创建单独的email表,然后通过外键关联起来,而MongoDB 提供了非常简单的方法来解决这个问题:
{
_id: 10,
username: 'peter',
email: [
'wgxshr@outlook.com',
'wgxshr@gmail.com'
]
}
只需要创建一个email数组就解决了问题,这点对开发者非常有用,在数据经常变化的时候只需要储存一个结构化文档即可,无需担心数据模型的变化。MongoDB的文档格式基于JSON,JSON 数据结构由键值对组成,也可以内置嵌套。基于文档的数据模型可以表示丰富的,多层次的数据结构,经常用来处理无须多表关联的工作。除了支持丰富的数据结构外,文档不需要遵循严格的数据定义schema。不强制定义schema带来了一些好处。首先,应用程序的代码强制数据结构而不是数据库,在 频繁修改数据定义的时候可以加速应用程序开发。
其次,无schema模型允许用户使用真正的变量属性来表示数据,这使得使用MongoDB开发应用时不许担心未来可能的数据字段的变化。
索引
随着数据库中添加的文档越来越多,查询的成本变得越来越高,这时需要添加数据库索引来提高搜索数据的效率。MongoDB 中的索引使用了B-树(平衡树),新的引擎已经支持日记结构合并树(LSM),可以在MongoDB3.2版本中使用。MongoDB 会给每一个文档对象一个主键(primary key),一个惟一的数据标识,每个主键会自动索引,这样就可以使用唯一的主键来高效的访问每一个数据。使用MongoDB,每个集合可以创建64个索引:升序,降序,复合键,哈希, 文本以及地理空间索引。
复制
MongoDB 提供了数据库复制特性,叫做可复制集合。可复制集合在多个机器上分布式存储数据名,在服务器或者网络出错时,实现数据冗余存储和自动灾备,此外,复制还用于伸缩数据库读操作。一些常见的网络项目通过分散读取压力到可复制集群的服务器来实现。可复制集合有多态服务器组成。调用这些节点,任意时刻,一个节点作为主节点,则其他的作为次节点,可复制节点的主节点可以同时接受读/写操作,但是从服务器只能进行读操作。真正让可复制集独一无二的是它可以支持自动化灾备:如果主节点失败,则集群中会选择一个从节点自动提升为主节点。当之前的主节点回归时,它会继续作为从节点。
加速与持久化
要理解MongoDB的持久化方法,需要理解一些概念。写入速度可以理解为数据库在给定时间内插入,更新和删除的容量,持久性指的是这些写操作被永久保存的保证级别。从MongoDB2.0开始,日志功能默认是启用的。启用日志功能后,默认每100毫秒就会写一次日志文件。如果服务器意外关机,日志会通过重启服务器来确保MongoDB数据文件恢复为一致状态。这是MongoDB最安全的方式。对于写入压力,可以通过关闭日志功能以提高性能。坏处是意外关机后可能导致数据文集冲突,因此,关闭日志功能,就应该使用主从复制模式,推荐一个服务器,即使一个机器关机,还有一台机器保证数据的完整性。
伸缩
伸缩数据库最简单的方式就是升级服务器硬件。如果应用是运行在单个节点上,则通常可行的方案就是组合添加更快的磁盘,更多的内存以及更强大的CPU来解决数据库性能瓶颈,这被成为垂直扩展数据库的水平扩展是指在多台机器上分布式存储数据库,而不是提升单个节点的性能,通常可以减少硬件成本,而且跨机器分布式存储数据可以降低宕机带来的丢失数据的后果。设计MongoDB的目标就是利用其水平伸缩。它通过基于范围的分区机制来实现水平扩展,成为分片机制,可以自动化管理每个分布式节点存储的数据。分片系统处理额外的分片节点,而且它还会处理自动化灾备。每个独立的节点是一个可复制集合,至少由两台机器组成,确保节点失败的时候可以自动恢复。
MongoDB 与其他数据库对比
例子 | 数据模型 | 伸缩性模型 | 使用场景 | |
简单的键值存储 | Memcached | 键值,值是二进制对象 | 变化的Memcached可以跨节点伸缩,把所有可用的RAM变为一个存储库 | 缓存,web网站等 |
复查键值存储 | HBase,Cassandra, Riak KV,Redis,CouchDB | 变化的 Cassandra 使用的键值结构是列;名; HBase 和Redis 存储二进制对象,CouchDB 存储JSON文档 | 最终一致性,多节点,分布式高可用和容易灾备 | 高吞吐量(活动源,消息队列),缓存,web网站等 |
关系性数据库 | Oracle数据库,IBM DB2,Microsoft SQL Server,MySQL, PostgreSQL | 表 | 垂直伸缩,限制支持集群和手动分区 | 需要事物的系统(银行和金融)或SQL,规范化数据模型 |
MongoDB 非常适合做web应用的主存储数据库,可以很好的解决高吞吐量的web网站需求。MongoDB 通常适用于实现较短的开发周期的项目,以及敏捷,中型规模的团队。MongoDB 的速度以及它的两个特性:针对性原子更新和盖子集合使得MongoDB 非常适用于分析和日志。许多web应用使用缓存层来帮助快速返回内容数据。允许支持更多对象结构的数据模型,结合更快地查询速度,经常允许MongoDB 可以作为支持更多查询功能的缓存使用,或者直接与缓存层集成到一起。
相关文章推荐
- MongoDB初识之数据库、集合、文档
- NoSQL数据库学习笔记之 初识MongoDB
- nosql篇mongodb初识与安装整理以及与关系型数据库对比
- nosql篇mongodb初识与安装整理以及与关系型数据库对比
- 分布式文件存储的数据库开源项目MongoDB
- 初识smarty填充数据库数据
- key-value 数据库redis: 一、安装和初识
- 读书笔记,数据库优化器对应路径等级
- 《鲁棒的数据库持久层设计》读书笔记01-持久层的类型
- 【读书笔记】用反射+抽象工程模式实现多数据库的访问程序
- 【读书笔记】数据库之关系数据库语言(SQL3)
- MongoDB数据库文件损坏恢复数据全过程
- 《数据库系统基础教程》读书笔记——第一章 数据库系统世界
- 《自己动手写操作系统》读书笔记——初识保护模式
- 《自己动手写操作系统》读书笔记——初识保护模式
- 分布式文件存储的数据库开源项目MongoDB
- J2EE 平台菜鸟初识读书笔记
- 《卓有成效的程序员》读书笔记二:使用SchemaSpy自动生成数据库文档
- 'Hibernate 完全手册' 读书笔记(二) 初识、体系、对象标识符、配置、映射类型
- 数据库的坏味道 --《Refactoring Database: Evolutionary Database Design》读书笔记