增加/删除 OSD

2017-06-23 18:51:21
增加 OSD(手动)

首先修改各个节点的/etc/hosts信息,增加新节点信息,并添加ceph.client.admin.keyring,确保ceph.client.admin.keyring有正确的权限
要增加一个 OSD,要依次创建数据目录、把硬盘挂载到数据目录、把 OSD 加入集群、然后把它加入 CRUSH Map
备注:Ceph 喜欢统一的硬件,与存储池无关。如果你要新增容量不一的硬盘驱动器,还需调整它们的权重。但是,为实现最佳性能,CRUSH 的分级结构最好按类型、容量来组织

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@node4 ~]# parted -s /dev/sdb mklabel gpt
#删除所有分区
[root@node4 ~]# sgdisk --zap-all --clear --mbrtogpt /dev/sdb
GPT data structures destroyed! You may now partition the disk using fdisk or
other utilities.
The operation has completed successfully.
#打印硬盘信息
[root@node4 ~]# sgdisk -p /dev/sdb
[root@node4 ~]# ceph-disk prepare --cluster ceph --fs-type xfs /dev/sdb
[root@node4 ~]# ceph-disk activate /dev/sdb
备注:
ceph-disk prepare --cluster --cluster-uuid --fs-type xfs|ext4|btrfs /device
cluster-uuid ( b71a3eb1-e253-410a-bf11-84ae01bad654 )
cluster name – default name is ceph unless specified otherwise when ran ceph-deploy
eg ceph-deploy –cluster=cluster_name

到这里我们就添加完了osd. 感兴趣的同学可以往下看,这里ceph-disk到底帮我们做了什么操作呢?

1.创建 OSD。如果未指定 UUID,OSD 启动时会自动生成一个。下列命令会输出 OSD 号,后续步骤你会用到

1
2
3
4
ceph osd create [{uuid} [{id}]]

[root@node4 ~]# ceph osd create
9

如果指定了可选参数 {id} ,那么它将作为 OSD id 。要注意,如果此数字已使用,此命令会出错。
建议:一般来说,我们不建议指定 {id} 。因为 ID 是按照数组分配的,跳过一些依然会浪费内存;
尤其是跳过太多、或者集群很大时,会更明显。若未指定 {id} ,将用最小可用数字。
2.在新 OSD 主机上创建数据目录

1
2
3
4
5
ssh {new-osd-host}
sudo mkdir /var/lib/ceph/osd/ceph-{osd-number}

[root@node4 ~]# mkdir /var/lib/ceph/osd/ceph-9
[root@node4 ~]# chown ceph:ceph -R /var/lib/ceph/osd/ceph-9

3.建立分区,可以参考这里,关于sgdisk的用法参考这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@node4 ~]# sgdisk -n 1:10487808:4194301951 -t 1:4fbd7e29-9d25-41b8-afd0-062c0ceff05d -p /dev/sdb
Disk /dev/sdb: 4194304000 sectors, 2.0 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): A996FDA1-5621-45CD-871A-028E30E33027
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 4194303966
Partitions will be aligned on 2048-sector boundaries
Total free space is 10489789 sectors (5.0 GiB)

Number Start (sector) End (sector) Size Code Name
1 10487808 4194301951 1.9 TiB FFFF
The operation has completed successfully.

[root@node4 ~]# sgdisk -n 2:2048:10487807 -t 2:45b0969e-9b03-4f30-b4c6-b4b80ceff106 -p /dev/sdb
Disk /dev/sdb: 4194304000 sectors, 2.0 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): A996FDA1-5621-45CD-871A-028E30E33027
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 4194303966
Partitions will be aligned on 2048-sector boundaries
Total free space is 4029 sectors (2.0 MiB)

Number Start (sector) End (sector) Size Code Name
1 10487808 4194301951 1.9 TiB FFFF
2 2048 10487807 5.0 GiB FFFF
The operation has completed successfully.

4.给数据盘和日志盘做标记,typecode参考这里,关于磁盘自动挂载的请参考这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sgdisk 例子
#分5120M大小
/usr/sbin/sgdisk --new=2:0:5120M --change-name=2:ceph-journal --partition-guid=2:150f0081-c630-44c9-ad21-7d95613866ea --typecode=2:45b0969e-9b03-4f30-b4c6-b4b80ceff106 --mbrtogpt -- /dev/sdb
#largest-new 将剩余block全部使用
/usr/sbin/sgdisk --largest-new=1 --change-name=1:ceph-data --partition-guid=1:db182a1d-f8c6-4660-9c12-0222e2459dd5 --typecode=1:89c57f98-2fe5-4dc0-89c1-f3ad0ceff2be -- /dev/sdb
#查看udev事件队列,如果所有的events已处理则退出
/sbin/udevadm settle

