为了测试内存盘类型的磁盘做ceph osd的io性能,将内存部分空间取出来用作普通物理磁盘(RAMDISK),并在该磁盘上部署ceph osd
支持该操作的系统驱动为brd.ko
PS :使用内存盘千万不要存放数据,因为内存在操作系统上下电会被回收掉,如果用作存储会造成数据的丢失
创建RAMDISK
一般centos7及以上都存在brd.ko文件,不过还是确认当前操作系统是否存在brd.ko驱动文件
-
locate brd.ko
或者find / -name brd.ko
/usr/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/block/brd.ko /usr/lib/modules/3.10.0-123.el7.x86_64-002/kernel/drivers/block/brd.ko
-
加载内存盘
insmod /usr/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/block/brd.ko rd_nr=2 rd_size=16777216 max_part=0
使用insmod
通过绝对路径加载驱动,或者直接执行如下命令更为简单
modprobe brd rd_nr=2 rd_size=16777216 max_part=0
modprobe
命令不需要绝对路径,只要操作系统存在该文件,它会自动加载并且将与该驱动相关的依赖驱动一同加载进去关于加载中的参数配置描述如下:
rd_nr
表示一次创建多少个内存盘rd_size
表示每隔内存盘的大小,单位为KB.这里设置容量需要根据操作系统内存占用容量来设置,free -h
查看后使用空余内存空间max_part
表示每隔内存盘支持的最大分区数
-
查看创建好的内存盘
因为内存盘并不是物理磁盘,也不是块设备,所以lsblk查看系统快设备是看不到的,但是它已经已io驱动文件形式存在,所以在目录/dev/
下是可以看到该文件[root@node1 ~]# ls -l /dev/ram* brw-rw---- 1 root disk 1, 0 Jul 3 12:55 /dev/ram0 brw-rw---- 1 root disk 1, 1 Jul 3 12:55 /dev/ram1
使用内存盘
由于我这里是用作ceph-osd部署,则不需要自己去格式化操作,
使用内存盘格式化文件系统
- 查看内存盘容量
fdisk -l /dev/ram0
Disk /dev/ram0: 17.2 GB, 17179869184 bytes, 33554432 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
- 对内存盘格式化文件系统
mkfs.xfs /dev/ram0
- 挂载文件系统
mount /dev/ram0 /mnt/test
df -h
查看文件系统已经成功挂载
接下来就可以向文件系统中写入数据
使用内存盘部署ceph-osd
因为ceph部署osd默认block 分区大小为10G,所以这里我们需要在分区上部署osd才可行
-
在内存盘上使用fdisk做出5G的分区,可以参考fdisk为磁盘做分区
做出的内存盘分区如下[root@node1 ~]# ls -l /dev/ram0* brw-rw---- 1 root disk 1, 0 Jul 3 15:40 /dev/ram0 brw-rw---- 1 root disk 1, 1 Jul 3 15:40 /dev/ram0p1
-
写入osd block配置到
ceph.conf
中,如下[osd.0] bluestore_block_size = 4294967296
-
执行如下命令在做好的分区上部署osd
ceph-disk -v prepare /dev/ram0p1
ceph-disk -v activate /dev/ram0p1
在激活的时候会报出如下错误activate: ceph osd.0 data dir is ready at /var/lib/ceph/tmp/mnt.Egdb_s move_mount: Moving mount to final location... command_check_call: Running command: /bin/mount -o noatime,user_xattr -- /dev/ram0p1 /var/lib/ceph/osd/ceph-0 command_check_call: Running command: /bin/umount -l -- /var/lib/ceph/tmp/mnt.Egdb_s command_check_call: Running command: /sbin/sgdisk --change-name=1:ceph data osd.0 /dev/ram0p Problem opening /dev/ram0p for reading! Error is 2. The specified file does not exist!
该错误为修改分区名称时报出的错误,因为内存盘做出的分区 物理分区表并没有分配具体的容量配置。即每个分区容量都是整个内存盘容量。但是部署到这里,osd该有的配置已经完成。但因为异常,找不到1分区文件,已经跳出了部署脚本,不会执行systemd的start服务。但是此时osd是可以被拉起来的。
关于如上问题,有一个更好的解决办法是可以映射多块内存盘,每个内存盘分别做一个OSD或者其他OSD的db/wal分区即可,这里可以不使用内存盘的分区来进行操作。
systemctl start ceph-osd@0
查看挂载:/dev/ram0p1 16G 45M 15G 1% /var/lib/ceph/osd/ceph-0
这里分区容量问题需要描述一下,因为我们取出的内存容量为16G用作内存盘。但是需要我们在ceph-disk源码中会有sgdisk操作,命令sgdisk中有设置typecode以及将mbr分区转成gpt分区过程。这个过程会清除mbr分区,内存盘分区表格式为dos mbr分区,所以这里/dev/ram0p1文件仍然存在,但是分区表已经被破坏,所以此时看到的容量即为内存盘的所有容量了。
查看osd具体容量:
为我们配置文件中设置的容量
删除内存盘
- 卸载所有挂载在内存盘上的文件夹
- 直接执行
modprobe -r brd
卸载brd驱动