一、 基础
1、 NoSQL简介
NoSQL是Not Only SQL的缩写,它指的是非关系型数据库,是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求。
2、 NoSQL的特点
非关系型的、分布式的、开源的、水平扩展的。
3、 为什么要使用NoSQL
传统关系型数据库存在不足,扩展性的瓶颈和阻抗失谐。
扩展性瓶颈:
在硬件计算资源“横向扩展”成为必然时,集群成为必然趋势。而关系型数据库储存结构并不适用于集群,共享磁盘资源成为瓶颈。
阻抗失谐:
内存中的数据结构和关系模型相差较大。
一些内存结构需要转化才能进行存储,大大的浪费资源和时间。
非关系型数据库相对于关系型数据库的优势。
为集群而设计,处理数据速度快,访问效率高。
处理大数据能力强,更友好的数据交互,没有字段定义等等规则限制。
4、 NoSQL数据库的优缺点
优势:
简单扩展
快速读写
较低成本
灵活的数据模型
劣势:
不提供对SQl的支持
支持的特性不够丰富
现有的产品不够成熟
5、 MongoDB简介
介于关系型和非关系型之间的产品,是非关系型数据库中功能最丰富,最像关系型数据库的,语法有点类似JavaScript面向对象的查询语句,它是一个面向集合的,模式自由的文档型数据库。
面向集合(Collenction-Orented)
数据库被分组存储在数据集中北称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库里的表,不同的是它们不需要定义任何模式。
模式自由(schema-free)
集合里面没有行和列的概念。
文档型(document)
存储的数据是键-值对的集合,键是字符串,值可以是数据类型集合里的任意类型,包括数据和文档,每个文档相当于关系数据库中的一条记录。
6、 MongoDB特性
特点:
高性能,易部署、易使用、存储数据非常方便
主要特性:
面向集合存储,易于存储对象类型数据。
模式自由
支持动态查询
支持完全索引,包含内部对象。
支持复制和故障修复
使用高效的二进制数据存储,包括大型对象(视频)
自动处理碎片,以支持云计算层次扩展性。
文件存储格式为BSON(Json扩展)
7、 适用场景
持久化缓存层
高效的实时性
对象及JSON数据的存储
高伸缩性场景
大尺寸、低价值的数据存储
8、 不适用场景
要求高度事务性的系统
传统的商业智能应用
复制多表查询
9、非关系型数据库应用场景及其优缺点:
分类 | 举例 | 应用场景 | 数据模型 | 优点 | 缺点 |
键值 | Tokyo Cabinet/Tyrant, Redis, Voldemort,Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。[3] | Key 指向 Value 的键值对,通常用hash table来实现[3] | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据[3] |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案。[3] |
二、 进阶
1、 GridFS文件系统
GridFS是一种在MongoDB中存储大型二进制文件的机制。
使用GridFS的原因:
储存巨大的文件,比如音频、视频、图片等。
利用GridFS可以简化需求。
GridFS会直接利用已经建立的复制或者分片机制,故障恢复和扩展的很容易。
GridFS可以避免用户上传内容的文件系统出现问题
GridFS不产生磁盘碎片
GridFS使用两个表来存储数据:
Files 包含元数据对象
Chunks 包含其他一些相关信息的二进制块
为例使多个GridFS命名为一个单一的数据库,文件和块都有一个前缀,默认前缀为fs。所以任何默认的GridFS存储将包括命名空间fs.files和fs.chunks(可修改)。
2、 索引
MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧。
MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样。其实可以这样说说,索引是凌驾于数据存储系统之上的另一层系统,所以各种结构迥异的存储都有相同或相似的索引实现及使用接口并不足为奇。
索引可以任何类型的字段,甚至文档
MongoDB 也是有组合索引的
在缺省情况下创建的索引均不是唯一索引。
可以创建复合唯一索引,即保证复合键值唯一即可。
MongoDB 提供了一个 explain 命令让我们获知系统如何处理查询请求。利用 explain 命令,我们可以很好地观察系统如何使用索引来加快检索,同时可以针对性优化索引。
system.indexes集合中包含了每个索引的详细信息。
慢日志:
MongoDB Profile 记录是直接存在系统db 里的,记录位置system.profile
0 – 不开启
1 – 记录慢命令 (默认为>100ms)
2 – 记录所有命令
3、 性能监控
Mongosniff 此工具可以从底层监控到底有哪些命令发送给了MongoDB 去执行,从中就可以进行分析
Mongostat 此工具可以快速的查看某组运行中的MongoDB 实例的统计信息
db.serverStatus 这个命令是最常用也是最基础的查看实例运行状态的命令之一。
db.stats 查看数据库状态信息
4、 数据备份
备份的原理是通过一次查询获取当前服务器快照,并将快照写入磁盘中,因此这种方式保存的也不是实时的,因为在获取快照后,服务器还会有数据写入。
MongoDB备份保存的是二进制数据。
数据还原,可以把备份的数据还原到指定路径。
数据导出,可以把一个collection导出成json格式或csv格式的文件。可以指定导出哪些数据项,也可以根据给定的条件导出数据。
数据导入,可以把一个特定格式文件中的内容导入到某张collection中。
fsync命令能非常灵活的备份,不用停掉服务器,也不用牺牲备份的实时特性。要付出的代价就是一些写入操作被暂时阻塞了。唯一不耽误读写还能保证实时快照的备份方式就是通过“从服务器”备份。
5、 安全认证
只有数据库认证的用户才可以进行读写操作,默认为不验证。需要启动是指定参数。
6、 性能优化
创建索引
限定返回结果数
只查询使用到的字段
采用capped collection
采用Server Side Code Execution
使用Hint,强制使用索引
采用Profiling慢日志
三、 集群架构
1、 主从复制(Master-Slave)
MongoDB支持在多台机器通过异步复制打到故障转移和实现冗余。
多台机器同一时刻只有一台是用于写操作,由于这种情况,为MongoDB提供了数据一致性的保障。
担当Primary角色的及其能把读操作分发给slave。
2、 副本集(Replica Sets)
能实现故障自动切换和自动修复成员节点,各个DB之间的数据完全一致。
副本及没有固定的主节点,当不工作时变更其他节点。