MongoDB概述与存储结构_第1页
MongoDB概述与存储结构_第2页
MongoDB概述与存储结构_第3页
MongoDB概述与存储结构_第4页
MongoDB概述与存储结构_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

mongoDB的概述与存储结构汇报人:※※※2023/2/4101第一章mongoDB概述02第二章存储体系结构背后的故事硬实力软实力Contents目录崛起的法宝2023/2/42背后的故事1崛起的法宝2第一章mongoDB概述2023/2/43背后的故事——Web2.0来袭1.互联网应用用户量剧增2.数据量呈几何级数增长3.高并发的读写2023/2/44背后的故事——RDBMS的困境1.数据库并发负载高2.海量数据存储和访问3.数据库数据越来越大4.事务管理的负担5.对关系型数据库读/写实时性的忽略6.多表关联查询被弱化2023/2/45背后的故事——NoSQL的崛起NoSQL全称是NotOnlySql,指的是非关系型的数据库。NoSQL数据库主要应用于web2.0的大规模系统,具有模式灵活、最终一致性、面向海量数据、分布式、开源、水平可扩展、配置简单、非关系型等特点。存储类型NoSQL产品特性列式存储Hbase、CassandraHypertable按列存储数据,最大的特点是方便存储结构和半结构化数据,方便做数据压缩,针对某一列或者某几列的查询有非常大的I/O优势键值存储Redis、TokyoCabinetTokyoTyrant、Flare可以通过键快速查询到值。一般来说,存储不管值的格式,照单全收文档式存储MongoDB、CouchDB文档存储一般用类似JSON格式存储,存储的内容是文档类型的,这样也就有机会对某些字段建立索引,实现关系型数据库的某些功能对象式存储db4oVersant通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据2023/2/46背后的故事——mongoDB的前世今生2007年10月,MongoDB由10gen团队所发展,2009年2月首度推出MongoDB是一个介于关系数据库和非关系数据库之间的产品MongoDB是由C++语言编写的开源数据库系统MongoDB服务端可运行在Linux、Windows或OS

X平台,支持32位和64位应用2023/2/47崛起的法宝——vsRDBMS2023/2/48崛起的法宝——数据模型MongoDB数据库是一个面向集合且模式自由的文档类型数据库。1.面向集合面向集合是指数据被分组存在在数据集中,被称为一个集合(Collencton==table)。集合类似于关系型数据库的表(table),不同于表的是,集合不需要定义任何模式,集合在存储文档,一个文档类似于关系型数据库的一条记录。在MongoDB中,要操作一个表并不需要创建它,可以直接往集合中插入数据,如果集合不存在,它会自动创建这个集合。2.模式自由模式自由就是对存储在MongoDB数据库中的数据,我们不需要知道它是什么结构(可以是任何的文档)。3.文档型文档型存储的数据是键值对的集合,键是字符串,值可以是数据类型集合中的任意类型,包括数组和文档。我们把这个数据格式称为BSON(BinarySerializedDocumentNotation)2023/2/49崛起的法宝——功能性1.完整的索引支持:可以对文档创建索引,甚至还可以对内嵌文档以及数组创建索引。MongoDB的查询优化器会自动分析查询语句,然后生成一个高效的查询集合。2.动态查询:MongoDB的查询指令使用JSON形式,使查询表达式变得非常丰富,还可以非常容易地查询文档中的内嵌对象和数组。3.查询监视:MongoDB提供了很多性能监视工具,用于分析数据库操作的性能。

2023/2/410崛起的法宝——功能性(续)4.复制及自动故障转移:MongoDB数据库支持服务器之间的复制,从节点可以复制主节点的数据,主节点的所有对数据的操作都会同步到从节点。从节点的数据跟主节点的数据是完全一样的,以作备份。主节点发生故障之后,从节点可以升级为主节点,也可以通过从节点对故障主节点进行数据恢复。5.高效地传统存储方式:支持二进制数据及大型对象(如视频),可以将图片文件甚至视频转换成二进制的数据存储到数据库中。6.自动分片以支持云级别的伸缩性:可以水平扩展数据库集群,动态添加片(服务器)。2023/2/411崛起的法宝——其他招式1.拓展功能强大2.便于管理3.适用于多种场合2023/2/412硬实力1软实力2第二章存储结构2023/2/413HDDSSD随机访问(IOPS)12512000

(100x)顺序读写(Throughput)~100MB/s~200MB/s(2x)VS.硬实力——磁盘数据的存储总离不开磁盘,因此mongodb的数据存储设备当然也只能是磁盘。官方建议采用SSD固态硬盘。mongodData

file

SSD

Journal

HDDLog

HDD优化的IO部署方案数据IO:随机访问为主{

x:

12

}DiskLoc:

xxRead:

DiscLoc:

xxDisckLoc:

xx123无冗余写性能一般写入速度慢条带化+镜像性能好+数据冗余建议的RAIDLevel硬实力——存储引擎存储引擎是数据库管理系统的一个重要组成部分。它的主要职责就是负责把数据存储到硬盘和把数据从硬盘检索出来。MySQL和Riak均支持多个不同的存储引擎。不同的存储引擎对不同的应用需求有特别的优化。如某个存储引擎可以是专为高并发写设计的,而另一个则是为高压缩率设计从而达到节省磁盘空间的目标。mongoDB默认采用的存储引擎是操作系统底层提供的内存映射文件(MMAP)(至今也只有一种)。2023/2/418硬实力——内存映射物理内存010000硬盘480200480虚拟内存100000200

mmap()Pagefault,10ms页面不在内存,缺页中断

