1、MongoDB与关系型数据库的区别:
MongoDB是一个面向文档的数据库,数据结构为键值对组成,文档类似于JSON对象,字段值可以包含数组、其他文档。
MongoDB数据库没有预定模式,文档的键(key)值(value)不是固定的类型与大小,而关系型数据库中每个表的字段都是一样的,灵活性比较差。
MongoDB不具备关系型数据库中的一些功能,比如连接(join)和复杂的多行事务。
2、mongodb提供了何种担保级别(数据一致性)?
mongodb在并发读写操作中,提供了如下几种担保级别:
1)write操作对单个文档是原子性的,比如更新一个文档中的多个域,要么全部更新成功,要么都不更新;那么对于reader而言永远不会看到只有部分更新成功的文档。对于单个mongod实例而言,发生在同一个文档上write操作是序列化的,read也是序列化的。
2)由query限定条件约束正确性,find()和update()操作只会影响那些符合条件的 documents。
3)read操作中使用sort,结果的顺序并不会因为并发写入而破坏。
** mongodb尽管对单个document提供了较强的担保,不过read和write操作可能会访问任意数量的documents,mongodb不会对多个documents的操作提供事务性,也不会将一个将writes操作彼此隔离:
1)“Non-point-in-time”,假如一个read操作开始于t1并开始read,此后t2时间,一个 write操作对某个document提交了update。reader或许会看到更新后的document,即read操作并不是读取t1时刻的数据,而是模糊的,不像mysql事务那样提供了严格的数据隔离级别,所以“不可重复读”是一定会发生的。(即使用mongodb执行“select forupdate”操作将是不安全的)
2)“Non-serializable”,针对不同的document,read和write操作是非序列化的.
3)对于MMAPv1存储引擎,读数据时如果有updated或者delete操作,可能会有些数据“丢失”,即read开始时这些documents符合匹配规则,但是在read期间可能因为被update而不再符合匹配条件。(还是归因于事务与隔离级别)
3、mongodb是否需要很大的内存?
对内存的消耗取决于mongodb使用的存储引擎,目前mongodb支持MMAPv1和wiredTiger两种存储引擎。
MMAPv1:不需要,可以运行在少量内存的机器上;mongodb将会尽可能多的使用空闲内存,这由mmap机制(内存映射文件的方法)决定(系统级别),所以系统资源监控时通常会显示mongodb消耗了大量的内存,不过这种消耗是动态的,如果其他进程需要内存,那么 mongodb将会让步一些内存。这是由操作系统的虚拟内存管理机制决定,这意味着mongodb尽可能多的消耗空间内存,在需要时也会交换数据到磁盘。对于MMAPv1引擎,较大的内存空间可以极大的提升性能。
wiredTiger:这是一个类似于bigtable(基于列族,LSM)的存储引擎,mongodb会使用 wiredTiger cache(高速缓冲器);wiredTiger cache物理内存为:MAX(60% * RAM -1G , 1G) ;如果物理内存超过10G,那么cache的大小为RAM的50%。不过具体消耗多少内 存,可以通过配置文件来限定。mongodb过于消耗内存,所以wiredTiger引擎将改变这一情况!对于mongodb而言,较大的内存对性能的提升,是立竿见影的,无论是哪种引擎。
4、mongodb使用哪种类型的lock
mongodb使用多粒度锁,比如global、database、collection级别,对于wiredTiger引擎还支持document级别的lock。每个级别的锁分为read和write锁,其中read为共享锁(S),write为排它锁(X),意向共享锁(IS)和意向排它锁(IX)表示read或者write操作获取更细粒度的资源的意图,通常而言,如果lock是分级的、Tree结构的,那么在高级别资源上使用意向锁,在最终级别的资源上使用“共享锁”或者“排它锁”。
在mongodb中,资源的锁定级别(或次序)依次为:Global --> Database --> Collection--> Document,粒度逐渐变小,并发能力依次更强。 如果想获取collection的write锁( X,排他锁),那么必须在依次在Global 和相应的Database上获取“意向排它锁”(I), 如果这两个级别上的IX锁获取成功,才能在Collection上“尝试”获取X锁。对于同一个数 据库,可以同时被IS、IX两种模式锁定,但是X锁不能与其他模式兼容,S锁只能与IS模式兼容。
5、什么是存储引擎?
它的职责就是如何在磁盘上存储数据、管理数据;很多数据库,可以支持多种存储引擎,每种引擎可以在特定的使用场景下更加优秀,比如某个引擎可能在大量read操作中性能更高,还有引擎在大量write操作时支撑的并发量更大等等。比如mysq支持mysiam、innodb等。
mongodb目前支持MMAPv1和wiredTiger,在3.0+版本中支持wiredTiger,在3.0之前的版本默认引擎为MMAPv1;在3.2以及之后的版本,默认引擎为wiredTiger。
事务的定义:
当多个用户访问同一份数据时,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据的更新从一个一致性状 态变更为另一个一致性状态,这时有必要引入事务的概念。
Mysql提供了多种引擎支持Innodb和BDB。Innodb存储引擎事务主要通过UNDO日志和REDO日志实现,Myisam和memory引擎则不支持事务。
6、什么是内存映射文件?
memory-mapped文件是操作系统通过mmap()系统调用将文件数据载入内存,mmap()将文件映 射到虚拟内存的一个区域(region)。内存映射文件是MMAPv1引擎的核心。mongodb通过内存映射操作文件内容就像它们在内存中一样,因为整个文件操作全部基于系统调用,mongodb不需要太多的文件、内存管理,性能较高而且实施简单。
内存映射文件的工作方式:
内存映射将数据文件直接以逐字节对应的方式映射到一块虚拟内存中,当mongodb访问documents时将数据文件映射到内存中,那些不被访问的文件不会被映射。一旦映射,文件与内存的映射关系,就允许mongodb就像操作内存一样直接与数据文件交互。