您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > Mongodb技术分享
Mongodb分享钟秋2015-11-27•1.背景•2.MongoDB入门•3.索引•4.复制•5.分片•6.管理与监控•7.使用优化案例主要内容1.背景•1.1从集中式到分布式•1.2从sql到nosql•1.3分布式一致性问题•1.4CAP和BASE理论•分布式,大型网站架构,大数据交流群:4660975271.1从集中式到分布式•集中式的问题:o计算、存储能力瓶颈o单点问题•分布式的问题:o通信异常o网络分区o三态o节点故障o一致性1.2从SQL到NoSQL•SQLo建立在严格的关系模型基础之上,通常支持复杂的事务操作,提供严格的数据一致性、完整性约束,并且支持关联查询等。o复杂事务,关联查询等特性影响读写性能,同时限制了关系型数据库的分布式扩展能力。•NoSQLonon-relationalonotonlysqlo是对SQL的补充:•高并发读写•海量数据•高可扩展和高可用性o还无法替代SQL:•复杂事务,严格的一致性•读写实时性•joino与SQL不同,NoSQL没有统一的标准,种类繁多(key-value,列式,文档,图),根据业务选择适合的1.3分布式一致性问题•强一致性•弱一致性o…o最终一致性•鱼和熊掌:分布式系统中数据一致性和系统性能之间的关系1.4CAP和BASE理论•CAPoC:ConsistencyoA:AvailabilityoP:Partitiontoleranceo分布式系统中,P是基础,所以一般只能在C、A之间进行取舍。oMongoDB处于哪一部分?•BASEoBasicallyAvailable,Softstate,Eventuallyconsistent2.MongoDB入门•2.1什么是MongoDB•2.2存储引擎与版本选择•2.3mongoshell•2.4mongodb数据模型•2.5数据类型•2.6bson•2.7GridFS•2.8模式设计•2.9CRUD2.1什么是MongoDB•MongoDB是面向文档的,无模式(schema-less)的,支持二级索引,支持冗余、自动故障转移,支持数据分片、负载均衡,易扩展,能为海量数据提供支撑的非关系型数据库。•MongoDB不支持跨多个文档的复杂事务,但保证单文档操作原子性。•MongoDB不支持联接(join)。•MongoDB不支持MVCC(3.xwiredTiger引擎支持)。2.2存储引擎•版本2.8(3.0)开始支持插件式存储引擎•MMAPv1•WiredTiger(since3.0)2.2存储引擎-MMAPv1(1)•读写锁o不支持MVCCoVersion2.2:•只支持进程级锁,一个Mongod实例一个锁。o2.2≤Version2.8:•支持库级锁,一个db一把锁。o3.0.0≤Version•支持collection级别的锁。•内存o内存映射文件o交由操作系统管理,不能手动配置管理o无强制内存量要求o缓存索引、热数据等2.2存储引擎-MMAPv1(2)•Journal日志oJournal日志,是MongoDB的预写日志WAL(类似Mysql的Redolog)。•因为Journal日志文件是磁盘上连续分配的空间,MongoDB在运行时通过顺序追加的方式记录,通过顺序IO来改善写性能。同时,后台会定时刷写Journal日志文件以将写操作持久化到数据文件。通过这种两次写的方式,当Mongodb因为一次非正常退出(比如崩溃),重启mongod进程后会根据journal下的文件来恢复数据以达到数据一致,防止数据丢失。同时,一次正常的退出时MongoDB会刷写并删除journal目录下所有文件。•journal除了故障恢复的作用之外,还可以提高写入的性能,通过批量提交(batch-commit)的方式减少IO次数,一般默认100ms刷新一次到journal,可通过下面参数修改:ostorage.journal.commitIntervalMso值越低,刷新输出频率越高,journal的持久性也就越高(故障意外情况下丢失的数据越少),但同时意味着更多的磁盘IO。o2.0以上版本默认开启的,可以通过nojournal=true或--nojournal关闭,但建议开启。oJournal文件是以“j._”开头命名的,且是appendonly的,如果1个journal文件满了1G大小,mongodb就会新创建一个journal文件来使用,一旦某个journal文件所记载的写操作都被使用过了,mongodb就会把这个journal文件删除。通常在journal文件所在的文件夹下,只会存在2~3个journal文件,除非你使用mongodb每秒都写入大量的数据。o使用smallfiles这个运行时选项可以将journal文件大小减至128M大小。2.2存储引擎-MMAPv1(3)•数据文件o每个db有1个.ns(namespace)和若干个数据文件(.n)构成o数据文件随着数据的增多而增多,默认从64M开始,数据文件每新增一次,大小为上一个数据文件的2倍,上限为2GB。这样的设计有利于防止数据量较小的数据库浪费过多的空间,同时又能保证数据量较大的数据库有相应的空间使用。oMongoDB会使用预分配方式来保证写入性能的稳定(可通过–noprealloc关闭,但不建议)。预分配在后台进行。预分配使得MongoDB始终保持额外的空间和空余的数据文件,从而避免了数据增长过快而带来的分配磁盘空间引起的阻塞。•版本3.0起引入,只支持64位系统,还不是默认的存储引擎,需要手动指定。在即将到来的3.2版本将成为默认引擎。ostorageEngine=wiredTiger•读写锁o通过MVCC实现文档级别锁(更细粒度的锁,大大提高并发读写性能)o以前的微分片,分库分表及其他为提高MMAPv1并发率而实现的变通方案将不再需要2.2存储引擎-WiredTiger(1)MVCC(snapshot,copyOnWrite)2.2存储引擎-WiredTiger(2)•内存•可配置缓存大小(默认为1GB或物理内存的一半)owiredTigerCacheSizeGB=10•压缩•wiredTigerCollectionBlockCompressor=snappy/zlib•wiredTigerIndexPrefixCompression=true•wiredTigerJournalCompressor=snappy/zlib•高效的压缩算法,相比先前版本数据占用更少空间2.2存储引擎-WiredTiger(3)•Snapshots和CheckpointsoSnapshot代表缓存中数据的一个一致性状态下的视图快照。oWiredTiger会以一种一致性的方式将snapshot写到磁盘的所有数据文件上,这些持久化的数据被称为一个checkpoint。o当一个checkpoint在写入过程中,上个checkpoint会保留,如果在这个过程中,系统崩溃,则可以恢复到上一个checkpoint的状态。Checkpoint在此扮演的角色类似一个恢复点(recoverpoint).o一旦一个新的checkpoint写入完成并可访问,则会释放上次的checkpoint。oMongodb每60秒或者每2GBjournal的时候创建一个checkpoint(即将snapshot写到磁盘)•Journalo100MBo避免故障重启后丢失上次checkpoint之后的数据2.2存储引擎-WiredTiger(4)•数据文件odb.collection.stats().wiredTiger.uri2.2版本选择•Mongodb版本:x.y.zoX是主要版本.功能上要么不变要么就做很大的改动。oY是发行版本号.这种版本经常更新功能,包括一些新的特性并且常常不向后兼容。偶数是稳定版本,奇数是开发版本。oZ版本号是用来修改BUG和安全性。•历史版本:2.6.4•当前使用版本:3.0.1和3.0.3(WiredTiger存储引擎)o建议升级到3.0.7•即将发布的新版本:3.2.0oDocumentValidationopartialindexesoreadConcern:{level:majority|local}oleftouterjoin(企业版)2.3mongoshell•DBQuery.shellBatchSize=100•注意数值字面量默认是双精度类型•help2.4mongodb数据模型•和关系型数据库的一个类比:2.4mongodb数据模型•·一个MongoDB实例可以承载多个数据库,它们之间可视为完全独立的,每个数据库都有独立的权限控制,各自的数据文件。•集合就是一组文档,集合可以看作没有模式(shema-less)的表。o特殊集合:CappedCollection,TTLCollection•文档是MongoDB中数据的基本单元,类似于关系数据库中的行。o多个键及其关联的值有序地放置在一起便是文档,类似映射,散列或字典。o文档的键是字符串(不能含有\0,.,$),文档中的值不仅可以是字符串,也可是其他类型。o文档中的键/值对是有序的,不同序则是不同文档。o键是区分大小写的,否则为不同文档。o文档不能有重复的键,否则非法。2.5数据类型–基本类型和$type•db.collection.find({field:{$type:8}});•尽量不要在同一字段上混合类型。•注意js(mongoshell)等一些弱类型语言数值默认都视为浮点数,在使用时记得做类型转换。2.5数据类型–比较排序•当比较不同BSON类型的值时,MongoDB使用如下的比较排序,从低到高为:o注意:在3.0.0中,Date对象排在Timestamp对象之前。先前版本中,Date和Timestamp对象是同等的。2.5数据类型-null{_id:1,cancelDate:null}{_id:2}---------------•db.test.find({cancelDate:null}){_id:1,cancelDate:null}{_id:2}---------------•db.test.find({cancelDate:{$type:10}}){_id:1,cancelDate:null}---------------•db.test.find({cancelDate:{$exists:false}}){_id:2}2.5数据类型-内嵌文档和数组•通过内嵌冗余文档、数组的方式解决一些事务和join查询的需求。•数组元素和内嵌文档字段也可以建索引。•在文档中使用数组的时候,同时在文档中维护数组的长度。•数组元素经常动态增减且元素过多的,不要使用内嵌数组的方式。•数组不是HashSet,尽量不要使用数组来排重。2.5数据类型-ObjectId•_id的默认类型•时间戳(4byte,秒级)+机器标识(3byte)+PID(2byte)+计数器(3byte)•尽量客户端生成,减轻服务端压力2.5数据类型-自定义_id•findAndModifyoCASoReturnnew2.5数据类型-自定义_id•1)简单的方式(SimpleMongoIdGenerator):一次获取一个2.5数据类型-自定义_id•2)池化的方式(PooledMongoIdGenerator):一次获取多个2.6BSON•BinaryJson,传输和存储所使用的格式•16MB•更快的遍历速度,操作更简单,扩充的数据类型,无类似sql注入风险•优化o无需遍历定位,基于记录的长度进行seeko数据存储有类型o长度可能变化的字段尽量靠后(设计)o固定不变的数字使用字符串(设计)2.7GridFS•大于16M•小于16M的二进制数据,使用BinData2.8模式设计-相关因素•设计需要思考和平衡的因素:o程序本身的需求•查询,更新等维护•不变数据,易变数据•数据天然的逻辑层次•数据规模omongodb的性能特点•单文档原子操作•文档
本文标题:Mongodb技术分享
链接地址:https://www.777doc.com/doc-4917889 .html