.. _add_ceph_osds_raw:
=======================
添加Ceph OSDs (RAW磁盘)
=======================
.. warning::
我尝试通过默认集群名来避免 :ref:`add_ceph_osds_zdata` 遇到的无法传递自定义集群名的问题,但是本次尝试依然失败(虽然也有一些经验积累)。所以我准备重新开始采用标准 :ref:`add_ceph_osds_lvm` 部署,后续再准备虚拟机环境解决本文实践问题。`
在完成了初始 :ref:`install_ceph_mon` 之后,就可以添加 OSDs。只有完成了足够的OSDs部署(满足对象数量,例如 ``osd pool default size =2`` 要求集群至少具备2个OSDs)才能达到 ``active + clean`` 状态。在完成了 ``bootstap`` Ceph monitor之后,集群就具备了一个默认的 ``CRUSH`` map,但是此时 ``CRUSH`` map还没有具备任何Ceph OSD Daemons map到一个Ceph节点。
Ceph提供了一个 ``ceph-vlume`` 工具,用来准备一个逻辑卷,磁盘或分区给Ceph使用,通过增加索引来创建OSD ID,并且将新的OSD添加到CRUSH map。需要在每个要添加OSD的节点上执行该工具。
.. note::
我有3个服务器节点提供存储,需要分别在这3个节点上部署OSD服务。
.. note::
Ceph官方文档的案例都是采用 ``ceph-volume lvm`` 来完成的,这个命令可以在Ceph的OSD底层构建一个 :ref:`linux_lvm` ,带来的优势是可以随时扩容底层存储容量,对后续运维带来极大便利。在生产环境中部署,建议使用 ``lvm`` 卷。
我这里的测试环境,采用简化的 ``磁盘分区`` 来提供Ceph :ref:`bluestore` 存储,原因是我需要简化配置,同时我的测试服务器也没有硬件进行后续扩容。
bluestore
============
:ref:`bluestore` 是最新的Ceph采用的默认高性能存储引擎,底层不再使用OS的文件系统,可以直接管理磁盘硬件。
需要部署OSD的服务器首先准备存储,通常采用LVM卷作为底层存储块设备,这样可以通过LVM逻辑卷灵活调整块设备大小(有可能随着数据存储增长需要调整设备)。
作为我的实践环境 :ref:`hpe_dl360_gen9` 每个 :ref:`ovmf` 虚拟机仅有一个pass-through PCIe NVMe存储,所以我没有划分不同存储设备来分别存放 ``block`` / ``block.db`` 和 ``block.wal`` 。并且也因为无法扩展存储,我就尝试不使用LVM卷,而直接采用磁盘分区。
使用raw分区作为bluestore底层(失败)
-----------------------------------
- 执行 ``ceph-volume --help`` 可以看到支持3种底层存储::
lvm Use LVM and LVM-based technologies to deploy OSDs
simple Manage already deployed OSDs with ceph-volume
raw Manage single-device OSDs on raw block devices
我这里构建实践采用 ``ceph-volume raw`` ,直接采用 NVMe 存储分区
.. note::
生产环境请使用LVM卷作为底层设备 - 参考 :ref:`bluestore_config`
我的部署实践是在3台虚拟机 ``z-b-data-1`` / ``z-b-data-2`` / ``z-b-data-3`` 上完成,分区完全一致
- 准备底层块设备,这里划分 GPT 分区1 ::
parted /dev/nvme0n1 mklabel gpt
parted -a optimal /dev/nvme0n1 mkpart primary 0% 700GB
完成后检查 ``fdisk -l`` 可以看到::
Disk /dev/nvme0n1: 953.89 GiB, 1024209543168 bytes, 2000409264 sectors
Disk model: SAMSUNG MZVL21T0HCLR-00B00
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: E131A860-1EC8-4F34-8150-2A2C312176A1
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 1367187455 1367185408 651.9G Linux filesystem
.. note::
以上分区操作在3台存储虚拟机上完成
- 创建第一个OSD,注意我使用了统一的 ``data`` 存储来存放所有数据,包括 ``block.db`` 和 ``block.wal`` ::
sudo ceph-volume raw prepare --bluestore --data /dev/nvme0n1p1
.. note::
``ceph-volume raw -h`` 包含子命令::
list list BlueStore OSDs on raw devices
prepare Format a raw device and associate it with a (BlueStore) OSD
activate Discover and prepare a data directory for a (BlueStore) OSD on a raw device
``ceph-volume lvm -h`` 包含子命令::
activate Discover and mount the LVM device associated with an OSD ID and start the Ceph OSD
deactivate Deactivate OSDs
batch Automatically size devices for multi-OSD provisioning with minimal interaction
prepare Format an LVM device and associate it with an OSD
create Create a new OSD from an LVM device
trigger systemd helper to activate an OSD
list list logical volumes and devices associated with Ceph
zap Removes all data and filesystems from a logical volume or partition.
migrate Migrate BlueFS data from to another LVM device
new-wal Allocate new WAL volume for OSD at specified Logical Volume
new-db Allocate new DB volume for OSD at specified Logical Volume
对于 ``raw`` 命令需要分步骤完成,不像 ``lvm`` 命令提供了更为丰富的批量命令
我在执行::
sudo ceph-volume raw prepare --data /dev/nvme0n1p1
命令提示只支持 ``--bluestore`` 作为后端,但是提示 ``/dev/nvme0n1p1: not a block device`` 让我很疑惑,NVMe分区为何不是块设备?::
stderr: lsblk: /dev/nvme0n1p1: not a block device
stderr: Unknown device "/dev/nvme0n1p1": Inappropriate ioctl for device
--> must specify --bluestore (currently the only supported backend)
修订命令,添加 ``--bluestore`` 参数::
sudo ceph-volume raw prepare --bluestore --data /dev/nvme0n1p1
.. note::
从 ``lsblk`` 输出来看 ``/dev/nvme0n1p1`` 没有显示为正常的块设备,原因我在下文会说明
# lsblk /dev/nvme0n1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 953.9G 0 disk
└─nvme0n1p1 259:1 0 651.9G 0 part
# lsblk /dev/nvme0n1p1
lsblk: /dev/nvme0n1p1: not a block device
但是对于 ``vda`` 设备却没有报错::
# lsblk /dev/vda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 252:0 0 6G 0 disk
├─vda1 252:1 0 243M 0 part /boot/efi
└─vda2 252:2 0 5.8G 0 part /
# lsblk /dev/vda2
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda2 252:2 0 5.8G 0 part /
但是 ``ceph-volume raw prepare`` 报错:
.. literalinclude:: add_ceph_osds_raw/ceph-volume_raw_fail.txt
:language: bash
:linenos:
:caption: ceph-volume raw 输出(错误)
问题根源
~~~~~~~~~
实际我也发现即使采用 ``ceph-volume lvm create`` 也是失败的,提示信息中也有::
stderr: lsblk: /dev/nvme0n1p1: not a block device
我仔细检查了设备文件,发现了异常::
$ ls -lh /dev/nvme0n1
brw-rw---- 1 root disk 259, 0 Nov 29 20:19 /dev/nvme0n1
$ ls -lh /dev/nvme0n1p1
-rw-r--r-- 1 ceph ceph 10M Nov 29 17:00 /dev/nvme0n1p1
也就是说,设备分区 ``nvme0n1p1`` 异常,没有显示为块设备,我想起来之前做了一个 ``/usr/bin/dd if=/dev/zero of=/dev/nvme0n1p1 bs=1M count=10 conv=fsync`` 但当时没有注意到已经删除了分区 ``nvme0n1p1`` 所以导致 ``dd`` 命令直接作用于 ``/dev`` 目录下形成了上述文件。这就导致后续分区之后,实际上没有正确创建出 ``/dev/nvme0n1p1`` 块设备。
解决方法是重建分区表,并且重启一次操作系统::
parted /dev/nvme0n1 mklabel gpt
shutdown -r now
重启以后再划分分区::
parted -a optimal /dev/nvme0n1 mkpart primary 0% 700GB
完成以后再检查设备文件就可以看到是正常的块设备::
$ ls -lh /dev/nvme0*
crw------- 1 root root 241, 0 Nov 29 20:32 /dev/nvme0
brw-rw---- 1 root disk 259, 0 Nov 29 20:33 /dev/nvme0n1
brw-rw---- 1 root disk 259, 2 Nov 29 20:33 /dev/nvme0n1p1
然后重新执行创建OSD磁盘成功:
.. literalinclude:: add_ceph_osds_raw/ceph-volume_raw.txt
:language: bash
:linenos:
:caption: ceph-volume raw 输出(成功)
- 检查raw设备::
sudo ceph-volume raw list
可以看到设备文件如下::
{
"0": {
"ceph_fsid": "39392603-fe09-4441-acce-1eb22b1391e1",
"device": "/dev/nvme0n1p1",
"osd_id": 0,
"osd_uuid": "8d889fc0-110c-45fa-a259-6a876183bc46",
"type": "bluestore"
}
}
- 激活OSD: 需要注意 ``raw`` 格式的设备激活和 lvm卷不同,采用如下格式::
ceph-volume raw activate [--device DEVICE]
也就是只要指定设备就可以::
sudo ceph-volume raw activate --device /dev/nvme0n1p1
提示报错::
--> systemd support not yet implemented
- 这是因为需要先启动systemd::
sudo systemctl start ceph-osd@0.service
然后检查::
sudo systemctl status ceph-osd@0.service
显示输出::
● ceph-osd@0.service - Ceph object storage daemon osd.0
Loaded: loaded (/lib/systemd/system/ceph-osd@.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2021-11-29 22:44:37 CST; 17s ago
Process: 1370 ExecStartPre=/usr/lib/ceph/ceph-osd-prestart.sh --cluster ${CLUSTER} --id 0 (code=exited, status=0/SUCCESS)
Main PID: 1382 (ceph-osd)
Tasks: 69
Memory: 25.0M
CGroup: /system.slice/system-ceph\x2dosd.slice/ceph-osd@0.service
└─1382 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
Nov 29 22:44:37 z-b-data-1 systemd[1]: Starting Ceph object storage daemon osd.0...
Nov 29 22:44:37 z-b-data-1 systemd[1]: Started Ceph object storage daemon osd.0.
Nov 29 22:44:37 z-b-data-1 ceph-osd[1382]: 2021-11-29T22:44:37.656+0800 7f081f44ad80 -1 Falling back to public interface
Nov 29 22:44:38 z-b-data-1 ceph-osd[1382]: 2021-11-29T22:44:38.332+0800 7f081f44ad80 -1 osd.0 0 log_to_monitors {default=true}
Nov 29 22:44:40 z-b-data-1 ceph-osd[1382]: 2021-11-29T22:44:40.308+0800 7f0811535700 -1 osd.0 0 waiting for initial osdmap
Nov 29 22:44:40 z-b-data-1 ceph-osd[1382]: 2021-11-29T22:44:40.336+0800 7f081898c700 -1 osd.0 13 set_numa_affinity unable to identify public interface '' numa node: (2) No such file or directory
这里可以看到 ``ceph-osd`` 启动会找寻 NUMA 节点
没有报错的话,别忘记激活这个osd服务::
sudo systemctl enable ceph-osd@0.service
- 然后再次激活 ``ceph-0`` 这个OSD磁盘::
sudo ceph-volume raw activate --device /dev/nvme0n1p1
依然报错::
--> systemd support not yet implemented
似乎不需要手工激活,只需要启动 ``ceph-osd@0.service`` 就可以
- 现在检查 ``sudo ceph -s`` 状态已经看到激活了OSD::
cluster:
id: 39392603-fe09-4441-acce-1eb22b1391e1
health: HEALTH_WARN
Reduced data availability: 1 pg inactive
Degraded data redundancy: 1 pg undersized
OSD count 1 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum z-b-data-1 (age 2h)
mgr: z-b-data-1(active, since 2h)
osd: 1 osds: 1 up (since 16m), 1 in (since 16m)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 1.0 GiB used, 651 GiB / 652 GiB avail
pgs: 100.000% pgs not active
1 undersized+peered
.. note::
注意,此时可以看到 ``data`` 段落显示::
usage: 1.0 GiB used, 651 GiB / 652 GiB avail
- 检查OSD状态::
sudo ceph osd tree
可以看到::
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.63660 root default
-3 0.63660 host z-b-data-1
0 ssd 0.63660 osd.0 up 1.00000 1.00000
请注意,现在只有一个OSD运行,不满足配置中要求3个副本的要求,我们需要添加OSD节点
重启操作系统验证
======================
重启操作系统 ``sudo shutdown -r now``
- 启动后检查::
sudo ceph -s
发现服务启动,但是OSD空间是0::
cluster:
id: 39392603-fe09-4441-acce-1eb22b1391e1
health: HEALTH_WARN
Reduced data availability: 1 pg inactive
OSD count 1 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum z-b-data-1 (age 4m)
mgr: z-b-data-1(active, since 3m)
osd: 1 osds: 1 up (since 45m), 1 in (since 45m)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs: 100.000% pgs unknown
1 unknown
也即是 OSD没有启动成功
重新激活OSD
-------------
为何重启系统之前已经配置成功的OSD无法启动呢?
- 检查OSD服务::
sudo systemctl status ceph-osd@0-service
输出显示::
● ceph-osd@0-service.service - Ceph object storage daemon osd.0-service
Loaded: loaded (/lib/systemd/system/ceph-osd@.service; disabled; vendor preset: enabled)
Active: inactive (dead)
- 尝试启动 OSD服务::
sudo systemctl start ceph-osd@0.service
提示失败::
Job for ceph-osd@0.service failed because the control process exited with error code.
See "systemctl status ceph-osd@0.service" and "journalctl -xe" for details.
检查 ``systemctl status ceph-osd@0.service`` ::
● ceph-osd@0.service - Ceph object storage daemon osd.0
Loaded: loaded (/lib/systemd/system/ceph-osd@.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Mon 2021-11-29 23:26:58 CST; 24min ago
Process: 968 ExecStartPre=/usr/lib/ceph/ceph-osd-prestart.sh --cluster ${CLUSTER} --id 0 (code=exited, status=0/SUCCESS)
Process: 983 ExecStart=/usr/bin/ceph-osd -f --cluster ${CLUSTER} --id 0 --setuser ceph --setgroup ceph (code=exited, status=1/FAILURE)
Main PID: 983 (code=exited, status=1/FAILURE)
Nov 29 23:26:58 z-b-data-1 systemd[1]: Failed to start Ceph object storage daemon osd.0.
Nov 29 23:35:32 z-b-data-1 systemd[1]: ceph-osd@0.service: Start request repeated too quickly.
Nov 29 23:35:32 z-b-data-1 systemd[1]: ceph-osd@0.service: Failed with result 'exit-code'.
Nov 29 23:35:32 z-b-data-1 systemd[1]: Failed to start Ceph object storage daemon osd.0.
Nov 29 23:36:06 z-b-data-1 systemd[1]: ceph-osd@0.service: Start request repeated too quickly.
Nov 29 23:36:06 z-b-data-1 systemd[1]: ceph-osd@0.service: Failed with result 'exit-code'.
Nov 29 23:36:06 z-b-data-1 systemd[1]: Failed to start Ceph object storage daemon osd.0.
Nov 29 23:50:17 z-b-data-1 systemd[1]: ceph-osd@0.service: Start request repeated too quickly.
Nov 29 23:50:17 z-b-data-1 systemd[1]: ceph-osd@0.service: Failed with result 'exit-code'.
Nov 29 23:50:17 z-b-data-1 systemd[1]: Failed to start Ceph object storage daemon osd.0.
- 查看 ``inventory`` 输出::
ceph-volume inventory
可以看到::
Device Path Size rotates available Model name
/dev/nvme0n1 953.87 GB False True SAMSUNG MZVL21T0HCLR-00B00
/dev/vda 6.00 GB True False
检查详情输出::
ceph-volume inventory /dev/nvme0n1
可以看到报告::
====== Device report /dev/nvme0n1 ======
path /dev/nvme0n1
lsm data {}
available True
rejected reasons
device id SAMSUNG MZVL21T0HCLR-00B00_S676NF0R908202
removable 0
ro 0
vendor
model SAMSUNG MZVL21T0HCLR-00B00
sas address
rotational 0
scheduler mode none
human readable size 953.87 GB
- 检查分区::
ceph-volume inventory /dev/nvme0n1p1
输出显示 ``inventory`` 这个分区被拒绝,原因是已经具备了BlueStore设备标签::
====== Device report /dev/nvme0n1p1 ======
path /dev/nvme0n1p1
lsm data {}
available False
rejected reasons Has BlueStore device label
device id SAMSUNG MZVL21T0HCLR-00B00_S676NF0R908202
human readable size 651.92 GB
- 我发现 ``/var/lib/ceph/osd/ceph-0/`` 目录完全是空的,之前的 ``sudo ceph-volume raw prepare --data /dev/nvme0n1p1`` 执行完成后,这个目录已经具备了初始化的内容,为何重启之后就丢失了呢?
参考 `ceph systmed帮助 `_ 可以看到, ``systemd`` 在启动时候,会检查 ``/etc/ceph/osd/{id}-{uuid}.json`` 配置文件加载相对应的systemd unit的实例名称,然后根据对应的卷使用 OSD 目标转换处理挂载,也就是 ``/var/lib/ceph/osd/{cluster name}-{osd id}`` 挂载,即 ``/var/lib/ceph/osd/ceph-0`` (第一个OSD)。一旦进程处理完毕,就会调用启动OSD,即 ``systemctl start ceph-osd@0`` 。
我检查发现我的服务器上没有 ``/etc/ceph/osd/`` 目录,也就是说我之前的步骤动态激活了 OSD,但是没有创建 json 格式的配置文件,导致再次启动时 ``systemd`` 无法读取配置来尊卑实例以及对应目录挂载,所以也就无法启动OSD。
- 可以从 ``sudo ceph-volume raw list`` 获得json格式设备文件,输出到对应配置文件 ``/etc/ceph/osd/0-8d889fc0-110c-45fa-a259-6a876183bc46.json`` ::
{
"0": {
"ceph_fsid": "39392603-fe09-4441-acce-1eb22b1391e1",
"device": "/dev/nvme0n1p1",
"osd_id": 0,
"osd_uuid": "8d889fc0-110c-45fa-a259-6a876183bc46",
"type": "bluestore"
}
}
从文档看 ``ceph-volume simple activate`` 可以激活已经构建过的OSD,所以我尝试::
ceph-volume simple activate {ID} {FSID}
或::
ceph-volume simple activate --file /etc/ceph/osd/{ID}-{FSID}.json
按照帮助提示,首先 ``scan`` ::
sudo ceph-volume simple scan
然后执行激活::
ceph-volume simple activate --all
这里提示错误,显示确实根据 ``--all`` 参数去激活所有 ``*.json`` 文件,但是::
--> activating OSD specified in /etc/ceph/osd/0-8d889fc0-110c-45fa-a259-6a876183bc46.json
--> Required devices (block and data) not present for bluestore
--> bluestore devices found: []
--> AttributeError: 'RuntimeError' object has no attribute 'message'
- 检查详情::
ceph health detail
显示输出::
HEALTH_WARN 1 osds down; 1 host (1 osds) down; 1 root (1 osds) down; Reduced data availability: 1 pg inactive; OSD count 1 < osd_pool_default_size 3
[WRN] OSD_DOWN: 1 osds down
osd.0 (root=default,host=z-b-data-1) is down
[WRN] OSD_HOST_DOWN: 1 host (1 osds) down
host z-b-data-1 (root=default) (1 osds) is down
[WRN] OSD_ROOT_DOWN: 1 root (1 osds) down
root default (1 osds) is down
[WRN] PG_AVAILABILITY: Reduced data availability: 1 pg inactive
pg 1.0 is stuck inactive for 3h, current state unknown, last acting []
[WRN] TOO_FEW_OSDS: OSD count 1 < osd_pool_default_size 3
- 检查 ``osd`` ::
ceph osd tree
显示状态down::
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.63660 root default
-3 0.63660 host z-b-data-1
0 ssd 0.63660 osd.0 down 1.00000 1.00000
- 我检查了之前 ``sudo ceph-volume raw prepare --bluestore --data /dev/nvme0n1p1`` 输出记录,发现其中有将设备文件设置为 ``ceph`` 用户的步骤::
/usr/bin/chown -R ceph:ceph /dev/nvme0n1p1
但是我发现服务器重启之后,这个设备文件恢复回root用户::
brw-rw---- 1 root disk 259, 1 Nov 30 16:05 /dev/nvme0n1p1
我重试 :ref:`udev` 设置正确的ownership,但是重启系统依然没有正确启动OSD。
重新开始
============
由于解决不了问题,我参考 `Adding/Removing OSDs `_ 删除掉osd,然后重新开始::
sudo ceph osd stop 0
sudo ceph osd purge 0 --yes-i-really-mean-it
此时::
sudo ceph osd tree
显示::
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0 root default
-3 0 host z-b-data-1
已经没有了 ``osd.0``
- 重新创建OSD::
sudo ceph-volume raw prepare --bluestore --data /dev/nvme0n1p1
但是非常奇怪的报错::
...
Running command: /usr/bin/ceph-osd --cluster ceph --osd-objectstore bluestore --mkfs -i 0 --monmap /var/lib/ceph/osd/ceph-0/activate.monmap --keyfile - --osd-data /var/lib/ceph/osd/ceph-0/ --osd-uuid e4725c90-9f08-45fd-b063-5807cc84e992 --setuser ceph --setgroup ceph
stderr: 2021-11-30T17:57:15.364+0800 7f0464d78d80 -1 bluestore(/var/lib/ceph/osd/ceph-0/) _open_fsid (2) No such file or directory
stderr: 2021-11-30T17:57:15.364+0800 7f0464d78d80 -1 bluestore(/var/lib/ceph/osd/ceph-0/) mkfs fsck found fatal error: (2) No such file or directory
stderr: 2021-11-30T17:57:15.364+0800 7f0464d78d80 -1 OSD::mkfs: ObjectStore::mkfs failed with error (2) No such file or directory
stderr: 2021-11-30T17:57:15.364+0800 7f0464d78d80 -1 ** ERROR: error creating empty object store in /var/lib/ceph/osd/ceph-0/: (2) No such file or directory
--> Was unable to complete a new OSD, will rollback changes
...
似乎是因为没有清理么?
- 增加一个清理分区前10M空间的命令::
sudo /usr/bin/dd if=/dev/zero of=/dev/nvme0n1p1 bs=1M count=10 conv=fsync
果然,重启系统后再次尝试创建OSD就能够正常完成::
sudo ceph-volume raw prepare --bluestore --data /dev/nvme0n1p1
- 完成后检查 ``/var/lib/ceph/osd/ceph-0/`` 可以看到以下内容::
total 48K
-rw-r--r-- 1 ceph ceph 206 Nov 30 20:42 activate.monmap
lrwxrwxrwx 1 ceph ceph 14 Nov 30 20:42 block -> /dev/nvme0n1p1
-rw------- 1 ceph ceph 2 Nov 30 20:42 bluefs
-rw------- 1 ceph ceph 37 Nov 30 20:42 ceph_fsid
-rw-r--r-- 1 ceph ceph 37 Nov 30 20:42 fsid
-rw------- 1 ceph ceph 56 Nov 30 20:42 keyring
-rw------- 1 ceph ceph 8 Nov 30 20:42 kv_backend
-rw------- 1 ceph ceph 21 Nov 30 20:42 magic
-rw------- 1 ceph ceph 4 Nov 30 20:42 mkfs_done
-rw------- 1 ceph ceph 41 Nov 30 20:42 osd_key
-rw------- 1 ceph ceph 6 Nov 30 20:42 ready
-rw------- 1 ceph ceph 10 Nov 30 20:42 type
-rw------- 1 ceph ceph 2 Nov 30 20:42 whoami
并且这个 ``/var/lib/ceph/osd/ceph-0`` 已经挂载成 ``tmpfs`` ,通过 ``df -h`` 检查可以看到::
tmpfs 7.9G 48K 7.9G 1% /var/lib/ceph/osd/ceph-0
- 注意此时只是完成磁盘初始化,尚未激活,所以::
sudo ceph -s
看到如下输出::
cluster:
id: 39392603-fe09-4441-acce-1eb22b1391e1
health: HEALTH_WARN
Reduced data availability: 1 pg inactive
OSD count 1 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum z-b-data-1 (age 5m)
mgr: z-b-data-1(active, since 4m)
osd: 1 osds: 0 up (since 20h), 0 in (since 3h)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs: 100.000% pgs unknown
1 unknown
- 检查设备文件::
sudo ceph-volume raw list
显示::
{
"0": {
"ceph_fsid": "39392603-fe09-4441-acce-1eb22b1391e1",
"device": "/dev/nvme0n1p1",
"osd_id": 0,
"osd_uuid": "4f6f2db9-894a-455c-bdaf-f3324ab5efe1",
"type": "bluestore"
}
}
注意重新格式化之后 ``osd_uuid`` 是变化的
- 激活磁盘::
sudo ceph-volume raw activate --device /dev/nvme0n1p1
此时提示::
--> systemd support not yet implemented
- 启动 systemd 的 ``ceph-osd@0.service`` 服务::
sudo systemctl enable ceph-osd@0.service
sudo systemctl start ceph-osd@0.service
- 检查服务状态::
sudo systemctl status ceph-osd@0.service
状态如下::
● ceph-osd@0.service - Ceph object storage daemon osd.0
Loaded: loaded (/lib/systemd/system/ceph-osd@.service; disabled; vendor preset: enabled)
Active: active (running) since Tue 2021-11-30 20:52:51 CST; 5s ago
Process: 1390 ExecStartPre=/usr/lib/ceph/ceph-osd-prestart.sh --cluster ${CLUSTER} --id 0 (code=exited, status=0/SUCCESS)
Main PID: 1403 (ceph-osd)
Tasks: 69
Memory: 26.3M
CGroup: /system.slice/system-ceph\x2dosd.slice/ceph-osd@0.service
└─1403 /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
Nov 30 20:52:51 z-b-data-1 systemd[1]: Starting Ceph object storage daemon osd.0...
Nov 30 20:52:51 z-b-data-1 systemd[1]: Started Ceph object storage daemon osd.0.
Nov 30 20:52:51 z-b-data-1 ceph-osd[1403]: 2021-11-30T20:52:51.712+0800 7f7ea0ba8d80 -1 Falling back to public interface
Nov 30 20:52:52 z-b-data-1 ceph-osd[1403]: 2021-11-30T20:52:52.392+0800 7f7ea0ba8d80 -1 osd.0 0 log_to_monitors {default=true}
Nov 30 20:52:53 z-b-data-1 ceph-osd[1403]: 2021-11-30T20:52:53.840+0800 7f7e92c93700 -1 osd.0 0 waiting for initial osdmap
Nov 30 20:52:53 z-b-data-1 ceph-osd[1403]: 2021-11-30T20:52:53.896+0800 7f7e9a0ea700 -1 osd.0 111 set_numa_affinity unable to identify public interface '' numa node: (2) No such file or directory
- 按照 `ceph systmed帮助 `_ 文档,可以知道只要已经完成磁盘挂载,则启动 ``ceph-osd@0.service`` 就会激活磁盘(应该不需要手工 ``ceph-volume raw active`` )。此时检查集群状态可以看到第一个OSD已经激活启用::
sudo ceph -s
输出显示::
cluster:
id: 39392603-fe09-4441-acce-1eb22b1391e1
health: HEALTH_WARN
Reduced data availability: 1 pg inactive
OSD count 1 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum z-b-data-1 (age 13m)
mgr: z-b-data-1(active, since 13m)
osd: 1 osds: 1 up (since 83s), 1 in (since 83s)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 1.0 GiB used, 651 GiB / 652 GiB avail
pgs: 100.000% pgs unknown
1 unknown
- 激活系统启动时启动 ``ceph-osd`` ::
sudo systemctl enable ceph-osd@0.service
- (这步应该不需要)参考 `OSD Config Reference `_ 最小化的配置,在 ``/etc/ceph/ceph.conf`` 添加OSD Daemon配置::
[osd.0]
host = z-b-data-1
.. note::
在 ``/etc/ceph/ceph.conf`` 中添加 ``osd.0`` 配置可能是非常关键的一步,我第二次执行操作多增加了这步,然后重启服务器就能够正常启动所有服务,包括OSD也能正常启动
然后 ``重启操作系统`` 验证::
sudo ceph -s
如我所料,这次重启操作系统后,可以看到已经正常激活OSD::
cluster:
id: 39392603-fe09-4441-acce-1eb22b1391e1
health: HEALTH_WARN
Reduced data availability: 1 pg inactive
OSD count 1 < osd_pool_default_size 3
services:
mon: 1 daemons, quorum z-b-data-1 (age 4m)
mgr: z-b-data-1(active, since 4m)
osd: 1 osds: 1 up (since 29m), 1 in (since 29m)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs: 100.000% pgs unknown
1 unknown
但是,发现 ``systemctl status ceph-osd@0`` 是失败的::
● ceph-osd@0.service - Ceph object storage daemon osd.0
Loaded: loaded (/lib/systemd/system/ceph-osd@.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2021-11-30 21:18:06 CST; 4min 2s ago
Process: 966 ExecStartPre=/usr/lib/ceph/ceph-osd-prestart.sh --cluster ${CLUSTER} --id 0 (code=exited, status=0/SUCCESS)
Process: 987 ExecStart=/usr/bin/ceph-osd -f --cluster ${CLUSTER} --id 0 --setuser ceph --setgroup ceph (code=exited, status=1/FAILURE)
Main PID: 987 (code=exited, status=1/FAILURE)
Nov 30 21:18:06 z-b-data-1 systemd[1]: ceph-osd@0.service: Scheduled restart job, restart counter is at 3.
Nov 30 21:18:06 z-b-data-1 systemd[1]: Stopped Ceph object storage daemon osd.0.
Nov 30 21:18:06 z-b-data-1 systemd[1]: ceph-osd@0.service: Start request repeated too quickly.
Nov 30 21:18:06 z-b-data-1 systemd[1]: ceph-osd@0.service: Failed with result 'exit-code'.
Nov 30 21:18:06 z-b-data-1 systemd[1]: Failed to start Ceph object storage daemon osd.0.
我发现一个奇怪的问题,就是虽然 ``ceph -s`` 显示OSD已经激活,但实际上系统中根本没有 ``ceph-osd`` 进程,在 ``/var/run/ceph`` 目录下也没有osd对应的socket。这说明 osd 实际没有启动。但是 ``ceph -s`` 始终显示 ``osd`` 是正常up ::
sudo ceph osd tree
输出::
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.63660 root default
-3 0.63660 host z-b-data-1
0 ssd 0.63660 osd.0 up 1.00000 1.00000
从监控页面显示也是 OSDs : ``1 total: 1 up, 1 in``
但是显然 ``systemctl status ceph-osd@0.service`` 状态表明启动失败::
Process: 983 ExecStart=/usr/bin/ceph-osd -f --cluster ${CLUSTER} --id 0 --setuser ceph --setgroup ceph (code=exited, status=1/FAILURE)
- 手工执行::
sudo /usr/bin/ceph-osd -f --cluster ceph --id 0 --setuser ceph --setgroup ceph
可以看到错误原因::
2021-11-30T22:59:37.828+0800 7f60db9f3d80 -1 auth: unable to find a keyring on /var/lib/ceph/osd/ceph-0/keyring: (2) No such file or directory
2021-11-30T22:59:37.828+0800 7f60db9f3d80 -1 AuthRegistry(0x557f7fe96938) no keyring found at /var/lib/ceph/osd/ceph-0/keyring, disabling cephx
2021-11-30T22:59:37.832+0800 7f60db9f3d80 -1 auth: unable to find a keyring on /var/lib/ceph/osd/ceph-0/keyring: (2) No such file or directory
2021-11-30T22:59:37.832+0800 7f60db9f3d80 -1 AuthRegistry(0x7fff676473f0) no keyring found at /var/lib/ceph/osd/ceph-0/keyring, disabling cephx
failed to fetch mon config (--no-mon-config to skip)
但是手工创建文件也不能解决( ``ceph-volume raw prepare`` 过程命令)::
/usr/bin/ceph-authtool /var/lib/ceph/osd/ceph-0/keyring --create-keyring --name osd.0 --add-key AQA2yqRhes0wORAAttpUh5aRZsr1pLdHeXRezg==
/usr/bin/chown -R ceph:ceph /var/lib/ceph/osd/ceph-0/keyring
/usr/bin/ln -s /dev/nvme0n1p1 /var/lib/ceph/osd/ceph-0/block
这个问题困扰了我两天,为何 ``ceph-volume raw prepare`` 命令的子命令有::
/usr/bin/mount -t tmpfs tmpfs /var/lib/ceph/osd/ceph-0
那么 ``/var/lib/ceph/osd/ceph-0`` 岂不是一个内存中的存储,一旦重启数据就会丢失? ``keyring`` 等文件在tmpfs中,是如何重启后继续存在的?
`how the files in /var/lib/ceph/osd/ceph-0 are generated `_ 讨论提到::
bluestore will save all the information at the starting of
disk (BDEV_LABEL_BLOCK_SIZE=4096)
this area is used for saving labels, including keyring, whoami etc.
通过以下命令检查::
ceph-bluestore-tool show-label --path /var/lib/ceph/osd/ceph-0
可以看到::
{
"/var/lib/ceph/osd/ceph-0/block": {
"osd_uuid": "d34a6c89-0c53-4378-ac43-108b47722abf",
"size": 699998928896,
"btime": "2021-11-30T23:35:24.910469+0800",
"description": "main",
"bfm_blocks": "170898176",
"bfm_blocks_per_key": "128",
"bfm_bytes_per_block": "4096",
"bfm_size": "699998928896",
"bluefs": "1",
"ceph_fsid": "39392603-fe09-4441-acce-1eb22b1391e1",
"kv_backend": "rocksdb",
"magic": "ceph osd volume v026",
"mkfs_done": "yes",
"osd_key": "AQC8RKZhuuYFCRAAAFhRXTyApcLIIsi1bZUxdA==",
"ready": "ready",
"require_osd_release": "15",
"whoami": "0"
}
}
当挂载 ``/var/lib/ceph/osd/ceph-0`` 时,ceph会dump这些内容到tmpfs目录。
根据之前 ``ceph-volume raw activate`` 可以看到 ``/var/lib/ceph/osd/ceph-0`` 挂载了 ``tmpfs`` 并获得了所有必须的 ``keyring`` 等文件,然后才能正确 ``systemctl start ceph-osd@0.service`` 。也就是说,能够正常启动 ``ceph-osd`` 进程的前提条件是 ``/var/lib/ceph/osd/ceph-0`` 目录正确挂载( ``activate`` )。操作系统重启,没有正确挂载和准备好这个目录,是导致无法启动 ``ceph-osd`` 的原因,那么是在哪里完成这个启动挂载配置呢?
应该有一个 ``/etc/ceph/osd/xxxx.json`` 配置提供了ceph启动时准备好目录挂载,这样就能正确启动 ``ceph-osd@0.service`` ...
`how the files in /var/lib/ceph/osd/ceph-0 are generated `_ 讨论,有人回答了这个准备 ``osd`` 目录的工具命令是 ``ceph-bluestore-tool prime-osd-dir`` ,可以重新创建所有的文件正确指向OSD block设备,所以我执行以下命令::
sudo ceph-bluestore-tool prime-osd-dir --dev /dev/nvme0n1p1 --path /var/lib/ceph/osd/ceph-0
但是,上述命令只传递了部分文件::
total 24K
-rw------- 1 root root 37 Dec 1 10:07 ceph_fsid
-rw------- 1 root root 37 Dec 1 10:07 fsid
-rw------- 1 root root 55 Dec 1 10:07 keyring
-rw------- 1 root root 6 Dec 1 10:07 ready
-rw------- 1 root root 10 Dec 1 10:07 type
-rw------- 1 root root 2 Dec 1 10:07 whoami
完成后检查就可以看到 ``sudo ls -lh /var/lib/ceph/osd/ceph-0`` 终于出现了正确挂载 ``/var/lib/ceph/osd/ceph-0`` 的 ``tmpfs`` 文件::
total 52K
-rw-r--r-- 1 ceph ceph 206 Nov 30 23:35 activate.monmap
lrwxrwxrwx 1 ceph ceph 14 Nov 30 23:35 block -> /dev/nvme0n1p1
-rw------- 1 ceph ceph 2 Nov 30 23:35 bluefs
-rw------- 1 ceph ceph 37 Dec 1 08:47 ceph_fsid
-rw-r--r-- 1 ceph ceph 37 Dec 1 08:47 fsid
-rw------- 1 ceph ceph 55 Dec 1 08:47 keyring
-rw------- 1 ceph ceph 8 Nov 30 23:35 kv_backend
-rw------- 1 ceph ceph 21 Nov 30 23:35 magic
-rw------- 1 ceph ceph 4 Nov 30 23:35 mkfs_done
-rw------- 1 ceph ceph 41 Nov 30 23:35 osd_key
-rw------- 1 ceph ceph 6 Dec 1 08:47 ready
-rw------- 1 ceph ceph 3 Nov 30 23:40 require_osd_release
-rw------- 1 ceph ceph 10 Dec 1 08:47 type
-rw------- 1 ceph ceph 2 Dec 1 08:47 whoami
- 此时就能够正确启动 ``ceph-osd@0.service`` 服务::
sudo systemctl start ceph-osd@0.service
.. note::
完整 ``activate`` BlueStore的过程见文档 `ceph-volume » activate `_
总结
-----------
- 删除掉OSD.0 准备重新开始::
sudo ceph osd purge 0 --yes-i-really-mean-it
- 清理理分区前10M空间(重要,否则 ``ceph-volume raw prepare`` 失败::
/usr/bin/dd if=/dev/zero of=/dev/nvme0n1p1 bs=1M count=10 conv=fsync
- 使用 ``raw`` 模式其实只有2个命令步骤::
sudo ceph-volume raw prepare --bluestore --data /dev/nvme0n1p1
sudo ceph-volume raw activate --device /dev/nvme0n1p1
此时 ``/var/lib/ceph/osd/ceph-0`` 会挂载 ``tmpfs`` 正确生成指向 ``/dev/nvme0n1p1`` BlueStore的文件,具备了启动 ``ceph-osd`` 的条件
- 启动 ``ceph-osd`` 服务::
sudo systemctl start ceph-osd@0.service
sudo systemctl enable ceph-osd@0.service
- 此时检查 ``sudo ceph -s`` 就可以看到OSD 0已经激活启用
- 检查 ``ceph-volume`` 输出的 ``osd_id`` 和 ``osd_uuid`` ::
sudo ceph-volume raw list
显示::
{
"0": {
"ceph_fsid": "39392603-fe09-4441-acce-1eb22b1391e1",
"device": "/dev/nvme0n1p1",
"osd_id": 0,
"osd_uuid": "d34a6c89-0c53-4378-ac43-108b47722abf",
"type": "bluestore"
}
}
- 激活对应的卷服务(似乎应该有这个步骤,但是还是没有成功)::
sudo systemctl enable ceph-volume@raw-0-d34a6c89-0c53-4378-ac43-108b47722abf
输出提示::
Created symlink /etc/systemd/system/multi-user.target.wants/ceph-volume@raw-0-d34a6c89-0c53-4378-ac43-108b47722abf.service → /lib/systemd/system/ceph-volume@.service.
:strike:`这样启动才能够挂载好卷` 不过我重启还是没有解决挂载
- 如果不能正确挂载,则手工处理::
mount -t tmpfs tmpfs /var/lib/ceph/osd/ceph-0
sudo ceph-bluestore-tool prime-osd-dir --dev /dev/nvme0n1p1 --path /var/lib/ceph/osd/ceph-0
这里进展了一步,生成了一些必要文件,但还不完整,所以 ``ceph-osd@0.service`` 还不能正常运行
- 检查分区uuid(这个步骤待参考,是为了解决块设备属主,有可能不需要)::
udevadm info --query=all --name=/dev/nvme0n1p1 | grep -i uuid
将输出的 ``E: ID_PART_ENTRY_UUID`` 修订 ``/etc/udev/rules.d/99-perm.rules`` ::
ACTION=="add|change", ENV{ID_PART_ENTRY_UUID}=="4a7db7a7-90fc-47cb-b473-8774db0c392f", OWNER="ceph", GROUP="ceph"
- 修订 ``/etc/ceph/ceph.conf`` 配置文件添加最简化的OSD配置(可能不需要)::
[osd.0]
host = z-b-data-1
这个配置可以确保操作系统重启后自动启动 ``osd.0``
添加OSD
=======================
需要满足3副本要求,我们需要在服务器本地或者其他服务器上添加OSD。为了能够冗余,我采用集群3个服务器上每个服务器都启动 ``ceph-mon`` 和 ``ceph-osd`` ,所以下面我们来完成:
- :ref:`add_ceph_mons`
然后再执行:
- :ref:`add_ceph_osds_more`
参考
=======
- `Ceph document - Installation (Manual) `_
- `raw osd's are not started on boot after upgrade from 14.2.11 to 14.2.16 ; ceph-volume raw activate claim systemd support not yet implemented `_