[root@node4 ~]# /usr/sbin/sgdisk --change-name=2:'ceph journal' --typecode=2:45b0969e-9b03-4f30-b4c6-b4b80ceff106 -- /dev/sdb
The operation has completed successfully.

[root@node4 ~]# /usr/sbin/sgdisk --change-name=1:'ceph data' --typecode=1:4fbd7e29-9d25-41b8-afd0-062c0ceff05d -- /dev/sdb
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

[root@node4 ceph-9]# mkfs.xfs /dev/sdb1
[root@node4 ceph-9]# mount /dev/sdb1 /var/lib/ceph/osd/ceph-9

5.初始化 OSD 数据目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ssh {new-osd-host}
ceph-osd -i {osd-num} --mkfs --mkkey

[root@node4 ~]# ceph-osd -i 9 --mkfs --mkkey
2017-06-29 16:23:05.161478 7f614226e800 -1 journal FileJournal::_open: disabling aio for non-block journal. Use journal_force_aio to force use of aio anyway
2017-06-29 16:23:05.200065 7f614226e800 -1 journal FileJournal::_open: disabling aio for non-block journal. Use journal_force_aio to force use of aio anyway
2017-06-29 16:23:05.221105 7f614226e800 -1 filestore(/var/lib/ceph/osd/ceph-9) could not find #-1:7b3f43c4:::osd_superblock:0# in index: (2) No such file or directory
2017-06-29 16:23:05.237813 7f614226e800 -1 created object store /var/lib/ceph/osd/ceph-9 for osd.9 fsid d6d92de4-2a08-4bd6-a749-6c104c88fc40
2017-06-29 16:23:05.237987 7f614226e800 -1 auth: error reading file: /var/lib/ceph/osd/ceph-9/keyring: can't open /var/lib/ceph/osd/ceph-9/keyring: (2) No such file or directory
2017-06-29 16:23:05.238397 7f614226e800 -1 created new key in keyring /var/lib/ceph/osd/ceph-9/keyring

[root@node4 ceph-9]# cd /var/lib/ceph/osd/ceph-9
[root@node4 ceph-9]# rm -f journal
[root@node4 ceph-9]# ll /dev/disk/by-partuuid/
total 0
lrwxrwxrwx 1 root root 10 Jun 30 11:35 c50d9217-c928-49a3-be1b-55990facf2e0 -> ../../sdb2
lrwxrwxrwx 1 root root 10 Jun 30 11:36 ced5d1bb-568c-4317-954f-efc63fa3bcaa -> ../../sdb1
[root@node4 ceph-9]# ln -s /dev/disk/by-partuuid/c50d9217-c928-49a3-be1b-55990facf2e0 journal
[root@node4 ceph-9]# chown ceph:ceph -R /var/lib/ceph/osd/ceph-9
[root@node4 ceph-9]# chown ceph:ceph /var/lib/ceph/osd/ceph-9/journal

在启动 ceph-osd 前,数据目录必须是空的
6.注册 OSD 认证密钥,ceph-{osd-num} 路径里的 ceph 值应该是 $cluster-$id,如果你的集群名字不是 ceph,那就用自己集群的名字

1
2
3
4
5
6
7
8
9
ceph auth add osd.{osd-num} osd 'allow *' mon 'allow rwx' -i /var/lib/ceph/osd/ceph-{osd-num}/keyring

[root@node4 ~]# ceph auth add osd.9 osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/ceph-9/keyring
added key for osd.9

#创建client.bootstrap-osd key文件(本节点新建第一个osd时才需要)
[root@node4 ~]# ceph auth get-or-create client.bootstrap-osd -o /var/lib/ceph/bootstrap-osd/ceph.keyring
[root@node4 ~]# chmod 600 /var/lib/ceph/bootstrap-osd/ceph.keyring
[root@node4 ~]# chown ceph:ceph /var/lib/ceph/bootstrap-osd/ceph.keyring

7.把新 OSD 加入 CRUSH Map 中,以便它可以开始接收数据。用 ceph osd crush add 命令把 OSD 加入 CRUSH 分级结构的合适位置。
如果你指定了不止一个 bucket,此命令会把它加入你所指定的 bucket 中最具体的一个,并且把此 bucket 挪到你指定的其它 bucket 之内

