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

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

查看所有标签

猜你喜欢:

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

从零开始做运营

从零开始做运营

张亮 / 中信出版社 / 2015-11-1 / 49.00元

运营是什么?怎样做运营?产品和运营是什么关系?我是否适合从事互联网运营?为什么我做的运营活动收效甚微? 在互联网大热的今天,互联网运营成为一个越来越重要的岗位,事关网站、产品的发展与存亡。很多年轻人带着对互联网的热情投身到这个行业,却发现自己对这个行业所知甚少,对互联网运营更加陌生,甚至有一些有志于从事互联网运营的人,因为对运营缺乏了解而难以确定自己的职业发展方向。本书的出发点就在于此,它将......一起来看看 《从零开始做运营》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换