内容简介: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位置读取数据》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
代码里的世界观——通往架构师之路
余叶 / 人民邮电出版社 / 2018-11 / 59.00元
本书分为两大部分,第一部分讲述程序员在编写程序和组织代码时遇到的很多通用概念和共同问题,比如程序里的基本元素,如何面向对象,如何面向抽象编程,什么是耦合,如何进行单元测试等。第二部分讲述程序员在编写代码时都会遇到的思考和选择,比如程序员的两种工作模式,如何坚持技术成长,程序员的组织生产方法,程序员的职业生涯规划等。一起来看看 《代码里的世界观——通往架构师之路》 这本书的介绍吧!