1
2
3
4
5
6
7
8
ceph osd crush add {id-or-name} {weight} [{bucket-type}={bucket-name} ...]

[root@node4 ~]# ceph osd crush add-bucket node4 host
added bucket node4 type host to crush map
[root@node4 ~]# ceph osd crush move node4 root=default
moved item id -5 name 'node4' to location {root=default} in crush map
[root@node4 ~]# ceph osd crush add osd.9 1.0 host=node4
add item id 9 name 'osd.9' weight 1 at location {host=node4} to crush map

你也可以反编译 CRUSH Map、把 OSD 加入设备列表、以 bucket 的形式加入主机(如果它没在 CRUSH Map 里)、以条目形式把设备加入主机、分配权重、重编译并应用它

1
2
3
4
5
6
7
[root@node4 ~]# ceph osd getcrushmap -o crushmap.txt
[root@node4 ~]# crushtool -d crushmap.txt -o crushmap-decompile
[root@node4 ~]# vim crushmap-decompile
删除掉node4相关的信息
[root@node4 ~]# crushtool -c crushmap-decompile -o crushmap-compile
[root@node4 ~]# ceph osd setcrushmap -i crushmap-compile
set crush map

8.启动 OSD。把 OSD 加入 Ceph 后, OSD 就在配置里了。然而它还没运行,它现在的状态为 down & out 。你必须先启动 OSD 它才能收数据

1
2
3
systemctl start ceph-osd@{osd-num}

[root@node4 ~]# systemctl start ceph-osd@9

启动了 OSD ,其状态就变成了 up & in
遇到的问题:
[root@node4 ~]# systemctl start ceph-osd@9 启动不成功,报错如下

1
2
3
4

[root@node4 ~]# /usr/bin/ceph-osd -f --cluster ceph --id 9 --setuser ceph --setgroup ceph
starting osd.9 at :/0 osd_data /var/lib/ceph/osd/ceph-9 /var/lib/ceph/osd/ceph-9/journal
2017-06-30 11:49:18.599998 7f3f36afb800 -1 journal FileJournal::open: ondisk fsid 0c8bb770-f16a-4208-91d2-7e659768fbc8 doesn't match expected 03bba8cd-3765-4364-b727-e4f9269447cc, invalid (someone else's?) journal

解决方法:Create new journal

1
2
3
4
5
6
7
8
9
10
$ ceph-osd --mkjournal -i <osd num>

[root@node4 osd]# ceph-osd --mkjournal -i 9
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
2017-06-30 11:59:44.328209 7fc180861800 -1 journal check: ondisk fsid 0c8bb770-f16a-4208-91d2-7e659768fbc8 doesn't match expected 03bba8cd-3765-4364-b727-e4f9269447cc, invalid (someone else's?) journal
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
2017-06-30 11:59:44.338081 7fc180861800 -1 created new journal /var/lib/ceph/osd/ceph-9/journal for object store /var/lib/ceph/osd/ceph-9

#启动成功
systemctl start ceph-osd@9

增加 OSD(ceph-deploy)

1.登入 ceph-deploy 工具所在的 Ceph admin 节点,进入工作目录

1
2
3
4
ssh {ceph-deploy-node}
cd /path/ceph-deploy-work-path

[neo@admin ~]$ cd cluster/

2.列举磁盘。
执行下列命令列举一节点上的磁盘:

1
2
3
ceph-deploy disk list {node-name [node-name]...}

[neo@admin cluster]$ ceph-deploy disk list node4

3.格式化磁盘。
用下列命令格式化(删除分区表)磁盘,以用于 Ceph :

1
2
3
ceph-deploy disk zap {osd-server-name}:{disk-name}

[neo@admin cluster]$ ceph-deploy disk zap node4:sdb

重要: 这会删除磁盘上的所有数据
4.准备 OSD

1
2
3
ceph-deploy osd prepare {node-name}:{data-disk}[:{journal-disk}]

[neo@admin cluster]$ ceph-deploy osd prepare node4:sdb

prepare 命令只准备 OSD 。在大多数操作系统中,硬盘分区创建后,不用 activate 命令也会自动执行 activate 阶段(通过 Ceph 的 udev 规则)
前例假定一个硬盘只会用于一个 OSD 守护进程,以及一个到 SSD 日志分区的路径。
我们建议把日志存储于另外的驱动器以最优化性能;你也可以指定一单独的驱动器用于日志(也许比较昂贵)、或者把日志放到 OSD 数据盘(不建议,因为它有损性能,这里放在一起了)。
注意: 在一个节点运行多个 OSD 守护进程、且多个 OSD 守护进程共享一个日志分区时,你应该考虑整个节点的最小 CRUSH 故障域,
因为如果这个 SSD 坏了,所有用其做日志的 OSD 守护进程也会失效
5.准备好 OSD 后,可以用下列命令激活它

