• ceph使用memdisk做journal


    记得在很久很久以前,ceph当时的版本是有提供使用内存做journal的配置的,当时是使用的tmpfs,但是现在的版本在搜资料的时候,发现关于这个的没怎么找到资料,邮件列表里面有人有提到怎么做,看了下大致的原理,然后还是自己来实践一次

    预备知识:

    首先需要知道的是什么是内存盘,内存盘就是划分了一个内存空间来当磁盘使用来进行加速的,这个在某些操作系统里面会把/tmp/分区挂载到tmpfs下,来达到加速的目的,这样就是重启后,会清空/tmp的内容,centos7 默认的分区方式也使用了tmpfs来加速,df -h可以看下那个tmpfs就是内存盘了

    本文使用的不是tmpfs,这个是因为tmpfs不是我们常见意义上的那种文件系统,它不能格式化,ceph 在进行日志创建的时候会去检查journal 所在分区的 uuid, 而tmpfs在检测的时候 会返回一个全0的字符串,这个在校验的时候显示的无效的,所以也就部署起来有问题,下面开始介绍我的做法,这个里面做法很多,步骤也可以自己去变化,这里只是提供了我的一种思路

    我使用的是ramdisk,关于怎么做ramdisk这个也研究了一下,因为篇幅有点长并且属于预备步骤,请参考我的另外一篇文章:

    centos7下做内存盘的方法

    测试环境:

    单机,四块SAS的OSD,日志为5G(内存盘大小为6G),副本 2, osd分组

    说明:因为这里只去研究这个内存盘journal的实现,以及性能的差别,其他的组合方案需要自己去配置,所以单机的环境已经可以完成这个

    1、准备journal的内存盘

    检查内存盘大小

    [root@lab8106 ceph]# fdisk -l /dev/ram0
    
    Disk /dev/ram0: 6797 MB, 6797721600 bytes, 13276800 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
    

    我的大小为6G

    格式化内存盘,并且挂载

    创建挂载目录(有多少osd建几个)
    [root@lab8106 ceph]# mkdir -p /var/lib/ceph/mem/ceph-0
    
    格式化memdisk(需要几个格式化几个)
    [root@lab8106 ceph]# mkfs.xfs /dev/ram0  -f
    
    挂载内存盘
    [root@lab8106 ceph]# mount /dev/ram0 /var/lib/ceph/mem/ceph-0/
    
    挂载完了后的效果如下:
    [root@lab8106 ceph]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda2        50G  9.7G   41G  20% /
    devtmpfs         24G     0   24G   0% /dev
    tmpfs            24G     0   24G   0% /dev/shm
    tmpfs            24G   17M   24G   1% /run
    tmpfs            24G     0   24G   0% /sys/fs/cgroup
    /dev/sda1       283M   94M  190M  33% /boot
    /dev/ram0       6.4G   33M  6.3G   1% /var/lib/ceph/mem/ceph-0
    /dev/ram1       6.4G   33M  6.3G   1% /var/lib/ceph/mem/ceph-1
    /dev/ram2       6.4G   33M  6.3G   1% /var/lib/ceph/mem/ceph-2
    /dev/ram3       6.4G   33M  6.3G   1% /var/lib/ceph/mem/ceph-3
    

    2、准备ceph的环境

    修改deploy的ceph.conf文件,在部署前修改好
    单机环境添加下面的三个

    osd_crush_chooseleaf_type = 0
    osd_pool_default_size = 2
    osd_journal = /var/lib/ceph/mem/$cluster-$id/journal
    

    意思就不在这里介绍了

    创建mon

    [root@lab8106 ceph]# ceph-deploy mon create lab8106
    [root@lab8106 ceph]# ceph-deploy gatherkeys lab8106
    

    创建osd

    [root@lab8106 ceph]# ceph-deploy osd prepare lab8106:/dev/sdb1:/var/lib/ceph/mem/ceph-0/journal
    [root@lab8106 ceph]# ceph-deploy osd activate lab8106:/dev/sdb1
    

    部署完这个检查下

    [root@lab8106 ceph]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    ……
    /dev/ram0       6.4G  5.1G  1.3G  80% /var/lib/ceph/mem/ceph-0
    /dev/ram1       6.4G   33M  6.3G   1% /var/lib/ceph/mem/ceph-1
    /dev/ram2       6.4G   33M  6.3G   1% /var/lib/ceph/mem/ceph-2
    /dev/ram3       6.4G   33M  6.3G   1% /var/lib/ceph/mem/ceph-3
    /dev/sdb1       280G   34M  280G   1% /var/lib/ceph/osd/ceph-0
    

    可以看到内存盘分区内已经生成可一个5G的journal文件

    [root@lab8106 ceph]# ll /var/lib/ceph/osd/ceph-0
    total 40
    ……
    lrwxrwxrwx  1 root root   32 Jan 14 10:28 journal -> /var/lib/ceph/mem/ceph-0/journal
    

    可以看到osd分区的也是链接到了内存盘,环境没问题

    继续部署生效的三个osd

    部署完再次检查环境

    [root@lab8106 ceph]# df -h|grep ceph
    /dev/ram0       6.4G  5.1G  1.3G  80% /var/lib/ceph/mem/ceph-0
    /dev/ram1       6.4G  5.1G  1.3G  80% /var/lib/ceph/mem/ceph-1
    /dev/ram2       6.4G  5.1G  1.3G  80% /var/lib/ceph/mem/ceph-2
    /dev/ram3       6.4G  5.1G  1.3G  80% /var/lib/ceph/mem/ceph-3
    /dev/sdb1       280G   34M  280G   1% /var/lib/ceph/osd/ceph-0
    /dev/sdc1       280G   34M  280G   1% /var/lib/ceph/osd/ceph-1
    /dev/sdd1       280G   34M  280G   1% /var/lib/ceph/osd/ceph-2
    /dev/sde1       280G   33M  280G   1% /var/lib/ceph/osd/ceph-3
    

    都挂载正确
    检查集群的状态

    [root@lab8106 ceph]# ceph -s
        cluster 68735617-2d30-4a81-9865-aeab3ea85e6e
         health HEALTH_OK
         monmap e1: 1 mons at {lab8106=192.168.8.106:6789/0}
                election epoch 2, quorum 0 lab8106
         osdmap e21: 4 osds: 4 up, 4 in
          pgmap v35: 192 pgs, 1 pools, 0 bytes data, 0 objects
                136 MB used, 1116 GB / 1117 GB avail
                     192 active+clean
    

    环境部署完毕

    开始测试

    测试一:采用内存盘journal的方式
    使用radosbench进行测试(采取默认的写,并且不删除的测试,尽量把内存写满,未进行任何调优)

    [root@lab8106 ceph]# rados bench -p rbd 120 write --no-cleanup --run-name testmemdisk
    Total time run:         120.568031
    Total writes made:      5857
    Write size:             4194304
    Bandwidth (MB/sec):     194.314 
    
    Stddev Band       144.18
    Max bandwidth (MB/sec): 504
    Min bandwidth (MB/sec): 0
    Average Latency:        0.329322
    Stddev Latency:         0.48777
    Max latency:            3.01612
    Min latency:            0.0377235
    

    测试二:采用默认的磁盘journal的方式,环境恢复要原始的情况

    [root@lab8106 ceph]# rados bench -p rbd 120 write --no-cleanup --run-name testmemdisk
    Total time run:         120.613851
    Total writes made:      3404
    Write size:             4194304
    Bandwidth (MB/sec):     112.889 
    
    Stddev Band       26.3641
    Max bandwidth (MB/sec): 160
    Min bandwidth (MB/sec): 0
    Average Latency:        0.566656
    Stddev Latency:         0.305038
    Max latency:            2.00623
    Min latency:            0.105026
    

    测试的结果如上,上表格也许看的更直观,正好之前在找一个表格插件,现在用用

    内存盘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的方式是可以,还有更方便的方式就是直接用内存路径,需要处理几个地方,我们来看下怎么处理

    首先修改配置文件

    osd_journal =/dev/shm/$cluster-$id/journal
    journal dio = false
    journal aio = false
    

    增加这三个选项,否则会失败,这个是因为在内存这个路径下用文件的时候是无法满足默认的dio,和aio选项的,会造成无法生成journal文件,生成的journal的文件的大小为0,无法成功

    假如我们给osd.5替换journal,我们看下操作步骤

    [root@lab8106 ceph-5]# mkdir /dev/shm/ceph-5
    [root@lab8106 ceph-5]# chown ceph:ceph /dev/shm/ceph-5
    

    创建目录并且修改权限
    修改fsid

    [root@lab8106 ceph-5]# cat fsid 
    f66832a7-6bd0-4eef-a538-15ba2404243f
    

    这个fsid是用来校验journal的
    而内存的uuid为

    [root@lab8106 ceph-5]#ceph-osd -i 7 --get-journal-uuid --osd-journal /dev/shm/ceph-7/journal
    00000000-0000-0000-0000-000000000000
    

    所以修改这个文件

    echo 00000000-0000-0000-0000-000000000000 > fsid
    

    创建journal

    [root@lab8106 ceph-5]# ceph-osd -i 5 --mkjournal --setuser ceph --setgroup ceph --debug_ms 20 --debug_osd 20
    2017-01-20 10:58:22.297737 7f0f1a75a800 -1 created new journal /dev/shm/ceph-5/journal for object store /var/lib/ceph/osd/ceph-5
    [root@lab8106 ceph-5]# ll /dev/shm/ceph-5/journal
    -rw-r--r-- 1 ceph ceph 1073741824 Jan 20 10:58 /dev/shm/ceph-5/journal
    

    启动osd就可以了

    变更记录

    Why Who When
    创建 武汉-运维-磨渣 2016-01-14
    增加/dev/shm/路径模式 武汉-运维-磨渣 2017-01-20
  • 相关阅读:
    BBS项目
    form组件
    auth模块
    模板语言
    内置auth 的使用,用超级用户创建
    django文件上传
    django序列化问题
    SPI Flash的操作
    输入捕获实验
    uc os相关的C语言知识点1-函数指针
  • 原文地址:https://www.cnblogs.com/zphj1987/p/13575324.html
Copyright © 2020-2023  润新知