创建pool
1 | To create a pool, execute: |
测试journal文件rename
put一个object
rados put testobj ~/truck-dis-6.5.tar.gz --pool=testpool
获取object的map信息
ceph osd map testpool testobj
到对应的osd上把journal文件重命名为别的随意名字
mv journal bak.journal
get这个object
rados get testobj tst.tar.gz --pool=testpool
对比get的object和源object一致
diff tst.tar.gz ~/truck-dis-6.5.tar.gz
删除该object
rados rm testobj --pool=testpool
重新put该object
rados put testobj ~/truck-dis-6.5.tar.gz --pool=testpool
get这个object
rados get testobj tst.tar.gz --pool=testpool
对比get的object和源object一致
diff tst.tar.gz ~/truck-dis-6.5.tar.gz
结论
测试发现即使把osd的journal mv到新的文件,osd的写操作还是会更新到这个journal文件的,感觉是osd一直持有journal的文件句柄。
FileJournal定义:
1 | class FileJournal : public Journal { |
journal初始化fd:
1 | OSD::init() -> FileStore::mount() -> JournalingObjectStore::journal_replay() -> FileJournal::open() -> FileJournal::_open() |
journal close fd:
1 | OSD::shutdown() -> FileStore::umount() -> JournalingObjectStore::journal_write_close() -> FileJournal::close() |
journal写数据:
1 | FileJournal.Writer.entry() -> FileJournal::write_thread_entry() -> FileJournal::do_write() -> FileJournal::write_bl() |
模拟journal文件不可读
后续把某个osd的journal文件配置在别的硬盘上,然后把journal在的硬盘offline,写object返回error,该osd变为down状态。
1 | echo offline > /sys/block/sdm/device/state |
分析journal文件
journal文件其实就是创建的时候在文件最前面写一个header
1 | struct header_t { |
验证:
1 | OSD journal get fsid command: |
重做journal
重新make journal:
1 | ceph-osd -i 58 --mkjournal |
这个命令可以创建一个osd的journal文件, 它会读取ceph配置,在osd的目录下生成journal文件,如果journal文件存在就失败
然后用新的journal文件重启osd service成功。
ceph journal其他命令
osd journal flush command:
1 | # ceph-osd -i 58 --flush-journal |
OSD journal dump command:
1 | # ceph-osd -i 58 --dump-journal |