1
2
ceph-deploy osd activate {node-name}:{data-disk-partition}[:{journal-disk-partition}]
[neo@admin cluster]$ ceph-deploy osd activate node4:/dev/sdb1

activate 命令会让 OSD 进入 up 且 in 状态。该命令使用的分区路径是前面 prepare 命令创建的

删除 OSD(手动)

在 Ceph 里,一个 OSD 通常是一台主机上的一个 ceph-osd 守护进程、它运行在一个硬盘之上。
如果一台主机上有多个数据盘,你得逐个删除其对应 ceph-osd。
通常,操作前应该检查集群容量,看是否快达到上限了,确保删除 OSD 后不会使集群达到 near full 比率
警告:删除 OSD 时不要让集群达到 full ratio 值,删除 OSD 可能导致集群达到或超过 full ratio 值。

1.调整osd的crush weight

1
2
ssh {osd-host}
[root@node4 ~]# ceph osd crush reweight osd.10 0.1

备注:可以分几次调整将crush 的weight 减低到0 ,目的就是让数据慢慢的分布到其他节点上,直到完全迁移到其他osd,
这个地方不光调整了osd 的crush weight ,实际上同时调整了host 的 weight ,这样会调整集群的整体的crush 分布,在osd 的crush 为0 后, 再对这个osd的任何删除相关操作都不会影响到集群的数据的分布

2.停止需要剔除的 OSD 进程,让其他的 OSD 知道这个 OSD 不提供服务了。停止 OSD 后,状态变为 down

1
2
3
sudo systemctl stop  ceph-osd@id={osd-num}

[root@node4 ~]# systemctl stop ceph-osd@10

3.将 OSD 标记为 out 状态,这个一步是告诉 mon,这个 OSD 已经不能服务了,需要在其他的 OSD 上进行数据的均衡和恢复了

1
2
3
4
ceph osd out {osd-num}

[root@node4 ~]# ceph osd out 10
marked out osd.10.

执行完这一步后,会触发数据的恢复过程。此时应该等待数据恢复结束,集群恢复到 HEALTH_OK 状态,再进行下一步操作

4.删除 CRUSH Map 中的对应 OSD 条目,它就不再接收数据了。你也可以反编译 CRUSH Map、删除 device 列表条目、删除对应的 host 桶条目或删除 host 桶(如果它在 CRUSH Map 里,而且你想删除主机),重编译 CRUSH Map 并应用它

1
2
3
4
ceph osd crush remove {name}

[root@node4 ~]# ceph osd crush remove osd.10
removed item id 10 name 'osd.10' from crush map

该步骤会触发数据的重新分布。等待数据重新分布结束,整个集群会恢复到 HEALTH_OK 状态
5.删除 OSD 认证密钥:

1
2
3
4
ceph auth del osd.{osd-num}

[root@node4 ~]# ceph auth del osd.10
updated

6.删除 OSD

1
2
3
4
ceph osd rm {osd-num}

[root@node4 ~]# ceph osd rm 10
removed osd.10

7.卸载 OSD 的挂载点.

1
2
3
sudo umount /var/lib/ceph/osd/$cluster-{osd-num}

[root@node4 ~]# umount /var/lib/ceph/osd/ceph-10

8.登录到保存 ceph.conf 主拷贝的主机

1
2
3
ssh {admin-host}
cd /etc/ceph
vim ceph.conf

9.从 ceph.conf 配置文件里删除对应条目

1
2
[osd.10]
host = {hostname}

10.从保存 ceph.conf 主拷贝的主机,把更新过的 ceph.conf 拷贝到集群其他主机的 /etc/ceph 目录下
如果在 ceph.conf 中没有定义各 OSD 入口,就不必执行第 8 ~ 10 步

删除 OSD(ceph-deploy)

ref
增加/删除 OSD
Ceph集群磁盘没有剩余空间的解决方法
Ceph如何添加ssd磁盘做cache tier.txt
记最近一次ceph故障修复
故障定位和处理
ceph集群中进行osd的手动添加移除
Creating a Ceph OSD from a designated disk partition
如何删除一台OSD主机
add/remove CEPH OSD – Object Storage Device
Linux磁盘分区总结
Ceph:SSD日志故障后的OSD恢复
更换 OSD Journal