Ceph根据Crush位置读取数据
Ceph根据Crush位置读取数据
zphj1987前言
在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
1 | for (std::vector<const char*>::iterator i = args.begin(); i != args.end(); ) { |
可以看到在ceph-fuse的情况下,是有这个隐藏的一个参数的,本篇就是用这个隐藏的参数来进行实践
配置一个两节点集群
配置完成了以后ceph的目录树如下,mon部署在lab8106上面
1 | [root@lab8107 ~]# ceph osd tree |
在lab8107上挂载客户端
在/etc/ceph/ceph.conf中增加一个配置
1 | [client] |
这个配置的作用是告诉这个客户端尽量去读取lab8107上面的对象
1 | [root@lab8107 ~]# ceph-fuse -m lab8106:6789 /mnt --localize-reads |
写入一个大文件
1 | [root@lab8107 ~]# dd if=/dev/zero of=a bs=4M count=4000 |
在lab8106和lab8107上监控磁盘
1 | [root@lab8107 ~]# iostat -dm 1 |
读取数据
1 | [root@lab8107 ~]# dd if=a of=/dev/null |
可以看到只有lab8107上有磁盘的读取,也就是读取的数据里面肯定也有副本,都是从lab8107上面读取了
如果需要多次测试,需要清除下缓存
1 | sync; echo 3 > /proc/sys/vm/drop_caches |
并且重新挂载客户端,这个读取crush的位置的操作是在mount的时候读取的
使用场景
上面的配置是可以指定多个平级的位置的
1 | [client] |
这样,在一些读请求很多的场景下,可以把整个后端按逻辑上划分为一个个的区域,然后前面的客户端就可以平级分配到这些区域当中,这样就可以比较大的限度去把副本的读取也调动起来的
目前在ceph-fuse上已经实现,rbd里面也有类似的一些处理,这个是一个很不错的功能
总结
ceph里面有很多可配置的东西,怎么用好它,最大限度的去适配使用场景,还是有很大的可调的空间的,所谓学无止境,我也在学习python coding了,有很多想法等着去实现
变更记录
Why | Who | When |
---|---|---|
创建 | 武汉-运维-磨渣 | 2017-04-27 |