【分析】Ceph文件系统修复机制cephfs-data-scan(1)

一般文件系统采用的fsck命令来维护文件系统一致性,但是fsck对cephfs的难度是非常大的,主要原因在于其机制存在根本的区别:

1. cephfs修复的是一个rados集群数据而非一块磁盘设备;

2. 需要精确的识别数据的所有数据片,及这些数据片所属的inode

3. 大量的元数据不可能全部保存到内存中

4. 数据丢失原因可能在于(1)系统bug导致;(2)由于RADOS同步的灾难性故障——可能到时大量数据丢失;(3)bit位翻转(bitrot)

 

作者:Younger Liu,

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

本文链接地址为:http://blog.csdn.net/younger_china/article/details/76348833


因此,Cephfs提供专门的工具ceph-data-scan来检查和维护文件系统的一致性。

1     cephfs-data-scan

cephfs-data-scan根据数据存储池中的内容重新生成丢失文件和目录的元数据对象。这要分三步完成,首先,初始化;其次,扫描所有对象以计算索引节点的尺寸和 mtime 元数据;最后,从每个文件的第一个对象扫描出元数据并注入元数据存储池。

cephfs-data-scan init

cephfs-data-scan scan_extents

cephfs-data-scan scan_inodes

如果数据存储池内的文件很多、或者有很大的文件,这个命令就要花费很长时间。要加快处理,可以让这个工具多跑几个例程。先确定例程数量、再传递给每个例程一个数字 N ,此数字应大于 0 且小于 (N - 1) ,像这样:

# Worker 0

cephfs-data-scan scan_extents 0 1

# Worker 1

cephfs-data-scan scan_extents 1 1

 

# Worker 0

cephfs-data-scan scan_inodes 0 1

# Worker 1

cephfs-data-scan scan_inodes 1 1

 

1.1   main分析

Cephfs-data-scan命令保存在src\tools\cephfs\cephfs-data-scan.cc中,其主要流程如下:

1. 调用初始化函数global_init进行参数初始化;

2. 调用函数common_init_finish初始化g_ceph_context,并启动服务线程;

3. 调用函数data_scan.init()初始化DataScan结构体——与MDS建立通信连接,获得MDS map等信息

4. 调用函数data_scan.main(args)执行用户命令。

 

1.2   dataScan结构体分析

DataScan结构体的父类与成员如下图:

 【分析】Ceph文件系统修复机制cephfs-data-scan(1)_第1张图片

1.3   函数DataScan init分析

函数init定义在父类MDSUtility中,其中init,其调用者与被调用者关系图,如下:很明显,datascan结构体主要用户Dumper、JournalTool、cephfs-data-scan、cephfs-table-tool及cephfs-journal-tool,而这些都需要cephfs修复机制相关。

Init的功能是利用网络通信创建message实例获取集群的OSD map、MDS map,流程如下:

【分析】Ceph文件系统修复机制cephfs-data-scan(1)_第2张图片

1.4   函数DataScan main分析

函数主要是执行用户命令,其UML图如下

【分析】Ceph文件系统修复机制cephfs-data-scan(1)_第3张图片


作者:Younger Liu,

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

本文链接地址为:http://blog.csdn.net/younger_china/article/details/76348833



 

你可能感兴趣的:(数据存储,深入理解CEPH系统)