内容简介: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.ccfor (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 |
以上所述就是小编给大家介绍的《Ceph根据Crush位置读取数据》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。