ceph 使用 memdisk 做 journal
ceph 使用 memdisk 做 journal
zphj1987记得在很久很久以前,ceph 当时的版本是有提供使用内存做 journal 的配置的,当时是使用的 tmpfs,但是现在的版本在搜资料的时候,发现关于这个的没怎么找到资料,邮件列表里面有人有提到怎么做,看了下大致的原理,然后还是自己来实践一次
预备知识:
首先需要知道的是什么是内存盘,内存盘就是划分了一个内存空间来当磁盘使用来进行加速的,这个在某些操作系统里面会把 /tmp/ 分区挂载到 tmpfs 下,来达到加速的目的,这样就是重启后,会清空 /tmp 的内容,centos7 默认的分区方式也使用了 tmpfs 来加速,df -h 可以看下那个 tmpfs 就是内存盘了
本文使用的不是 tmpfs,这个是因为 tmpfs 不是我们常见意义上的那种文件系统,它不能格式化,ceph 在进行日志创建的时候会去检查 journal 所在分区的 uuid, 而 tmpfs 在检测的时候 会返回一个全 0 的字符串,这个在校验的时候显示的无效的,所以也就部署起来有问题,下面开始介绍我的做法,这个里面做法很多,步骤也可以自己去变化,这里只是提供了我的一种思路
我使用的是 ramdisk,关于怎么做 ramdisk 这个也研究了一下,因为篇幅有点长并且属于预备步骤,请参考我的另外一篇文章:
测试环境:
单机,四块 SAS 的 OSD,日志为 5G(内存盘大小为 6G),副本 2, osd 分组
说明:因为这里只去研究这个内存盘 journal 的实现,以及性能的差别,其他的组合方案需要自己去配置,所以单机的环境已经可以完成这个
1、准备 journal 的内存盘
检查内存盘大小
1 | [root@lab8106 ceph]# fdisk -l /dev/ram0 |
我的大小为 6G
格式化内存盘,并且挂载
创建挂载目录(有多少 osd 建几个)
1 | [root@lab8106 ceph]# mkdir -p /var/lib/ceph/mem/ceph-0 |
格式化 memdisk (需要几个格式化几个)
1 | [root@lab8106 ceph]# mkfs.xfs /dev/ram0 -f |
挂载内存盘
1 | [root@lab8106 ceph]# mount /dev/ram0 /var/lib/ceph/mem/ceph-0/ |
挂载完了后的效果如下:
1 | [root@lab8106 ceph]# df -h |
2、准备 ceph 的环境
修改 deploy 的 ceph.conf 文件,在部署前修改好
单机环境添加下面的三个
1 | osd_crush_chooseleaf_type = 0 |
意思就不在这里介绍了
创建 mon
1 | [root@lab8106 ceph]# ceph-deploy mon create lab8106 |
创建 osd
1 | [root@lab8106 ceph]# ceph-deploy osd prepare lab8106:/dev/sdb1:/var/lib/ceph/mem/ceph-0/journal |
部署完这个检查下
1 | [root@lab8106 ceph]# df -h |
可以看到内存盘分区内已经生成可一个 5G 的 journal 文件
1 | [root@lab8106 ceph]# ll /var/lib/ceph/osd/ceph-0 |
可以看到 osd 分区的也是链接到了内存盘,环境没问题
继续部署生效的三个 osd
部署完再次检查环境
1 | [root@lab8106 ceph]# df -h|grep ceph |
都挂载正确
检查集群的状态
1 | [root@lab8106 ceph]# ceph -s |
环境部署完毕
开始测试
测试一:采用内存盘 journal 的方式
使用 radosbench 进行测试(采取默认的写,并且不删除的测试,尽量把内存写满,未进行任何调优)
1 | [root@lab8106 ceph]# rados bench -p rbd 120 write --no-cleanup --run-name testmemdisk |
测试二:采用默认的磁盘 journal 的方式,环境恢复要原始的情况
1 | [root@lab8106 ceph]# rados bench -p rbd 120 write --no-cleanup --run-name testmemdisk |
测试的结果如上,上表格也许看的更直观,正好之前在找一个表格插件,现在用用
内存盘 journal 与磁盘 journal 性能对比
内存盘 journal | 磁盘 journal | |
---|---|---|
测试时间 (s) | 120.568031 | 120.613851 |
写数据块数 | 5857 | 3404 |
总共写入数据 (MB) | 23428 | 13616 |
数据块大小 | 4194304 | 4194304 |
写带宽 (MB/sec) | 194.314 | 112.889 |
带宽标准偏差 | 144.18 | 26.3641 |
最大带宽 (MB/sec) | 504 | 160 |
平均延时 | 0.32932 | 0.566656 |
延时偏差 | 0.48777 | 0.305038 |
最大延时 | 3.01612 | 2.00623 |
最小延时 | 0.0377235 | 0.105026 |
可以看到相关数据,光写带宽就提升了接近一倍,这个是因为,在磁盘 journal 情况下,写入 journal 的同时还有 filestore 的数据写入,相当于同时有两个写入在磁盘上,磁盘的性能自然只有一半了
以上就是关于 journal 的内存盘实现,这里面还会面临着其他的问题
- 机器内存的占用问题
- 断电后的处理
- 同时断电是否会搞坏 pg 状态
- 搞坏的情况是否能恢复
如果解决了这些问题,这个不失为一种性能提升的方案,毕竟内存的成本和速度是 ssd 的磁盘和单独磁盘 journal 不能比的,journal 本身也是一种循环的写入的空间
增加知识(/dev/shm 模式)
上面的通过 memdisk 的方式是可以,还有更方便的方式就是直接用内存路径,需要处理几个地方,我们来看下怎么处理
首先修改配置文件
1 | osd_journal =/dev/shm/$cluster-$id/journal |
增加这三个选项,否则会失败,这个是因为在内存这个路径下用文件的时候是无法满足默认的 dio, 和 aio 选项的,会造成无法生成 journal 文件,生成的 journal 的文件的大小为 0,无法成功
假如我们给 osd.5 替换 journal,我们看下操作步骤
1 | [root@lab8106 ceph-5]# mkdir /dev/shm/ceph-5 |
创建目录并且修改权限
修改 fsid
1 | [root@lab8106 ceph-5]# cat fsid |
这个 fsid 是用来校验 journal 的
而内存的 uuid 为
1 | [root@lab8106 ceph-5]#ceph-osd -i 7 --get-journal-uuid --osd-journal /dev/shm/ceph-7/journal |
所以修改这个文件
1 | echo 00000000-0000-0000-0000-000000000000 > fsid |
创建 journal
1 | [root@lab8106 ceph-5]# ceph-osd -i 5 --mkjournal --setuser ceph --setgroup ceph --debug_ms 20 --debug_osd 20 |
启动 osd 就可以了
## 变更记录
Why | Who | When |
---|---|---|
创建 | 武汉 - 运维 - 磨渣 | 2016-01-14 |
增加 /dev/shm/ 路径模式 | 武汉 - 运维 - 磨渣 | 2017-01-20 |