10ms页面已在内存,50us1234硬实力——故障恢复复制集一个典型的集群结构如下:Shards

每一个shard包括一个或多个服务和存储数据的mongod进程(mongod是MongoDB数据的核心进程),典型的每个shard开启多个服务来提高服务的可用性。这些服务/mongod进程在shard中组成一个复制集。硬实力——负载均衡2023/2/421软实力——数据类型null

布尔

ture|false整数

123浮点

12.3字符串

“helloworld”对象ID

用newObjectId()来申明。日期用newDate()来申明时间戳数组

[“apple”,”blanan”,”pear”]内嵌文档{“username”:“jone”,“age”:13,“contact”:{“home”:”123”,”moblie”:”456”}}RegExp

正则表达式/[a-z]/2023/2/422数字型表示MongoDB对整型数字的存储分两个级别,一个32位的,一是64位的。浮点数MongoDB仅支持64位的双精度浮点数。整数表示法:64位浮点数表示法:0000000000000000000000000000000000000000000000000000000000000001mongo内部,所有数字都是用long存储,所以单个数字是8字节2023/2/423字符型表示MongoDB的所有字符均采用UTF-8编码。UTF-8(8-bitUnicodeTransformationFormat)是一种针对Unicode的可变长度字符编码,又称万国码。由KenThompson于1992年创建。现在已经标准化为RFC3629。UTF-8用1到6个字节编码UNICODE字符。2023/2/424日期表示日期类型存储是从标准纪元开始的毫秒数,不存储时区。JavaScript中,Date对象用作MongoDB的日期类型,由于JavaScript本身的特性,创建一个Date对象时,通常会调用newDate(…)而不是使用Date(…)。因为调用Date(…)实际返回的是对日期的字符串表示,而不是真正的Date对象。格式:{“date”:newDate()}

2023/2/425ObjectID详解不同的机器都能用全局唯一的同种方法方便的生成它。ObjectId使用12字节的存储空间,其生成方式如下:4e931cb6edcd881e1900017f时间戳机器IDPID计数器时间戳保证秒级唯一,机器ID保证设计时考虑分布式,避免时钟同步,PID保证同一台服务器运行多个mongod实例时的唯一性,最后的计数器保证同一秒内的唯一性。2023/2/426字符串表示由于字符采用的UTF-8编码,目的就是为了实现字符串的可变格式和可变长度。\0标识字符

串长度字符串内容参考:/html/3586.htmlLEN=n+5=长度(4字节)+字符串(n字节)+(1字节)2023/2/427BSON格式存储例:{a:'12'}BSON结构如下:Len|vtype|key|0|v|E

长度|value类型|key|0|value|结束符号

4|1|1|1|2|1=10字节2023/2/428软实力——文件在MongoDB内部,每个数据库都包含一个.ns文件和一些数据文件,而且这些数据文件会随着数据量的增加而变得越来越多。所以如果系统中有一个叫做test的数库,那么构成test这个数据库的文件就会由test.ns,test.0,test.1等等组成。其中*.ns是包含命名空间的文件,保存该数据库数据的相关信息。*.0和*.1是数据文件。32位系统的MongoDB服务器每一个Mongod实例只能使用2G的数据文件。这是由于地址指针只能支持32位。2023/2/429命名空间在数据文件内部,每个数据库都是按照命名空间组织的,一种类别的数据与其他类别的分开存放。每个集合的文档都有自己的命名空间,索引也是。命名空间的元数据存放在数据库的.ns文件中。每个命名空间的数据都被分成若干组,放到数据文件的某一区域内,这个区域称为数据域。在图中可以看到数据库foo有3个数据文件,其中第

3个是预分配的空文件。前两个数据文件被分成几个数据域,属于几个不同的命名空间。2023/2/430软实力——存储过程2023/2/431下图展示了数据库是如何跟底层系统打交道的虚拟地址空间2023/2/432内部文件格式在名字空间文件中,保存了每个名字空间的存储信息元数据,包括其大小,块数,第一块位置,最后一块位置,被删除的块的链表以及索引信息2023/2/433块结构各个Extent(块)采用双链表的形式连接2023/2/434块和记录各个文档数据也是采用双链表的形式连接2023/2/435块相关特性1.每一条记录在块内从4的倍数的字节处开始2.块的大小不会动态扩增3.尽量数据不跨块,但若记录的大小大于一个块的大小,必然会跨块4.相似记录计量保持在同一个块中2023/2/436软实力——选择查询MySQL:

SELECT*FROMuserMongo:

db.user.find()MySQL:

SELECT*FROMuserWHEREname='foobar'Mongo:

db.user.find({'name':'foobar'})2023/2/437MySQL:

INSERTINTOuser(`name`,`age`)values('foobar',25)Mongo:

db.user.insert({'name':'foobar','age':25})ifyouwantaddacolumn`email`onMySQL,youmust:

ALTERTABLEuser….ButinMongo,youcanjust:

db.user.insert({'name':'foobar','age':25,'email':'foo@'})软实力——插入2023/2/438

MongoDB在执行插入时,首先,会将插入的数据转换成BSON格式;然后,MongoDB数据库会对BSON进行解析,并且检查是否存在“_id”键(_id键在插入数据库时MongoDB会自动生成)。MongoDB还对文档的大小做了限制。1.8之前的版本,文档不能超过4MB;1.8之后的版本支持16MB。除了这些之外,没有别的数据校验,就是简单的将文档原样存入数据库中。这样做的坏处是允许插入无限数据;好处就是不会受到注入式攻

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论