说明
前段时间匆匆地为老PVE(Proxmox Virtual Environment)集群的CEPH增加了SSD,之后匆匆地简单对比记下了写了那篇“使用SSD增强Ceph性能的比较测试”,之后才反应过来——操作步骤和过程没写。这里补上。
如果有兴趣,请一定仔细看完再操作,里面有几个(可以绕过的)坑。
主要硬件:
每台主机增加了一块400G的固态硬盘,型号是INTEL SSDPEDMX400G4,PCIe接口。
一台万兆以太网交换机netgear XS708E。
服务器是7台Dell R730xd,万兆以太网卡,每台配置6-8块2T/7.2/NL-SAS磁盘
主要软件:
# pveversion -v
proxmox-ve: 5.4-2 (running kernel: 4.15.18-19-pve)
pve-manager: 5.4-13 (running version: 5.4-13/aee6f0ec)
pve-kernel-4.15: 5.4-7
....
ceph: 12.2.12-pve1
...
qemu-server: 5.0-54
...
zfsutils-linux: 0.7.13-pve1~bpo2
早期ceph使用xfs文件系统存储数据,具体的做法是把一个OSD分成两个分区,默认会创建一个容量为5G的分区作为数据日志,然后剩下的磁盘空间是一个分区,用户实际使用数据都在这里。
新的ceph使用新的文件系统bluestore,划分了block.wal、block.db和数据分区
block.wal:用于BlueStore的内部日志或写前日志
block.db:用于存储BlueStore的内部元数据,基于RocksDB实现,类似索引提高性能
根分区:根分区分做两部分:
1.一个小的分区使用XFS进行格式化,并包含OSD的基本元数据。这个数据目录包含关于OSD的信息(它的标识符,它属于哪个集群,以及它的私有密匙环)。
2.设备的其余部分通常是一个大的分区,它占用了由BlueStore直接管理的设备的其余部分,其中包含所有实际的数据。
访问顺序:wal>db>根
这里就提到第一个坑:
使用pve自带的图形操作界面创建OSD,即使是在指定了”日志/数据库磁盘”为SSD的情况下,也只会在SSD上生成一个大小为1G的block.db,然后在数据盘上分出一个容量105MB的XFS分区。
所以创建OSD不能使用PVE自带的图形界面,而是直接使用命令行操作,指定预先划分好的wal和db分区。
操作步骤
纯粹的ceph集群所有操作都只能基于命令行操作,不过PVE本身做了相应图形界面,我们就尽量多用图形界面好了,毕竟简单方便不易出错。
关机打开服务器的盖板,把SSD插入服务器的PCIe插槽,然后重新通电开机。
这里注意,关机后ceph会认为这个节点故障,并开始数据同步复制,这显然是没必要的,所以临时关闭该功能:
在"服务器视图"下面,选择一个节点,然后在右边选择"Ceph" - "OSD"
关机前设置”noout”,点击”Set noout”;
开机后恢复功能,同一个地方点击”Unset noout”
因为是集群,所以在任一节点操作都是对整个集群生效的。
重新开机后会识别出新的块设备:
# lspci | grep -i ssd
05:00.0 Non-Volatile memory controller: Intel Corporation PCIe Data Center SSD (rev 01)
# ls -l /dev/nvme0n1
brw-rw---- 1 root disk 259, 0 Nov 10 22:30 /dev/nvme0n1
# fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 372.6 GiB, 400088457216 bytes, 781422768 sectors
......
在SSD上创建分区
Ceph的wal和db的容量到底应该多大,网上说法不一,默认情况下, wal 和 db 的大小分别是 512 MB 和 1GB, 包括 Sage Weil 的 PPT 里面也是这样标明的。但是也有人提到2T的数据db应该20G的。我这里就按10G和40G来分了,反正SSD有这么大。
指定分区表类型
这里的分区表用msdos应该也可以,我习惯用gpt
parted -s /dev/nvme0n1 mktable gpt
使用创建wal分区,命令方便查看
parted -s /dev/nvme0n1 mkpart osd.wal1 1M 10G
parted -s /dev/nvme0n1 mkpart osd.wal2 10G 20G
parted -s /dev/nvme0n1 mkpart osd.wal3 20G 30G
parted -s /dev/nvme0n1 mkpart osd.wal4 30G 40G
parted -s /dev/nvme0n1 mkpart osd.wal5 40G 50G
parted -s /dev/nvme0n1 mkpart osd.wal6 50G 60G
使用创建db分区,命令方便查看
parted -s /dev/nvme0n1 mkpart osd.db1 60G 100G
parted -s /dev/nvme0n1 mkpart osd.db2 100G 140G
parted -s /dev/nvme0n1 mkpart osd.db3 140G 180G
parted -s /dev/nvme0n1 mkpart osd.db4 180G 220G
parted -s /dev/nvme0n1 mkpart osd.db5 220G 260G
parted -s /dev/nvme0n1 mkpart osd.db6 260G 300G
查看已创建的分区
# parted -s /dev/nvme0n1 print
Model: Unknown (unknown)
Disk /dev/nvme0n1: 400GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 10.0GB 9999MB osd.wal1
2 10.0GB 20.0GB 9999MB osd.wal2
3 20.0GB 30.0GB 10.0GB osd.wal3
4 30.0GB 40.0GB 10.0GB osd.wal4
5 40.0GB 50.0GB 10.0GB osd.wal5
6 50.0GB 60.0GB 9999MB osd.wal6
7 60.0GB 100GB 40.0GB osd.db1
8 100GB 140GB 40.0GB osd.db2
9 140GB 180GB 40.0GB osd.db3
10 180GB 220GB 40.0GB osd.db4
11 220GB 260GB 40.0GB osd.db5
12 260GB 300GB 40.0GB osd.db6
重建OSD
重建OSD分为三步:导出-销毁-新建,前面两步都可以通过图形界面完成。如下图:
销毁前一定要在命令行下面执行df,看看该OSD的ID对应磁盘,后面新建就用它,如下osd0对应磁盘是/dev/sdb
mount | grep /var/lib/ceph/osd/ceph-0
/dev/sdb1 on /var/lib/ceph/osd/ceph-0 type xfs (rw,noatime,attr2,inode64,noquota)
新建OSD的时候出现一个坑:
命令行参数指定wal和db的时候不能使用ceph-disk新建,要使用ceph-volume,否则会生成一个OSD的ID,但是实际不存在,出现这种情况,可以使用命令删除。
ceph osd rm ID
被销毁的OSD上面的分区表类型标签还在,要用命令抹去,如这个OSD原来对应磁盘/dev/sdf:
DEV=/dev/sdf
dd if=/dev/zero of=$DEV bs=1024 count=1000
然后就可以新建OSD了,使用指定的数据盘、wal和db分区
ceph-volume lvm create --bluestore --data $DEV --block.wal /dev/nvme0n1p6 --block.db /dev/nvme0n1p12
操作完一个节点(一台服务器)再操作另一个节点,不要同时在多个节点上操作;
同一个节点上,一个OSD在新建的时候,可以对另一个OSD执行导出和销毁。
图形界面上导出完成后销毁才可用。
也可以用命令确认确认:
# ceph osd safe-to-destroy 21
Error EBUSY: OSD(s) 21 have 242 pgs currently mapped to them
持续检测:
# while ! ceph osd safe-to-destroy 16 ; do echo `date +%Y.%m.%d-%H:%M:%S`; sleep 60 ; done
Error EBUSY: OSD(s) 21 have 242 pgs currently mapped to them
导出完成后该命令会退出,否则会显示当前还有多少个pgs。
据说ceph-volume最后会完全取代ceph-disk,毕竟更方便灵活。
ceph-volume还有些其他参数,但不是必须的,比如指定OSD的ID
# ceph-volume lvm create --help
usage: ceph-volume lvm create [-h] --data DATA [--filestore]
[--journal JOURNAL] [--bluestore]
[--block.db BLOCK_DB] [--block.wal BLOCK_WAL]
[--osd-id OSD_ID] [--osd-fsid OSD_FSID]
[--cluster-fsid CLUSTER_FSID]
[--crush-device-class CRUSH_DEVICE_CLASS]
[--dmcrypt] [--no-systemd]
Create an OSD by assigning an ID and FSID, registering them with the
cluster with an ID and FSID, formatting and mounting the volume, adding
all the metadata to the logical volumes using LVM tags, and starting
the OSD daemon.
Existing logical volume (lv) or device:
ceph-volume lvm create --data {vg name/lv name} --journal /path/to/device
Or:
ceph-volume lvm create --data {vg name/lv name} --journal {vg name/lv name}
optional arguments:
-h, --help show this help message and exit
--osd-id OSD_ID Reuse an existing OSD id
--osd-fsid OSD_FSID Reuse an existing OSD fsid
--cluster-fsid CLUSTER_FSID
Specify the cluster fsid, useful when no ceph.conf is
available
--crush-device-class CRUSH_DEVICE_CLASS
Crush device class to assign this OSD to
--dmcrypt Enable device encryption via dm-crypt
--no-systemd Skip creating and enabling systemd units and starting
OSD services when activating
required arguments:
--data DATA OSD data path. A physical device or logical volume
filestore:
--filestore Use the filestore objectstore
--journal JOURNAL (REQUIRED) A logical volume (vg_name/lv_name), or path
to a device
bluestore:
--bluestore Use the bluestore objectstore
--block.db BLOCK_DB Path to bluestore block.db logical volume or device
--block.wal BLOCK_WAL
Path to bluestore block.wal logical volume or device
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有