mongoDB
2021-03-27 11:47:52 98 举报
AI智能生成
【一图一知识】mongoDB基础知识扫盲 才疏学浅,如有错误请君指正,不甚感激! 持续更新发布,欢迎评论沟通交流。
作者其他创作
大纲/内容
其他
3大技术特征
灵活动态文档模型,bson
高可用replica set
水平扩展 sharding
优/缺
二级索引、动态查询、全文搜索 、聚合框架、MapReduce、GridFS、
地理位置索引、内存引擎 、地理分布等一系列的强大功能
地理位置索引、内存引擎 、地理分布等一系列的强大功能
有限的关联查询、不支持事务,16MB的文档大小限制,不支持中文排序,服务端Javascript性能欠佳
其他
数据写入速度超过日志刷新速度,会限制写入
mongoDB换主节点时候会有短暂不可写
切忌kill -9,数据库直接关闭,数据丢失,数据文件损失,修复数据库(成本高,有风险)
mongod进程收到SIGINT(kill -2)信号或者SIGTERM(kill -4)信号,会做一些处理
> 关闭所有打开的连接
> 将内存数据强制刷新到磁盘
> 当前的操作执行完毕
> 安全停止
> 关闭所有打开的连接
> 将内存数据强制刷新到磁盘
> 当前的操作执行完毕
> 安全停止
MongoDB数据库默认是没有用户名及密码的,即无权限访问限制。为了方便数据库的管理和安全,需创建数据库用户。
MapReduce
提供一种计算模型
简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)
MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。
MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。
索引存储在内存中
由于索引是存储在内存(RAM)中,你应该确保该索引的大小不超过内存的限制。
如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降
如果索引的大小大于内存的限制,MongoDB会删除一些索引,这将导致性能下降
支持全文索引
索引限制
集合中索引不能超过64个
索引名的长度不能超过128个字符
一个符合索引最有可以有31个字段
数据字段类型
Object Id
类似唯一主键ID,可以很快的生成和排序,包含12bytes
mongDB存储中必须有一个_id字段,可以是任意类型,默认为objectId对象
由于 ObjectId 中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过 getTimestamp 函数来获取文档的创建时间:
获取文档时间:
var newObject = ObjectId()
newObject.getTimestamp()
var newObject = ObjectId()
newObject.getTimestamp()
ObjectId转换为字符串:
var newObject = ObjectId()
newObject.getTimestamp()
newObject.str
var newObject = ObjectId()
newObject.getTimestamp()
newObject.str
字符串(utf-8编码)
时间戳
BSON 有一个特殊的时间戳类型用于 MongoDB 内部使用,与普通的 日期 类型不相关。 时间戳值是一个 64 位的值。其中:
在复制集中, oplog 有一个 ts 字段。这个字段中的值使用BSON时间戳表示了操作时间。
BSON 时间戳类型主要用于 MongoDB 内部使用。在大多数情况下的应用开发中,你可以使用 BSON 日期类型。
- 前32位是一个 time_t 值(与Unix新纪元相差的秒数)
- 后32位是在某秒中操作的一个递增的序数
- 在单个 mongod 实例中,时间戳值通常是唯一的。
在复制集中, oplog 有一个 ts 字段。这个字段中的值使用BSON时间戳表示了操作时间。
BSON 时间戳类型主要用于 MongoDB 内部使用。在大多数情况下的应用开发中,你可以使用 BSON 日期类型。
日期
表示当前距离 Unix新纪元(1970年1月1日)的毫秒数。
日期类型是有符号的, 负数表示 1970 年之前的日期。
日期类型是有符号的, 负数表示 1970 年之前的日期。
层次结构
database(数据库)
默认数据库为DB库,该库存储在data目录中
单个实例可以创建多个库,每个库都有自己的集合和权限,存放在单个文件中
系统数据库
admin
从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local
这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config
当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
collection(集合)
集合没有固定的结构,可以插入不同格式和类型的数据,
但通常情况下我们插入集合的数据都会有一定的关联性
但通常情况下我们插入集合的数据都会有一定的关联性
当第一个文档插入时,集合就会被创建。
命名规范
集合名不能是空字符串""。
集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
集合名不能以"system."开头,这是为系统集合保留的前缀。
用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
capped collections(固定大小的集合)
Capped collections 是高性能自动的维护对象的插入顺序。
它非常适合类似记录日志的功能和标准的 collection 不同,你必须要显式的创建一个capped collection,指定一个 collection 的大小,单位是字节。
collection 的数据存储空间值提前分配的。
Capped collections 可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以当我们更新Capped collections 中文档的时候,更新后的文档不可以超过之前文档的大小,这样话就可以确保所有文档在磁盘上的位置一直保持不变。
它非常适合类似记录日志的功能和标准的 collection 不同,你必须要显式的创建一个capped collection,指定一个 collection 的大小,单位是字节。
collection 的数据存储空间值提前分配的。
Capped collections 可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以当我们更新Capped collections 中文档的时候,更新后的文档不可以超过之前文档的大小,这样话就可以确保所有文档在磁盘上的位置一直保持不变。
注意
在 capped collection 中,你能添加新的对象。
能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。
使用 Capped Collection 不能删除一个文档,可以使用 drop() 方法删除 collection 所有的行。
删除之后,你必须显式的重新创建这个 collection。
在32bit机器中,capped collection 最大存储为 1e9( 1X109)个字节。
能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败 。
使用 Capped Collection 不能删除一个文档,可以使用 drop() 方法删除 collection 所有的行。
删除之后,你必须显式的重新创建这个 collection。
在32bit机器中,capped collection 最大存储为 1e9( 1X109)个字节。
行为类型与循环队列一样。如果没有空间了,最老的文档会被删除以释放空间,新插入的文档会占据这块空间
文档数量不能超过文档数量限制,也不能超过大小限制
一个集合(collection)中的所有的对象都被存放到一个块(chunk)中(默认大小64MB)
document(文档)
文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型
注意
文档中的键/值对是有序的
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)
MongoDB区分类型和大小写。
MongoDB的文档不能有重复的键。
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
命名规范
键不能含有\0 (空字符)。这个字符用来表示键的结尾。
.和$有特别的意义,只有在特定环境下才能使用。
以下划线"_"开头的键是保留的(不是严格要求的)。
元数据
数据库的信息是存储在集合中。它们使用了系统的命名空间:dbname.system.*
名字空间 <dbname>.system.* 是包含多种系统信息的特殊集合(Collection)
dbname.system.namespaces 列出所有名字空间。
dbname.system.indexes 列出所有索引。
dbname.system.profile 包含数据库概要(profile)信息。
dbname.system.users 列出所有可访问数据库的用户。
dbname.local.sources 包含复制对端(slave)的服务器信息和状态。
dbname.system.indexes 列出所有索引。
dbname.system.profile 包含数据库概要(profile)信息。
dbname.system.users 列出所有可访问数据库的用户。
dbname.local.sources 包含复制对端(slave)的服务器信息和状态。
修改集合中对象的限制
在{{system.indexes}}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。
{{system.users}}是可修改的。
{{system.profile}}是可删除的。
{{system.users}}是可修改的。
{{system.profile}}是可删除的。
单个bson文档最大不能超过16M
当文档超过16M的时候,就应该考虑使用引用(DBRef),在主表里存储一个id值,指向另一个表中的 id 值
GridFS用户存储大于16M这样的数据,该数据类型不受限制于16M大小限制
field
基本概念
不显示指定_id字段,则自动生成一个随机的类型为ObjectId的_id值,并将_id字段设置为主键
为了保证轻量及,不支持事物操作
数据文件默认每60秒刷新到磁盘一次
因此Journal文件只需记录约60s的写入数据。日志系统为此预先分配了若干个空文件,这些文件存放在/data/db/journal目录中,目录名为_j.0、_j.1等
MongoDB会积极的预分配预留空间来防止文件系统碎片,从而导致数据文件很大
从备份数据库声明主数据库宕机到选出一个备份数据库作为新的主数据库将花费10到30秒时间
日志相关
系统日志
记录服务器的开关操作,以及运行期间发生的异常信息
mongod -logpath=/data/log/mongodb/serverlog.log -logappend
journal日志
保证数据库在意外断电等异常情况下数据的完整性
开启该功能时,MongoDB会在进行写入时建立一条Journal日志,其中包含了此次写入操作具体更改的磁盘地址和字节。
WiredTiger引擎
(3.2版本后默认引擎)
(3.2版本后默认引擎)
每隔50ms将缓冲的journal数据同步到磁盘
先写入对应的buffer,然后每隔50ms再刷盘到磁盘的journal文件
如果写入操作设置了journal:true,则WiredTiger强制同步日志文件
journal文件大小限制为100MB,因此WiredTiger大约每100MB数据创建一个新的日志文件
基于checkpoint(默认每分钟一次),journal只需要记录最后一次checkpoint之后的写日志
MMAPV1引擎
每100ms进行刷盘
所有写操作都先写入journal,当异常重启后可以使用journal重放恢复
如果客户端的写入速度超过了日志的刷新速度,mongod则会限制写入操作,直到日志完成磁盘的写入。这是mongod会限制写入的唯一情况
oplog主从日志
用于在多台服务器之间备份数据
包含了主节点的每一次写操作
oplog是主节点的local数据库中的一个固定集合
备份节点通过查询这个集合就可以知道需要进行复制的操作。
一个mongod实例中的所有数据库都使用同一个oplog,也就是所有数据库的操作日志(插入,删除,修改)都会记录到oplog中
每个备份节点都维护着自己的oplog,记录着每一次从主节点复制数据的操作。
按顺序保存着所有执行过的写操作,replica sets中每个成员都维护者一份自己的oplog,每个成员的oplog都应该跟主节点的oplog完全一致(可能会有一些延迟)
慢查询日志
使用系统分析器(system profiler)来查找耗时过长的操作。
系统分析器记录固定集合system.profile中的操作,并提供大量有关耗时过长的操作信息,但相应的mongod的整体性能也会有所下降。
一般定期打开分析器来获取信息
系统分析器记录固定集合system.profile中的操作,并提供大量有关耗时过长的操作信息,但相应的mongod的整体性能也会有所下降。
一般定期打开分析器来获取信息
存储引擎
MMAPV1
(3.2之前默认)
(3.2之前默认)
采用Linux操作系统内存映射技术,所以不支持压缩
会尽可能多的使用内存,默认会使用所有的空闲内存,但当别的进程需要使用的时候会释放部分内存
采用集合级锁,导致并发吞吐量较低
善于处理大量插入,更新,删除的操作
WiredTiger
(3.4以上版本默认)
(3.4以上版本默认)
采用文档型锁,吞吐量相对高许多
相比MMAPV1存储索引时WiredTiger使用前缀压缩,更节省对内存空间的损耗
提供压缩算法,可以大大降低对硬盘资源的消耗,节省约60%以上的硬盘资源;
支持snappy(默认)和zlib两种压缩模式
默认每分钟一次checkpoint,及数据持久化
内存引擎
mongo-rocks
Fusion-io
TuKuMX
/dev/null
持久化方式
磁盘写操作默认是延迟执行,写操作可能在两三秒(默认在60秒内)后到达磁盘.例如,如果一秒内数据库收到一千个对一个对象递增的操作,仅刷新磁盘一次.
分片
从非集群分片升级到集群分片(sharding)是无缝操作的过程
一个集合(collection)中的所有的对象都被存放到一个块(chunk)(默认大小 64MB)中.只有当存在多余一个块的时候,才会有多个分片获取数据的选项
更新一个正在被迁移的块(chunk)上的文档时,更新操作会发生在旧的分片(shard)上,然后更改才会在所有权转移(ownership transfers)前复制到新的分片上
movechunk目录里的旧文件
这些文件是在分片(shard)进行均衡操作(balancing)的时候产生的临时文件.
一旦这些操作已经完成,相关的临时文件也应该被删除掉.
目前清理工作是需要手动的
一旦这些操作已经完成,相关的临时文件也应该被删除掉.
目前清理工作是需要手动的
分片操作完成后,数据只会出现在新的分片里(shard).
集群
副本集集群
无仲裁节点(Arbiter)
有仲裁节点(Arbiter)
分片集群
config servers :存储集群所有节点、分片数据路由信息。默认需要配置3个Config Server节点。
mongos: 提供对外应用访问,所有操作均通过mongos执行。一般有多个mongos节点。数据迁移和数据自动平衡。
mongoDB:存储应用数据记录。一般有多个Mongod节点,达到数据分片目的。
mongos: 提供对外应用访问,所有操作均通过mongos执行。一般有多个mongos节点。数据迁移和数据自动平衡。
mongoDB:存储应用数据记录。一般有多个Mongod节点,达到数据分片目的。
0 条评论
下一页