前言

在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

Ceph根据Crush位置读取数据的更多相关文章

  1. 吴裕雄--天生自然python学习笔记:pandas模块用 dataframe.loc 通过行、列标题读取数据

    用 df.va lue s 读取数据的前提是必须知道学生及科目的位置,非常麻烦 . 而 df.loc 可直接通过行.列标题读取数据,使用起来更为方便 . 使用 df.loc 的语法为: 行标题或列标题 ...

  2. 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式

    Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...

  3. ceph之crush map

    编辑crush map: 1.获取crush map: 2.反编译crush map: 3.至少编辑一个设备,桶, 规则: 4.重新编译crush map: 5.重新注入crush map: 获取cr ...

  4. jsonp从服务器读取数据并且予以显示

    之前看了许多的关于jsonp的文章,大多是讲的比较的模糊的,下面是我的个人的理解! 基于这样的一段代码,做下解释: 这是在jsonp中读取数据的时候(取出来当然是json的格式json格式不清楚的,可 ...

  5. 【转】基本数据持久性(一) 使用plist保存和读取数据

    原文网址:http://www.it165.net/pro/html/201309/7170.html 想保存成绩.记录得分.保存账号密码等等?数据持久性可以做到这一点!这篇文章通过简单的程序,来分享 ...

  6. Delphi判断文件是否正在被使用(CreateFile也可以只是为了读取数据,而不是创建)

    首先,我们先来认识下CreateFile函数,它的原型如下   HANDLE CreateFile( LPCTSTR lpFileName,    //指向文件名的指针 DWORD dwDesired ...

  7. 文件操作ofstream,open,close,ifstream,fin,依照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件

     1.ofstream,open,close 写入文件 #include<iostream> #include<fstream> using namespace std; ...

  8. SQL Server数据库读取数据的DateReader类及其相关类

    之前学了几天的SQL Server,现在用C#代码连接数据库了. 需要使用C#代码连接数据库,读取数据. 涉及的类有: ConfigurationManage SqlConnection SqlCom ...

  9. Kafka消费者-从Kafka读取数据

    (1)Customer和Customer Group (1)两种常用的消息模型 队列模型(queuing)和发布-订阅模型(publish-subscribe). 队列的处理方式是一组消费者从服务器读 ...

随机推荐

  1. 例题3-3 回文词(Palindromes, UVa401)

    输入一个字符串,判断它是否为回文串以及镜像串.输入字符串保证不含数字0.所谓 回文串,就是反转以后和原串相同,如abba和madam.所有镜像串,就是左右镜像之后和原串相同,如2S和3AIAE.注意, ...

  2. Django基础之Ajax

    知识预览 Ajax前戏:json Ajax简介 Jquery实现的ajax JS实现的ajax Ajax前戏:json 什么是json? 定义: JSON(JavaScript Object Nota ...

  3. 【UER #1】DZY Loves Graph

    UOJ小清新题表 题目内容 UOJ链接 DZY开始有\(n\)个点,现在他对这\(n\)个点进行了\(m\)次操作,对于第\(i\)个操作(从\(1\)开始编号)有可能的三种情况: Add a b: ...

  4. 面试官:如何写出让 CPU 跑得更快的代码?

    前言 代码都是由 CPU 跑起来的,我们代码写的好与坏就决定了 CPU 的执行效率,特别是在编写计算密集型的程序,更要注重 CPU 的执行效率,否则将会大大影响系统性能. CPU 内部嵌入了 CPU ...

  5. 安装虚拟机V15.5及LinuxCentOS6简易步骤

    1.下载虚拟机和Linux系统: (1)虚拟机下载地址(失效请自行百度):http://www.downza.cn/soft/74728.html (2)Linux系统下载地址(失效请自行百度):ht ...

  6. nginx优化:使用expires在浏览器端缓存静态文件

    一,nginx中expires指令的作用 网站的图片等静态文件一旦发布,通常很少改动, 为了减小对服务器请求的压力,提高用户浏览速度, 我们可以设置nginx中的expires, 使用户访问一次后,将 ...

  7. 在windows2003上安装itunes

    本人使用windows server 2003系统 安装itunes时提示 AppleMobileDeviceSupport 只能按照在xp系统上或以上版本,你可以忽略这个错误.继续安装吧. 这样除了 ...

  8. java反射原来是这么玩的(反射一开,谁都不爱)

    反射的发展历史 1996年01月23日,jdk 1.0版本发布,代号为Oak(橡树). 这个代号为Oak(橡树)的版本,在发布后的第二年,1997年02月19日,发布jdk 1.1版本,这次版本发布中 ...

  9. Java中的5大队列,你知道几个?

    本文已收录至 https://github.com/vipstone/algorithm <算法图解>系列. 通过前面文章的学习<一文详解「队列」,手撸队列的3种方法!>我们知 ...

  10. python执行 sql 语句

    写的很好 import pymysql conn = pymysql.connect(host = '127.0.0.1',port = 3306,user = 'root',passwd = '12 ...