前言
本系列文章将从逻辑正确、内容完整的角度全面介绍WiredTiger存储引擎,
本篇作为WiredTiger存储引擎介绍系列文章第四篇,其它3篇链接如下:
本篇包含以下内容:
- 如何从源码编译出WT工具(mongo官方没有释放这个工具)
- MongoDB在磁盘上到底生成了哪些文件?搞懂每一个文件的内容和所起的作用,对故障分析和数据备份恢复有很大帮助。
自从MongoDB切换到WiredTiger存储引擎后,默认生成的文件名称、格式以及空间分配规则等与早期MMAPv1存储引擎有了很大不同。为了更好的实施数据迁移、备份恢复甚至数据修复等工作,我们需要了解WiredTiger存储引擎在磁盘上生成的文件及其内容。
1.1.1 wt内部工具
WiredTiger生成的磁盘文件基本上是二进制格式,我们并不能直接用编辑工具打开阅读,如果想查看相关元数据(如WiredTiger.wt文件上保存的checkpoint信息),可以使用WiredTiger提供的wt工具来完成。
但由于MongoDB发布时没有将此工具编译进来,所以我们需要自行通过下载WiredTiger的源码将此工具编译出来,如下步骤所述:
- 准备编译环境:
源码是基于C语言的,在主机上(ubuntu server)安装编译相关的包和工具。
apt-get install autoconf automake libtool
- 从github上下载源码:
源码是基于C语言的,在主机上安装编译相关的包和工具。
cd /usr/local
git clone git://github.com/wiredtiger/wiredtiger.git
- 运行autogen.sh生成自动编译的配置文件:
cd wiredtiger
sh autogen.sh
- 编译:
cd wiredtiger
./configure && make
编译的过程中会用到autoconf、automake、libtool这三个标准工具,确保前面步骤已安装好;
- 安装:
make install
成功安装后,默认会在/usr/local/bin目录下生成一个wt命令工具,同时在/usr/local/lib目录下会有一个libwiredtiger-3.2.1.so动态链接库,wt运行时需要依赖这个库,所以将这个库所在目录添加到环境变量中,如下语句:
打开.bashrc文件,vim .bashrc
添加一行:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
确保wt运行时能找到这个库。
wt工具提供了非常丰富的命令,不仅包含mongodb里面的创建表、删除表、查询数据、性能统计及dump数据等命令,还提供了mongodb没有的如salvage(从损坏的表里面恢复数据)等更加底层的命令。
更多详细命令请参考WiredTiger官方网站:
http://source.wiredtiger.com/3.2.1/command_line.html.
1.1.2 元数据相关文件
WiredTiger启动时,会生成数据文件、索引文件、存储checkpoint等信息的元文件、实现数据持久化和数据库恢复的事务日志文件以及用于诊断分析的数据库运行日志文件。本章节我们将重点分析daPath参数指定的data目录下的文件和文件夹,这些文件是MongoDB启动运行必须的核心文件,了解这些文件包含的内容有助于我们更好地完成数据库迁移、修复及备份恢复等工作。
下面先看下磁盘上整体生成的文件,如下图所示:
图:WiredTiger在磁盘上生成的data目录下的文件
详细文件信息描述如下:
- collection-xxx.wt和index-xxx.wt类文件:
这是数据库中集合所对应的数据文件和索引文件。
可以通过如下命令查看集合在磁盘上对应的索引文件和数据文件:
> db.account.stats({“indexDetails”:true})
输出的统计信息较多,关键信息提取如下:
“uri” : “statistics:table:collection-7-16963667508695721” ,对应磁盘上account集合的数据文件名称。
“uri” : “statistics:table:index-8-16963667508695721”,对应磁盘上account集合的索引文件名称。
注意:如果集合包含多个索引,则会有多个索引文件在磁盘上与之对应。
- WiredTiger.lock文件:
这是WiredTiger运行实例的锁文件,防止多个进程同时连接同一个Wiredtiger实例。
如MongoDB启动后,默认被当作一个应用连接到WiredTiger(表示文件锁已被占用),当想执行其它wt命令时会报如下错误:
wiredtiger_open: __posix_file_lock, 391: ./WiredTiger.lock: handle-lock: fcntl: Resource temporarily unavailable
wiredtiger_open: __conn_single, 1682: WiredTiger database is already being managed by another process: Device or resource busy
- mongod.lock文件:
这是MongoDB启动后在磁盘上创建的一个与守护进程mongod相关的锁文件,这个文件会记录mongod在运行过程中的一些状态信息,当正常关闭mongod时,会清除mongod.lock文件里面的内容;如果mongod.lock文件内容没有被清除,则说明mongod非正常的关闭;
- storage.bson文件:
这是一个BSON格式的二进制文件,其内容与WiredTiger存储引擎的配置有关,可以通过MongoDB提供的bsondump命令工具查看其内容。
执行如下命令:
./bin/bsondump storage.bson
输出信息如下:
{“storage”:{“engine”:”wiredTiger”,”options”:{“directoryPerDB”:false,”directoryForIndexes”:false,”groupCollections”:false}}}
- sizeStorer.wt文件:
存储所有集合的容量信息,如集合中包含的文档数、总数据大小。
注意:如果MongoDB数据库实例非正常关闭,可能有insert/delete等操作修改的数据并没有持久化,因此集合中的文档记录和元数据文件sizeStorer.wt保存的记录数可能不一致。
- _mdb_catalog.wt文件:
存储的是集合表名与磁盘上数据文件和索引文件间的对应关系。这个映射关系也可以通过前面介绍的集合命令:db.account.stats({“indexDetails”:true})获得。
- WiredTigerLAS.wt文件:
存储的是内存里面lookaside table的持久化的数据。当对一个page进行reconcile时,如果系统中还有之前的读操作正在访问此page上的修改数据,则会将这些数据保存到lookaside table;当page再被读时,可以利用此lookaside table中的数据重新构建内存page。
- WiredTiger.wt文件:
存储的是所有集合(包含系统自带的集合)相关数据文件和索引文件的checkpoint信息。
- WiredTiger文件:
存储的是WiredTiger存储引擎的版本号,编译时间等信息。
- WiredTiger.turtle文件:
存储的是WiredTiger.wt这个文件的checkpoint数据信息。相当于对保存有所有集合checkpoints信息的文件WiredTiger.wt又进行了一次checkpoint。
- diagnostic.data文件夹:
存放的是MongoDB启动运行时的诊断数据。
- journal文件夹:
开启Jouranl日志功能后,存放的是Write ahead log事务日志,当数据库意外crash时,可通过log来恢复数据。
评论笔记:WiredTiger.lock 的作用是防止多个进程同时连接同一个Wiredtiger实例;
实际上,一台服务器上是可以有多个Wiredtiger实例和mongod实例的。
一开始我理解成了 只能有一个实例~
突然想到,WiredTiger.turtle的checkpoint信息又由谁来负责呢