-
MongoDB采用BSON(Binary JSON)来进行数据存储与编码传输。BSON的主要优势在于改进存储结构,使检索速度更快。例如:BSON在实际存储时,会将各个字段长度存储在字段头部。
-
BSON数据结构:
*ObjectID:对象ID,每个文档必须有一个唯一的ID。ID一般为12字节的二进制数据。包括4个字节的时间戳、3个字节设备ID、3个字节计数器、2个字节进程ID。
*String:utf-8编码的字符串,在文档中使用双引号引用。
*Boolean:布尔值,true或者false,在文档中不使用引号引用。
*Integer:整数,不用引号引用,具有32位(int)和64位(long)两种类型。
*Double:浮点数,不用引号引用
*Arrays:数组或者列表
*Object:嵌入文档,一个值为一个文档
*Null:空值
*Timestamp:时间戳
*Minkey/Maxkey:BSON中的最低值和最高值
*Date:UNIX格式的日期和时间。
*BinaryDate:二进制数据
-
分片机制:MongoDB将数据水平切分机制称为分片(Sharding),支持对文档的自动分片技术。分片的依据是分片键(Shard Keys)。分片键可以由文档的一个或多个字段构成,分片键决定集群中数据分布是否均衡等特性。
*MongoDB支持三种分片策略:升序分片、哈希分片、位置分片。
*升序分片会将片键进行升序排列,并在当前分片的数据量达到某个阈值时进行分片,此时所有新写入的数据都分片到最新的数据分片中。
*哈希分片会将片键进行哈希运算,使数据的分布更均匀,新写入的数据可能会平均分配到所有分片中。
*位置分片类似于对片键的前缀或字串机型判断。
*在分片内部,数据在实际存储时还会被分为更小的块,称为chunk。一个chunk默认大小是64M,超过该大小的chunk会被分裂成两个新的chunk。如果不同服务器上chunk数量差异较大,MongoDB可以通过balancer组件将chunk的数量在各节点间平衡。
-
复制集:MongoDB支持多副本,多副本是以主从备份的形式实现的,这种机制称为复制集机制。
*主节点(primary)负责数据的写入和更新,主节点在更新数据的同时,将操作写入日志(oplog)。从节点(secondary)监听主节点oplog变化,根据内容维护自身数据的更新使之和主节点保持一致。
*由于数据写入只通过主节点进行,因此不会出现多方写入引起的数据版本冲突现象,因此写一致性更好。
*用户既可以由主节点读取数据,也可以由从节点读取数据。如果对数据一致性要求较高,应该从主节点读取。
*各节点之间需要相互了解、相互通信、相互检测心跳信息,当主节点宕机时,从节点会检测到该错误,并通过选举等方式,使某一从节点提升为主节点,接管对数据的更新操作。主节点选举算法成为Bully算法,从节点根据时间戳和优先级等属性进行排序,认定表中第一个为主节点。
-
集群架构:存在分片机制时,MongoDB集群中有三种基本角色。
*负责存储实际数据分片的设备成为mongod。
*mongos服务器是用户访问集群的入口,负责与客户端的交互工作,并在内存中缓存分片数据的存储和路由信息。兼具平衡存储的balancer组件功能。
*config服务器:负责持久化存储各类元数据和配置信息,当monogos服务器启动时,会通过config服务器读取相关信息并缓存到内存。
-
存储引擎:
*WiredTiger:目前推荐的存储引擎,支持文档级别的多副本和一致性管理、快照和检查点、操作日志、数据压缩等多种特性。
*In-Memory:指将数据存储在内存中,以加速查询,但不进行持久化存储。
*MMAPv1:MongoDB早期使用的存储引擎综合性不如WiredTiger。但由于存在时间较长,因此对一些外围组件或第三方插件的支持性可能更好。
-
CouchDB和MongoDB的区别:
*MongoDB不是ASF旗下的软件,遵守开源协议为GNU的AGPL3.0。couchDB是ASF旗下的软件,遵循协议Apache License2.0。
*宏观设计较为相似,但是细节上存在一定差异。MongoDB采用C++语言编写,couchdb采用Erlang语言编写。
*couchDB更多的采用通用技术并考虑和ASF其他模块的配合。比如其采用通用的HTTP/REST接口,使得web开发人员更容易使用。MongoDB自定了更高效的、基于TCP/IP的二进制格式协议。
*在数据存储上,couchDB采用json合适传输和存储数据,没有集合的概念。
*在数据查询方面,MongoDB支持动态查询,查询时不需要先建立索引,couchDB不支持动态查询,必须先为查询模式建立视图。
*多副本和数据同步方面:couchDB支持多主节点间的数据复制,理论上多个主节点都可以支持写入操作,并且couchDB支持类似Dynamo的MVCC多版本一致性协调机制。MongoDB只支持主从复制,其一致性更容易维护。
-
数据库操作:查看当前连接的服务器(db.getMongo()) 查看数据库列表(show dbs)切换到某个数据库(use XX)查看数据库中的集合(show collections)删除当前数据库(db.dropDatabase())
-
集合操作:新建(create)删除(drop)
-
文档操作:插入(insert)查询(find)更新(update)删除(remove)聚合(aggregate)
-
索引操作:建立(createIndex)查询(getIndexes)删除(dropIndex)