Ceph根据Crush位置读取数据

栏目: 服务器 · 发布时间: 6年前

内容简介:Ceph根据Crush位置读取数据
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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python Data Structures and Algorithms

Python Data Structures and Algorithms

Benjamin Baka / Packt Publishing / 2017-5-30 / USD 44.99

Key Features A step by step guide, which will provide you with a thorough discussion on the analysis and design of fundamental Python data structures.Get a better understanding of advanced Python c......一起来看看 《Python Data Structures and Algorithms》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具