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