Mongodb 笔记 —- Storage Engine

Mongodb 笔记 —- Storage Engine

8 6 月, 2019 阅读 687 字数 1014 评论 0 喜欢 0

WiredTiger 

  • 提供document级的锁。
  • 以B-tree方式存放数据。
  • 以Collection为单位生成数据文件。
  • 每50ms或者达到100MB 从内存把数据同步到 journal 。每份journal 大约100MB.。
  • 每60秒(或者3.6版本以前,2GB文件大小为标准)创建一个checkpoint,把数据以snapshot的方式存放到硬盘上。
  • 工作的时候,先写到unused-data 文件,之后再后台放入数据文件中。
  • upate时,实际上是写入一个新的doucument 而不是覆盖原有的数据 (MMAPV1为覆盖),也就是说旧数据会删除但空间不会被释放
  • 4.0 版本开始,replica set成员必须启动journal

Cache

wiredTiger cache :

  • Collection 数据,Uncompressed 与硬盘上存放格式不同
  • Index存放格式也不同,但是压缩了,可以利用prefix 压缩的特性,节省RAM
  • 默认WT cache大小(RAM-1)*50%,最小256MB

File system cache

  • 存储数据为compressed,且于硬盘上存储格式相同。 存在的意义是操作系统为了降低磁盘I/O
  • WT cache没有使用的剩余内存空间,会被FS cache利用。

压缩

每个collection和index 可以使用不同压缩方式

数据压缩:

WT engine 默认启用对于所有collection的压缩

  • snappy, 快,压缩率低 (默认压缩算法)
  • zlib,压缩率高,慢
  • none,不压缩

索引前缀压缩

索引默认使用前缀压缩

MMAPv1 —4.0开始被官方淘汰,以后版本会被正式移除

  • collection级锁
  • Writes 原子性由journal提供
  • 每60秒 把数据直接存放到硬盘上。
  • 每100ms 从private-view把数据同步到 journal 。

Padding

数据的存储在硬盘是连续的。padding的目的是为已存储的数据增加提供空间。

Padding存储时,每个文档占用的空间计算:

  • 小于2MB时,使用2的次方倍为单位(Power of 2 sized allocations)
  • 大于等于2MB,每次增加2MB。最大容量64MB。

padding前:

这时候如果d2需要修改,且占用的空间发生增加。就需要移动D2来满足存储,原来D2存储的位置就会空出来。同时还需要修改index对应D2的物理地址。

原D2占用的空间,可以在以后被新的且小于该容量的document占用

padding后:

发表回复

蜀ICP备15005542号