• 4. 更换 OSD Journal
    • 第一种方法
    • 第二种方法

    4. 更换 OSD Journal


    本篇中部分内容来自 zphj1987 —— 如何替换 Ceph 的 Journal

    Ceph 在一块单独的磁盘上部署 OSD 的时候,是默认把 journal 和 OSD 放在同一块磁盘的不同分区上。有时候,我们可能需要把 OSD 的 journal 分区从一个磁盘替换到另一个磁盘上去。那么应该怎样替换 Ceph 的 journal 分区呢?

    有两种方法来修改 Ceph 的 journal:

    • 创建一个 journal 分区,在上面创建一个新的 journal。
    • 转移已经存在的 journal 分区到新的分区上,这个适合整盘替换。

    Ceph 的 journal 是基于事务的日志,所以正确的下刷 journal 数据,然后重新创建 journal 并不会引起数据丢失,因为在下刷 journal 的数据的时候,osd 是停止的,一旦数据下刷后,这个 journal 是不会再有新的脏数据进来的。

    第一种方法

    1、首先给 Ceph 集群设置 noout 标志。

    1. root@mon:~# ceph osd set noout
    2. set noout

    2、假设我们现在想要替换 osd.0 的 journal。首先查看 osd.0 当前的 journal 位置,当前使用的是 /dev/sdb2 分区。

    1. root@mon:~# ceph-disk list | grep osd.0
    2. /dev/sdb1 ceph data, active, cluster ceph, osd.0, journal /dev/sdb2
    3. root@mon:~# ll /var/lib/ceph/osd/ceph-0/journal
    4. lrwxrwxrwx 1 root root 58 May 24 15:06 /var/lib/ceph/osd/ceph-0/journal -> /dev/disk/by-partuuid/8e95b09d-ffa9-4163-b24c-b78020022797
    5. root@mon:~# ls -l /dev/disk/by-partuuid/
    6. total 0
    7. lrwxrwxrwx 1 root root 10 Nov 8 09:21 39e9ad34-d7aa-4dec-865e-08952aa8aab5 -> ../../sdc1
    8. lrwxrwxrwx 1 root root 10 Nov 8 09:21 8e95b09d-ffa9-4163-b24c-b78020022797 -> ../../sdb2
    9. lrwxrwxrwx 1 root root 10 Nov 8 09:21 aaeca5fa-456a-4f45-8a8b-9de0c2642f44 -> ../../sdc2
    10. lrwxrwxrwx 1 root root 10 Nov 8 09:21 d30a6d4a-6da4-4a81-a9e5-4bc69ebeec8f -> ../../sdb1

    3、停止 osd.0 进程。

    1. stop ceph-osd id=0

    4、下刷 journal 到 osd,使用 -i 指定需要替换 journal 的 osd 的编号。

    1. root@mon:~# ceph-osd -i 0 --flush-journal
    2. SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    3. SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    4. 2016-11-08 13:17:58.355025 7f8351a72800 -1 flushed journal /var/lib/ceph/osd/ceph-0/journal for object store /var/lib/ceph/osd/ceph-0

    5、删除旧的 journal 。

    1. root@mon:~# ll /var/lib/ceph/osd/ceph-0/journal
    2. lrwxrwxrwx 1 root root 58 May 24 15:06 /var/lib/ceph/osd/ceph-0/journal -> /dev/disk/by-partuuid/8e95b09d-ffa9-4163-b24c-b78020022797
    3. root@mon:~# rm -rf /var/lib/ceph/osd/ceph-0/journal

    6、下面用 /dev/sdc2 分区重建 osd.0 的 journal 。查看 /dev/sdc2uuid

    1. root@mon:~# ls -l /dev/disk/by-partuuid/
    2. total 0
    3. lrwxrwxrwx 1 root root 10 Nov 8 09:21 39e9ad34-d7aa-4dec-865e-08952aa8aab5 -> ../../sdc1
    4. lrwxrwxrwx 1 root root 10 Nov 8 13:17 8e95b09d-ffa9-4163-b24c-b78020022797 -> ../../sdb2
    5. lrwxrwxrwx 1 root root 10 Nov 8 09:21 aaeca5fa-456a-4f45-8a8b-9de0c2642f44 -> ../../sdc2
    6. lrwxrwxrwx 1 root root 10 Nov 8 09:21 d30a6d4a-6da4-4a81-a9e5-4bc69ebeec8f -> ../../sdb1

    新的 journal 的 uuid 的路径为 /dev/disk/by-partuuid/aaeca5fa-456a-4f45-8a8b-9de0c2642f44

    7、新建 journal 的链接和 journal_uuid 文件:

    1. root@mon:~# ln -s /dev/disk/by-partuuid/aaeca5fa-456a-4f45-8a8b-9de0c2642f44 /var/lib/ceph/osd/ceph-0/journal
    2. root@mon:~# echo aaeca5fa-456a-4f45-8a8b-9de0c2642f44 > /var/lib/ceph/osd/ceph-0/journal_uuid

    8、给 osd.0 创建 journal,使用 -i 指定 osd 的编号 。

    1. root@mon:~# ceph-osd -i 0 --mkjournal
    2. SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 00 00 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    3. 2016-11-08 13:29:36.115461 7f64ec851800 -1 created new journal /var/lib/ceph/osd/ceph-0/journal for object store /var/lib/ceph/osd/ceph-0

    9、查看新 journal 。

    1. root@mon:~# ceph-disk list | grep osd.0
    2. /dev/sdb1 ceph data, active, cluster ceph, osd.0, journal /dev/sdc2

    10、启动 osd.0 。

    1. start ceph-osd id=0

    11、去除 noout 的标记。

    1. ceph osd unset noout

    12、检查集群的状态。

    1. root@mon:~# ceph -s
    2. cluster 614e77b4-c997-490a-a3f9-e89aa0274da3
    3. health HEALTH_OK
    4. monmap e5: 1 mons at {osd1=10.95.2.43:6789/0}
    5. election epoch 796, quorum 0 osd1
    6. osdmap e1067: 3 osds: 3 up, 3 in
    7. flags sortbitwise
    8. pgmap v309733: 384 pgs, 6 pools, 1148 MB data, 311 objects
    9. 3597 MB used, 73162 MB / 76759 MB avail
    10. 384 active+clean
    11. root@mon:~# ceph osd tree
    12. ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
    13. -4 0.05997 root default
    14. -1 0.01999 host mon
    15. 0 0.01999 osd.0 up 1.00000 1.00000
    16. -2 0.01999 host osd0
    17. 1 0.01999 osd.1 up 1.00000 1.00000
    18. -3 0.01999 host osd1
    19. 2 0.01999 osd.2 up 1.00000 1.00000

    第二种方法

    这个属于备份和转移分区表的方法。

    1、首先按方法一中的第 1 ~ 4 步,设置 noout 标志,停进程,下刷 journal。

    2、备份需要替换 journal 的分区表。

    1. root@lab8106 ~# sgdisk --backup=/tmp/backup_journal_sdd /dev/sdd

    3、 还原分区表。

    1. root@lab8106 ~# sgdisk --load-backup=/tmp/backup_journal_sde /dev/sde
    2. root@lab8106 ~# parted -s /dev/sde print

    新的 journal 磁盘现在跟老的 journal 的磁盘的分区表一样的了。这意味着新的分区的 UUID 和老的相同的。如果选择的是这种备份还原的方法,那么 journal 的那个软连接是不需要进行修改的,因为两个磁盘的 uuid 是一样的,所以需要注意将老的磁盘拔掉或者清理掉分区,以免冲突。

    4、重建 journal 。

    1. root@lab8106 ~# ceph-osd -i 0 --mkjournal

    5、启动进程。

    1. root@lab8106 ~# start ceph-osd id=0

    6、去除 noout 的标记。

    1. root@lab8106 ~# ceph osd unset noout