MongoDB是面向集合,灵活架构的文档数据库。
面向集合,意味着数据是由'collection'组成的,每个collection在数据库有一个唯一名称,包含多个文档。colletion类似于关系数据库中的表,但是他们没有任意自定义的架构。
灵活架构,意味着数据库不需要知道存储在collection中的文档结构。实际上,你可以在同一个collection中存储不同结构的文档。
文档,存储的数据是结构化的键值对,key是字符串,value是任意数据类型,包含数组和文档。我们称这种数据格式为“BSON”(Binary Serialized dOcument Notation).
MongoDB是一个运行在linux,windows和OS X 上的服务器进程, 可以是32位或64位应用程序,我们推荐64位运行模式,因为mongoDB在32位模式限制所有数据库大小最大为2GB.
MongoDB进程默认端口是27017.
客户端连接mongoDB进程,安全验证是可选的,假如安全模式被打开,可以执行一系列的操作,比如插入,查询,更新。
MongoDB将数据存储在文件中(默认地方 /data/db/),并使用了内存映射文件来管理数据。
MongoDB能配置自动数据复制和自动故障切换。
MongoDB特点:
对于开发者,MongoDB驱动程序提供一系列操作:
1.查询
基于不同的查询对象或类似SQL “where prddicates” 来查询文档,查询可以被存储,限制了返回结果的大小,可以设置返回跳过部分文档,也可以返回部分方档。
2.插入和更新
插入新文档,更新已存在文档。
3.索引管理
在一个文档中可以在一个key或多个key上创建索引,包括底层,删除索引等。
4.常用命令
任何MongoDB操作可以通过越过正常socket的DB 命令来进行管理。
MongoDB数据文件结构(http://blog.nosqlfan.com/html/3515.html)
1.每个数据库有相应的数据文件和命名空间文件。
2.数据文件从16MB开始,新的数据文件比上一个文件大一倍,最大为2GB。
ls -lh /data/db
mongod.lock 6ytes
test.ns 16MB
test.0 64MB
test.1 128MB
test.2 256MB
....
test.30 2048MB
3. 文件使用MMAP进行内存映射,会将所有数据文件映射到内存中,但是只是虚拟内存,只有访问到这块数据时才会交换到物理内存。
MMAP
maps a file on disk into memeory
virtual memory NOT Physical RAM
4.MongoDB的数据文件映射到内存表中的位置
5.使用32位机器的话,内存地址最大可以标识4GB内存。
232 = 4GB?
6.但是在32位机器上,4GB内存会有1GB被内核占用,大约0.5GB会用于mongod进程的stack空间,只剩下大约2.5GB可用于映射数据文件。
7.在64位机器上则最多可以表示128TB空间。
264 = 1.7 x 1010 GB?
0xF0 ~ 0xFF kernel
0x00 ~ 0x7F User
247 = 128 TB (GOOD)
8.每个数据文件会被会成一个一个的数据块,块与块之间用双向链表连接。
9.在名字空间文件中,保存的是一个hash table,保存了每个名字空间的存储信息元数据,包括其大小,块数,第一块位置,最后一块位置,被删除的块的链表以及索引信息。
10.这些位置通过DiskLoc数据结构进行存储,存储了数据文件编号和块在文件中的位置。
struct DiskLoc{
int fileNum; //the '0' in test.0
int offset; // position in file
}; // 64Bits
DiskLoc :
A pointer to a location on disk
11. 对于每一个块来说,其头部包含了一些块的元数据,比如自己的位置,上一个和下一个块的位置以及块中第一条和最后一条记录的位置指针。剩下的部分用于存储具体的数据,具体数据之间也是通过双向链接来进行连接。