经过我测试发现,ceph基于令牌桶算法的流量和IOPS上限限制还是比较精准的。之前的测试报告找不到了,以后我会补上。源码地址为:https://github.com/ShiqiCooperation/shiqiceph

           

            本次修改是基于0.94.3版本,之后的版本rbd源码可能有变化,但是在实现上大同小异。


一,在librbd模块,做限制

         因为librbd模块的代码具有很明确的length,在librados层length就会被拆分成基于对象的length。所以我们基于librbd层做,具体为Internal .cc文件


二,设计构架

ceph基于令牌桶算法的image的流量IOPS上限限制

ceph基于令牌桶算法的image的流量IOPS上限限制

Librdb分为5层

Librbd接口层 :读配置,设置配置对象watch功能

Internal :所有librbd接口读写的汇总

Osdc : 对用户数据流切片

Objectcache: 用户数据缓冲层

Send op: 数据操作发送层


三,令牌桶算法

流量限制尝试了很多方案,但是只有采用令牌桶算法,才能限制的最为精准。

令牌桶算法的基本过程如下:

假如用户配置的平均发送速率为r,则每隔1/r秒一个令牌被加入到桶中;

假设桶最多可以存发b个令牌。如果令牌到达时令牌桶已经满了,那么这个令牌会被丢弃;

当一个n个字节的数据包到达时,就从令牌桶中删除n个令牌,并且数据包被发送到网络;

如果令牌桶中少于n个令牌,那么不会删除令牌,并且认为这个数据包在流量限制之外;

算法允许最长b个字节的突发,但从长期运行结果看,数据包的速率被限制成常量r

ceph基于令牌桶算法的image的流量IOPS上限限制

ceph基于令牌桶算法的image的流量IOPS上限限制


四,多个image的流量限制冲突问题解决

多用户多线程面向对象方式,需要分2种情况

1,多个用户,每个用户一个进程,去访问librbd

  因为动态库映射到进程后是独立的,所以多进程访问librbd的时候,每个进程都有一份librbd的映射,所以多用户在不同的进程里不影响。


2, 多个用户,在同一个进程里,用多线程去访问librbd

 当多用户在同一个进程里,并使用多线程向librbd写入数据。考虑到多个用户的IO控制应该相互不冲突,但是面对多线程的方式方式,又需要用到异步。如果和用户面对自己的线程和IO控制,和其他不用户不冲突?此时想到了,每个用户都有一个image对象,如果把线程资源和IO控制变量封装到image类里,就很好的规避了这个问题。

ceph基于令牌桶算法的image的流量IOPS上限限制

ceph基于令牌桶算法的image的流量IOPS上限限制


五,image元数据信息的存储位置

把所有IO限制的参数用一个ceph对象来保存。

创建image就是,就是向rados中写入一些key/value对,记录image的元数据。例如以下命令创建image :rbdcreate foo --size 10240 --order 22 --pool rbd

则记录的元信息如下:

Key(oid)

Value

备注

rbd_id.foo

1d3e74b0dc51

记录image name到image id的映射

image id是用rand()函数,按一定规则生成

foo.rbd

size : 10240

order : 22

object_prefix: rbd_data. 1d3e74b0dc51

snap_seq: 0

记录元信息

Order是用来计算block size,如order为22,block size为1<<22 = 4M

rbd_directory

……

name_foo: id_1d3e74b0dc51

Id_1d3e74b0dc51: name_foo

rbd_directory中记录了所有image的name和id的双向映射关系



六, 让限制的参数,即改即生效。

通过rbd命令,设置限制参数,让控制效果即改即生效

在流量配置文件当中涉及一个疑问,就是如何让配置文件修改后立即生效,经过ceph自带demo测试发现,ceph提供watch-notify机制。不同的ceph客户端通过watch-notify机制相互通讯。用一个客户端监视(watch)配置文件对象configure_obj.rbd,当另外一个客户端修改配置文件对象configure_obj.rbd的时候,configure_obj.rbd会通过ceph集群向监视的客户端发出一个notify的消息。监视客户端收到notify消息后立刻读取配置文件内容。

ceph基于令牌桶算法的image的流量IOPS上限限制ceph基于令牌桶算法的image的流量IOPS上限限制


七,命令样式。

通过修改rbd.cc命令,新增流量控制命令

image-meta list <image-name>                image metadata list keys with values
image-meta get <image-name> <key>           image metadata get the value associated with the key
image-meta set <image-name> <key> <value>   image metadata set key with value
image-meta remove <image-name> <key>        image metadata remove the key and value associated


key:
conf_rbd_throttle_iops_total
conf_rbd_throttle_iops_write
conf_rbd_throttle_iops_read
conf_rbd_throttle_bps_total
conf_rbd_throttle_bps_write
conf_rbd_throttle_bps_read


exp:
rbd image-meta list pool01/image01


rbd image-meta set pool01/image01 conf_rbd_throttle_iops_total 500
rbd image-meta set pool01/image01 conf_rbd_throttle_iops_write 500
rbd image-meta set pool01/image01 conf_rbd_throttle_iops_read 500


rbd image-meta set pool01/image01 conf_rbd_throttle_bps_total 50000
rbd image-meta set pool01/image01 conf_rbd_throttle_bps_write 50000
rbd image-meta set pool01/image01 conf_rbd_throttle_bps_read 50000




bps设置的范围是    每次块操作的大小<bps<1000000000 (最好为大于1000,单位为字节)
iops设置的范围是   0<iops<1000000000

相关文章:

  • 2021-12-27
  • 2021-11-18
  • 2021-12-15
  • 2021-05-30
  • 2022-12-23
  • 2021-12-12
猜你喜欢
  • 2021-11-15
  • 2021-05-16
  • 2022-12-23
  • 2021-10-07
相关资源
相似解决方案