方法一、创建一个journal分区,在上面新建journal

1、取消Ceph集群的noout设置:
  1. ceph osd set noout
2、停止对应OSD的进程,命令格式如下:
  1. systemctl stop ceph-osd@{id}
3、下刷journal到osd,使用 -i 指定需要替换journal的OSD编号,命令格式如下:
  1. ceph-osd -i {id} --flush-journal

以osd.0为例,以下命令输出信息可以参考:

  1. $ ceph-osd -i 0 --flush-journal
  2. 2018-08-07 14:26:49.634696 7f0f3cf7dd80 -1 journal FileJournal::_open: disabling aio for non-block journal. Use journal_force_aio to force use of aio anyway
  3. 2018-08-07 14:26:49.634821 7f0f3cf7dd80 -1 journal do_read_entry(94208): bad header magic
  4. 2018-08-07 14:26:49.634843 7f0f3cf7dd80 -1 journal do_read_entry(94208): bad header magic
  5. 2018-08-07 14:26:49.636629 7f0f3cf7dd80 -1 flushed journal /var/log/ceph-0/journal for object store /var/lib/ceph/osd/ceph-0
4、删除旧的journal,命令格式如下:
  1. rm -rf {journal_url}

如果这里不清楚旧的journal存放路径,可以在停止OSD之前,执行ceph daemon osd.{id} config show | grep osd_journal,以osd.0为例,以下命令可以参考

  1. $ ceph daemon osd.0 config show | grep osd_journal
  2. "osd_journal": "/var/log/ceph-0/journal",
  3. "osd_journal_flush_on_shutdown": "true",
  4. "osd_journal_size": "1024",

从输出信息可以看到osd.0的journal存放路径为 /var/log/ceph-0/journal

5、通过新的分区重建journal,先查看新分区的uuid,命令格式如下:
  1. $ ll /dev/disk/by-partuuid/
  2. total 0
  3. lrwxrwxrwx 1 root root 10 Aug 7 14:35 0f950dc0-e9f5-4ac3-b456-7fd9d0bd3147 -> ../../sdc1
  4. lrwxrwxrwx 1 root root 10 Aug 7 14:11 72573aea-260d-414d-82b2-e9c8ba00bd3f -> ../../sdb1
  5. lrwxrwxrwx 1 root root 10 Aug 7 14:35 b5327abd-488b-4b39-98a5-7b6d97c84b09 -> ../../sdc2
  6. lrwxrwxrwx 1 root root 10 Aug 7 14:11 d3f29a95-a04a-46ce-bc0e-3a057c794760 -> ../../sdb2

新的分区以sdc2为例,对应的uuid为b5327abd-488b-4b39-98a5-7b6d97c84b09

6、新建journal的链接和journal_uuid文件,命令格式如下:
  1. ln -s /dev/disk/by-partuuid/{uuid} /var/lib/ceph/osd/ceph-{id}/journal
  2. echo {uuid} > /var/lib/ceph/osd/ceph-{id}/journal_uuid

以osd.0和sdc2为例,以下是一个可供参考的示例:

  1. ln -s /dev/disk/by-partuuid/b5327abd-488b-4b39-98a5-7b6d97c84b09 /var/lib/ceph/osd/ceph-0/journal
  2. echo b5327abd-488b-4b39-98a5-7b6d97c84b09 > /var/lib/ceph/osd/ceph-0/journal_uuid
7、为OSD创建journal,使用 -i 指定
  1. ceph-osd -i {id} --mkjournal
8、启动OSD,命令格式如下:
  1. systemctl start ceph-osd@{id}
9、取消noout,命令格式如下:
  1. ceph osd unset noout
10、使用 ceph -s 或 ceph health detail 检查集群状态

方法二、转移journal分区到新的分区上(适合整盘替换)

1、使用方法一种1~3步,设置noout、停止OSD进程、下刷journal,以osd.1为例,以下命令可以参考:
  1. ceph osd set noout
  2. systemctl stop ceph-osd@1
  3. ceph-osd -i 1 --flush-journal
2、备份要替换的journal的分区表,命令格式如下:
  1. sgdisk --backup={back_dir} /dev/{hdd}

以sdb为例,以下命令可以参考:

  1. sgdisk --backup=/tmp/back_journal_sdb /dev/sdb
3、还原分区表,命令格式如下:
  1. sgdisk --load-backup={back_dir} /dev/{hdd}

以新的磁盘sdc为例,以下命令可以参考:

  1. sgdisk --load_backup=/tmp/backup_journal_sdb /dev/sdc

新的journal磁盘跟老的journal磁盘分区表是一样的,UUID也是相同的。通过这种方式还原,不需要在修改journal的软链。由于UUID是一样的,所以需要将老的磁盘拔掉或者清理掉分区,以免冲突。

4、重建journal,命令格式如下:
  1. ceph-osd -i {id} --mkjournal
5、启动进程,命令格式如下:
  1. systemctl start ceph-osd@{id}
6、取消noout设置,命令格式如下:
  1. ceph osd unset noout

7、使用ceph -sceph health detail检查集群状态