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

1、取消Ceph集群的noout设置:
2、停止对应OSD的进程,命令格式如下:
    3、下刷journal到osd,使用 -i 指定需要替换journal的OSD编号,命令格式如下:
    1. ceph-osd -i {id} --flush-journal
    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. "osd_journal": "/var/log/ceph-0/journal",
    2. "osd_journal_flush_on_shutdown": "true",
    3. "osd_journal_size": "1024",

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

    5、通过新的分区重建journal,先查看新分区的uuid,命令格式如下:
    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 指定
      8、启动OSD,命令格式如下:
      9、取消noout,命令格式如下:
      1. ceph osd unset noout
      10、使用 ceph -s 或 ceph health detail 检查集群状态

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

      1、使用方法一种1~3步,设置noout、停止OSD进程、下刷journal,以osd.1为例,以下命令可以参考:
      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}
      1. sgdisk --load_backup=/tmp/backup_journal_sdb /dev/sdc

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

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

        7、使用ceph -s或检查集群状态