此篇的调试信息和内容主要参考大神https://blog.csdn.net/a1454927420/article/details/79381134的这篇文章,进行验证。
在继上一篇,单机上利用docker部署ceph集群环境搭建笔记之后,我们来看一下cephfs的元数据和数据对象信息:
# 16、ceph -s命令解释
当我们执行ceph -s的时候,其实ceph -s的全称是:
ceph
--name client.admin
--keyring /etc/ceph/ceph.client.admin.keyring
--conf /etc/ceph/ceph.conf
--cluster ceph
-s
上面参数很好理解,Ceph内部自身使用CephX进行认证,和普通的认证没什么区别,同样需要用户名和密码进行认证,那么这里默认的用户名就叫做client.admin,而默认的秘钥保存位置就位于以下几个位置任一:
/etc/ceph/ceph.client.admin.keyring
/etc/ceph/ceph.keyring
/etc/ceph/keyring
/etc/ceph/keyring.bin
一般我们选择第一个,因为秘钥的命名规则采用/etc/ceph/$cluster.$name.keyring也就是集群名加上用户名再加上keyring的后缀组成。所以在我们执行ceph -s的时候,默认使用的是client.admin用户,同时会去那四个默认位置搜索该用户的秘钥,如果和集群保存的认证信息一致,那么就会显示出集群的状态。
因为我们上面在进行docker部署的时候,这些秘钥信息,是用的/www/这个目录,所以我们如果想要简单的执行ceph -s,就需要将/www/ceph/*目录下的秘钥文件拷贝到/etc/ceph目录下来;
# 17、查看cephfs文件系统的元数据
当我们创建完cephfs以后(执行完步骤11以后),我们来看一下元数据池中存储的元数据:
root@ybelzjlpa9xmngcb-0315223:~/ceph_cluster/mycephfs# rados ls -p cephfs_metadata
2021-10-26 11:14:17.865896 7f57437be700 0 monclient: hunting for new mon
mds0_openfiles.0
609.00000000
mds0_sessionmap
mds_snaptable
608.00000000
400.00000000
601.00000000
602.00000000
600.00000000
603.00000000
mds0_inotable
100.00000000
1.00000000.inode
200.00000000
200.00000001
606.00000000
604.00000000
500.00000000
607.00000000
605.00000000
100.00000000.inode
1.00000000
root@ybelzjlpa9xmngcb-0315223:~/ceph_cluster/mycephfs#
上面的展示的元数据为一个初创文件系统的元数据相关对象。
由此可知,当我们在创建cephfs文件系统后,即使不往文件系统里面写数据,他也是会存在一些对象数据的,这部分对象保存的就是文件系统本身的元数据,对应于我们常说的superblock,根目录的元数据,等相关信息。
这些对象里除了保存了文件系统的元数据,还用做保存cephfs日志,日志是用来恢复mds里的元数据缓存,和还没有应用成对象的元数据。
然后我们在挂载的目录下,创建一个新的目录:
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# mkdir test_dir
然后再查看下文件系统的元数据:
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# rados ls -p cephfs_metadata
2021-10-26 14:13:55.415477 7fc62defc700 0 monclient: hunting for new mon
mds0_openfiles.0
609.00000000
mds0_sessionmap
mds_snaptable
608.00000000
400.00000000
601.00000000
602.00000000
600.00000000
603.00000000
mds0_inotable
100.00000000
1.00000000.inode
200.00000000
200.00000001
606.00000000
604.00000000
500.00000000
607.00000000
605.00000000
100.00000000.inode
1.00000000
//在查看一下创建目录的inode号:
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# ll -i
total 5
1 drwxr-xr-x 1 root root 0 Oct 26 14:13 ./
915713 drwxr-xr-x 3 root root 4096 Oct 26 10:47 ../
1099511627776 drwxr-xr-x 1 root root 0 Oct 26 14:13 test_dir/
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs#
可以看到test_dir目录的inode号为1099511627776;然后他的hex为100 0000 0000;
然后再来看一下metadata中保存的元数据:
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# rados ls -p cephfs_metadata
2021-10-26 14:27:36.970190 7f21be598700 0 monclient: hunting for new mon
mds0_openfiles.0
609.00000000
mds0_sessionmap
mds_snaptable
608.00000000
400.00000000
601.00000000
602.00000000
10000000000.00000000
600.00000000
603.00000000
mds0_inotable
100.00000000
1.00000000.inode
200.00000000
200.00000001
606.00000000
604.00000000
500.00000000
607.00000000
605.00000000
100.00000000.inode
1.00000000
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs#
可以看到多了一个10000000000.00000000的对象,这个对象就是我们刚刚创建的目录的test_dir的元数据对象,对象的名称为文件的inode号.偏移值,其中偏移值是在内核里切割文件时给出的。(具体怎么切割和发送数据的,且听下回分解)
然后我们再在test_dir目录下创建一个空文件:
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# cd test_dir/
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs/test_dir# ls
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs/test_dir#
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs/test_dir# touch test_file
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs/test_dir# ll -i
total 1
1099511627776 drwxr-xr-x 1 root root 0 Oct 26 14:35 ./
1 drwxr-xr-x 1 root root 0 Oct 26 14:13 ../
1099511627777 -rw-r--r-- 1 root root 0 Oct 26 14:35 test_file
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs/test_dir#
然后看下这个文件的元数据信息:
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs/test_dir# rados ls -p cephfs_metadata
2021-10-26 14:36:16.600448 7fc7e539a700 0 monclient: hunting for new mon
mds0_openfiles.0
609.00000000
mds0_sessionmap
mds_snaptable
608.00000000
400.00000000
601.00000000
602.00000000
10000000000.00000000
600.00000000
603.00000000
mds0_inotable
100.00000000
1.00000000.inode
200.00000000
200.00000001
606.00000000
604.00000000
500.00000000
607.00000000
605.00000000
100.00000000.inode
1.00000000
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs/test_dir#
并没有新的元数据对象生成,即使我们上去到mds的服务器容器上强制刷新元数据:
[root@dd2f52aeb014 /]# ceph daemon /run/ceph/ceph-mds.dd2f52aeb014.asok flush journal
{
"message": "",
"return_code": 0
}
然后在看元数据对象信息,还是一样的,跟之前,如下:
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# rados ls -p cephfs_metadata
2021-10-26 14:39:09.128725 7f7a3673f700 0 monclient: hunting for new mon
mds0_openfiles.0
609.00000000
mds0_sessionmap
mds_snaptable
608.00000000
400.00000000
601.00000000
602.00000000
10000000000.00000000
600.00000000
603.00000000
mds0_inotable
100.00000000
1.00000000.inode
200.00000000
200.00000001
606.00000000
604.00000000
500.00000000
607.00000000
605.00000000
100.00000000.inode
1.00000000
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs#
然后再创建一个test_dir2目录,然后再看下元数据信息:
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs/test_dir# cd ..
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# mkdir test_dir2
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs#
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs#
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs#
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# ll -i
total 6
1 drwxr-xr-x 1 root root 0 Oct 26 14:38 ./
915713 drwxr-xr-x 3 root root 4096 Oct 26 10:47 ../
1099511627776 drwxr-xr-x 1 root root 0 Oct 26 14:35 test_dir/
1099511627778 drwxr-xr-x 1 root root 0 Oct 26 14:38 test_dir2/
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# rados ls -p cephfs_metadata
2021-10-26 14:39:19.046819 7ff75423c700 0 monclient: hunting for new mon
mds0_openfiles.0
609.00000000
mds0_sessionmap
mds_snaptable
608.00000000
400.00000000
601.00000000
602.00000000
10000000000.00000000
600.00000000
603.00000000
10000000002.00000000
mds0_inotable
100.00000000
1.00000000.inode
200.00000000
200.00000001
606.00000000
604.00000000
500.00000000
607.00000000
605.00000000
100.00000000.inode
1.00000000
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs#
可见,我们可以看到test_dir2和test_dir目录的元数据,但是看不到test_dir/test_file文件的元数据。
参考(https://blog.csdn.net/a1454927420/article/details/79381134)博客的说法:
因为文件没有下级目录,所以没必要单独弄一个对象来保存元数据,只需要保存在上级目录的元数据里面
那么我们来看下test_file的上级目录test_dir目录的元数据对象信息:
执行命令:
rados -p cephfs_metadata listomapvals 10000000000.00000000
元数据对象信息:
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# rados -p cephfs_metadata listomapvals 10000000000.00000000
2021-10-26 14:46:24.565441 7fd6eb8de700 0 monclient: hunting for new mon
test_file_head
value (488 bytes) :
00000000 02 00 00 00 00 00 00 00 69 02 01 d9 01 00 00 00 |........i.......|
00000010 00 00 00 06 04 cf 01 00 00 11 06 ad 01 00 00 01 |................|
00000020 00 00 00 00 01 00 00 00 00 00 00 b5 a1 77 61 07 |.............wa.|
00000030 5b af 31 a4 81 00 00 00 00 00 00 00 00 00 00 01 |[.1.............|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 02 02 18 00 |................|
00000050 00 00 00 00 40 00 01 00 00 00 00 00 40 00 05 00 |....@.......@...|
00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000070 00 00 01 00 00 00 ff ff ff ff ff ff ff ff 00 00 |................|
00000080 00 00 00 00 00 00 00 00 00 00 b5 a1 77 61 31 8d |............wa1.|
00000090 7b 31 b5 a1 77 61 31 8d 7b 31 01 00 00 00 00 00 |{1..wa1.{1......|
000000a0 00 00 03 02 28 00 00 00 00 00 00 00 00 00 00 00 |....(...........|
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000000d0 03 02 38 00 00 00 00 00 00 00 00 00 00 00 00 00 |..8.............|
000000e0 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 |................|
000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000100 00 00 00 00 00 00 b5 a1 77 61 07 5b af 31 03 02 |........wa.[.1..|
00000110 38 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |8...............|
00000120 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 |................|
00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000140 00 00 00 00 b5 a1 77 61 07 5b af 31 04 00 00 00 |......wa.[.1....|
00000150 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 |................|
00000160 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 |................|
00000170 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff |................|
00000180 00 00 00 00 01 01 10 00 00 00 00 00 00 00 00 00 |................|
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b5 a1 |................|
000001b0 77 61 c8 fb f4 2a 00 00 00 00 00 00 00 00 ff ff |wa...*..........|
000001c0 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
000001d0 00 00 00 00 00 00 00 00 00 00 00 00 fe ff ff ff |................|
000001e0 ff ff ff ff 00 00 00 00 |........|
000001e8
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs#
我们可以看到test_dir目录的对象里保存了子目录和子文件的名称和inode编号(注意:因为linux是小端模式,看内存数据得倒着看),这样就可以建立一个文件系统数的元数据对应关系。
# 18、查看cephfs文件系统的数据池中的数据
我们在上一步中,在test_dir目录下创建一个一个空的test_file文件,
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# ll -i test_dir
total 1
1099511627776 drwxr-xr-x 1 root root 0 Oct 26 14:35 ./
1 drwxr-xr-x 1 root root 0 Oct 26 14:38 ../
1099511627777 -rw-r--r-- 1 root root 0 Oct 26 14:35 test_file
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs#
可以看到test_file文件的inode号为1099511627777;换算成16进制hex=10000000001.00000000;
接下来我们来看下数据池中目前有那些对象数据:
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# rados ls -p cephfs_data
2021-10-26 15:04:31.269499 7f3fa6bfe700 0 monclient: hunting for new mon
10000000001.00000000
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs#
可以明显的看到数据池中的数据,存在10000000001.00000000对象数据,他就是test_file文件的对象,所以即使是空文件,也会在数据池中有记录。
所以不管是元数据池还是数据池,对象的名称都为文件的inode号.偏移值。偏移值是在内核里切割文件时给出的。
然后再来看一下这个对象的数据内容:
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs# rados -p cephfs_data listomapvals 10000000001.00000000
2021-10-26 15:11:52.115247 7f0eab644700 0 monclient: hunting for new mon
root@ybelzjlpa9xmngcb-0315223:/mnt/mycephfs#
可以看到这个对象中没有数据。