librados是ceph各组件对外暴露的模块,藉由librados接口,可以高效的使用ceph内的组件进行CRUD等操作。
1 | import rados |
这里的conf=keyring主要用于当打开了cephx等认证措施时,ceph.conf中又没有记录认证所用到的keyring文件路径时,进行额外设置使用。
最近我在参照python的librados使用,调用C的接口时,就一直遇到cephx认证打开之后,无法成功rados_connect
的情况,具体原理还得细看,但应该和cephx及这个keyring存在强相关性是可以确认的了。
连接成功之后,主要使用下属这几个接口来查询pool
,osd
,pg
等一些信息。
1 | Rados.mon_command(self, cmd, inbuf, timeout=0, target=None) |
就目前而言,我在抓取IO等指标时,用的比较多的接口是mon_command
和mgr_command
,使用这几个接口能进行的操作,都有提供cli和rest接口。我主要是在使用cli熟悉接口之后,会去代码中的MonCommands.h
和MgrCommands.h
文件中去找相近的prefix,然后参照着使用。
但是偶尔也是会遇到像ceph osd pool stats
和ceph pg ls-by-pools
这类没怎么能找到相关prefix的情况。这个时候可以充分利用起ceph这个cli入口其实是个python文本的功能了。
python -m pgd /bin/ceph osd pool stats
执行,在new_style_command
函数内的json_command
处打断点,进入后,打印cmddict
就可以看到cli发送出去的prefix拼接出来是什么样子的了,然后再拿着这个去代码里搜就好了。
开发者模式[^2]
make vstart
async模式
- mon_command_async
- 好像RadosClient.cc里有这个异步下发任务, 但是似乎并没有对外提供成librados的接口.
- 之后有空应该是可以利用这个封装出来使用的应该.
radosstripper理解
rados连接过程
似乎有加载client name.
parse_config_files似乎还有指定不读取任何配置文件的时候, 即便是默认配置文件
- global_pre_init里调用的似乎就是这个.
"cdef class Rados(object):"->"name = 'client.admin'"
- 默认name client.admin
context 是什么?
rados_create2
- rados_create_cct()
librados::RadosClient::connect理解
- monclient.init()
源码
- RadosClient
- IoctxImpl
- AioCompletionImpl
- osdc
超时参数
- client_mount_timeout
- client
- rados_osd_op_timeout
- 连接上osd后, osd断开的时间
- rados_mon_op_timeout
- 连接上mon后,mon响应的超时时间
key/nspace/hash
key相当于替换object_name的一个映射名
nspace是在crush计算时, 拼接的前缀名
hash可以直接指定pg, 但是这个好像没有封装提供对外接口
get_object_pg_hash_position 只有查询函数
1 | // mapping |