zoukankan      html  css  js  c++  java
  • Ceph根据Crush位置读取数据

    前言

    在ceph研发群里面看到一个cepher在问关于怎么读取ceph的副本的问题,这个功能应该在2012年的时候,我们公司的研发就修改了代码去实现这个功能,只是当时的硬件条件所限,以及本身的稳定性问题,后来没有在生产当中使用

    我们都知道ceph在写数据的时候,是先写主本,然后去写副本,而读取的时候,实际上只有主本能够提供服务,这对于磁盘的整体带宽来说,并没有充分的发挥其性能,所以能够读取副本当然是会有很大好处的,特别是对于读场景比较多的情况

    那么在ceph当中是不是有这个功能呢?其实是有的,这个地方ceph更往上走了一层,是基于crush定义的地址去进行文件的读取,这样在读取的客户端眼里,就没有什么主副之分,他会按自己想要的区域去尽量读取,当然这个区域没有的时候就按正常读取就可以了

    实践

    如果你看过关于ceph hadoop的相关配置文档,应该会看到这么一个配置

    ceph.localize.reads

    Allow reading from file replica objects

    Default value: true

    显示的是可以从非主本去读取对象,这个对于hadoop场景肯定是越近越好的,可以在ceph的代码里面搜索下 localize-reads
    https://github.com/ceph/ceph/blob/master/src/ceph_fuse.cc

      for (std::vector<const char*>::iterator i = args.begin(); i != args.end(); ) {
        if (ceph_argparse_double_dash(args, i)) {
          break;
        } else if (ceph_argparse_flag(args, i, "--localize-reads", (char*)NULL)) {
          cerr << "setting CEPH_OSD_FLAG_LOCALIZE_READS" << std::endl;
          filer_flags |= CEPH_OSD_FLAG_LOCALIZE_READS;
        } else if (ceph_argparse_flag(args, i, "-h", "--help", (char*)NULL)) {
          usage();
        } else {
          ++i;
        }
      }
    

    可以看到在ceph-fuse的情况下,是有这个隐藏的一个参数的,本篇就是用这个隐藏的参数来进行实践

    配置一个两节点集群

    配置完成了以后ceph的目录树如下,mon部署在lab8106上面

    [root@lab8107 ~]# ceph osd tree
    ID WEIGHT  TYPE NAME        UP/DOWN REWEIGHT PRIMARY-AFFINITY 
    -1 1.07336 root default                                       
    -2 0.53778     host lab8106                                   
     1 0.26779         osd.1         up  1.00000          1.00000 
     0 0.26999         osd.0         up  1.00000          1.00000 
    -3 0.53558     host lab8107                                   
     2 0.26779         osd.2         up  1.00000          1.00000 
     3 0.26779         osd.3         up  1.00000          1.00000
    [root@lab8107 ~]# ceph -s|grep mon
    monmap e1: 1 mons at {lab8106=192.168.8.106:6789/0}
    

    在lab8107上挂载客户端

    在/etc/ceph/ceph.conf中增加一个配置

    [client]
    crush_location = "host=lab8107 root=default"
    

    这个配置的作用是告诉这个客户端尽量去读取lab8107上面的对象

    [root@lab8107 ~]# ceph-fuse -m lab8106:6789 /mnt  --localize-reads
    

    写入一个大文件

    [root@lab8107 ~]# dd if=/dev/zero of=a bs=4M count=4000
    

    在lab8106和lab8107上监控磁盘

    [root@lab8107 ~]# iostat -dm 1
    

    读取数据

    [root@lab8107 ~]# dd if=a of=/dev/null
    

    可以看到只有lab8107上有磁盘的读取,也就是读取的数据里面肯定也有副本,都是从lab8107上面读取了

    如果需要多次测试,需要清除下缓存

    sync; echo 3 > /proc/sys/vm/drop_caches
    

    并且重新挂载客户端,这个读取crush的位置的操作是在mount的时候读取的

    使用场景

    上面的配置是可以指定多个平级的位置的

    [client]
    crush_location = "host=lab8106 host=lab8107 root=default"
    

    这样,在一些读请求很多的场景下,可以把整个后端按逻辑上划分为一个个的区域,然后前面的客户端就可以平级分配到这些区域当中,这样就可以比较大的限度去把副本的读取也调动起来的

    目前在ceph-fuse上已经实现,rbd里面也有类似的一些处理,这个是一个很不错的功能

    总结

    ceph里面有很多可配置的东西,怎么用好它,最大限度的去适配使用场景,还是有很大的可调的空间的,所谓学无止境,我也在学习python coding了,有很多想法等着去实现

    变更记录

    Why Who When
    创建 武汉-运维-磨渣 2017-04-27
  • 相关阅读:
    [ Talk is Cheap Show me the CODE ] : jQuery Mobile工具栏
    Html 表格
    概率论机器学习的先验知识(上)
    ODPS 下一个map / reduce 准备
    Zygote过程【3】——SystemServer诞生
    Java获取的一天、本星期、这个月、本季度、一年等 开始和结束时间
    中国国家干部级别、职称级别、事业单位级别
    Multivariate Adaptive Regression Splines (MARSplines)
    在Visual Studio中开发Matlab mex文件,生成mexw64/mexw32
    Windows删除文件时出现,“正在准备 再循环”
  • 原文地址:https://www.cnblogs.com/zphj1987/p/13575424.html
Copyright © 2011-2022 走看看