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