ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ceph Python 客户端开发实战:深入理解 rados 模块与 librados Python 绑定

Ceph Python 客户端开发实战:深入理解 rados 模块与 librados Python 绑定 存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载rados模块是 Ceph 官方提供的librados的 Python 薄封装thin wrapper它让开发者能够用纯 Python 编写自定义的 Ceph 分布式存储客户端直接对 Ceph 存储集群执行对象读写、存储池管理、XATTR 扩展属性操作以及向 Monitor/OSD/MGR 发送管理命令。本文以仓库中的 doc/rados/api/python.rst 为骨架结合 rados.pyx 的源码实现完整讲解从安装、连接集群、管理存储池到对象与扩展属性读写的全过程帮助你掌握一套可直接落地运行的 Ceph Python 客户端编程范式。安装获取 Python 版 libradosrados模块通过python3-rados软件包分发。在不同发行版上安装命令如下Debian/Ubuntusudo apt-get install python3-radosRHEL/CentOSsudo yum install python3-radosSLE/openSUSEsudo zypper install python3-rados安装后模块位于 Debian 系统的/usr/share/pyshared目录或 CentOS/RHEL 系统的/usr/lib/python*/site-packages目录。仓库内对应的构建与打包源文件位于 src/pybind/rados/包括rados.pyxCython 实现、setup.py与pyproject.toml可据此了解模块的编译与安装方式。更多关于 librados 各语言绑定的说明参见 doc/rados/api/librados-intro.rst。快速上手构建你的第一个 Ceph Python 客户端使用 Python 绑定操作 Ceph 集群需要四步导入模块 → 创建集群句柄cluster handle→ 连接集群 → 通过 I/O 上下文读写数据。开始前你需要一个正在运行的 Ceph 集群快速搭建方法参见 doc/start并拥有合适的客户端凭据。本文示例默认使用client.admin用户。首先创建源码文件vim client.py导入模块import rados创建集群句柄rados.Rados类封装了连接 Ceph 存储集群所需的全部客户端配置。默认情况下集群句柄假定集群名为ceph与部署工具及官方快速入门指南一致、用户名为client.admin这些默认值都可以按需修改。连接集群前应用必须知道 Ceph Monitor 的位置。标准做法是在 Ceph 配置文件中记录初始 Monitor 地址然后在创建句柄时传入配置文件路径import rados, sys # 创建句柄的几种示例 cluster rados.Rados(conffileceph.conf) cluster rados.Rados(conffilesys.argv[1]) cluster rados.Rados(conffileceph.conf, confdict(keyring/path/to/keyring))要点说明conffile参数提供 Ceph 配置文件的路径与文件名用sys模块读取命令行参数可以避免硬编码路径。Python 客户端还需要一个 keyring密钥环。示例默认使用client.admin的密钥如果要在创建句柄时显式指定 keyring可以用conf参数也可以在 Ceph 配置文件中写入 keyring 路径例如keyring /path/to/ceph.client.admin.keyring从源码 rados.pyx 可以看到Rados.__init__的配置加载顺序是先应用conf_defaults默认值再读取conffile指定的配置文件conffile为空字符串或DEFAULT_CONF_FILES时读取标准配置文件None或NO_CONF_FILE时不读文件最后应用conf字典中的键值对后者优先级最高。连接集群句柄配置完成后即可连接集群连接成功后就可以调用返回集群信息的各种方法import rados, sys cluster rados.Rados(conffileceph.conf) print(\nlibrados version: {}.format(str(cluster.version()))) print(Will attempt to connect to: {}.format(str(cluster.conf_get(mon host)))) cluster.connect() print(\nCluster ID: {}.format(cluster.get_fsid())) print(\n\nCluster Statistics) print() cluster_stats cluster.get_cluster_stats() for key, value in cluster_stats.items(): print(key, value)默认情况下 Ceph 认证是开启的应用必须知道 keyring 的位置。python-ceph模块没有内置默认 keyring 位置因此需要显式指定——最简单的方式是把它写进 Ceph 配置文件[global] # ... 其余配置省略 keyring /path/to/keyring/ceph.client.admin.keyring关闭连接完成所有操作后应显式关闭连接以释放资源异步操作还需先等待其完成print(\nClosing the connection.) ioctx.close() cluster.shutdown()从源码看Rados还实现了上下文管理器协议rados.pyx 中的__enter__/__exit__因此也可以写成with rados.Rados(conffile...) as cluster:退出时自动调用shutdown()。管理存储池Pool连接集群后RadosAPI 允许你列出存储池、检查存储池是否存在、创建和删除存储池print(\n\nPool Operations) print() print(\nAvailable Pools) print(----------------) pools cluster.list_pools() for pool in pools: print(pool) print(\nCreate test Pool) print(------------------) cluster.create_pool(test) print(\nPool named test exists: {}.format(str(cluster.pool_exists(test)))) print(\nVerify test Pool Exists) print(-------------------------) pools cluster.list_pools() for pool in pools: print(pool) print(\nDelete test Pool) print(------------------) cluster.delete_pool(test) print(\nPool named test exists: {}.format(str(cluster.pool_exists(test))))警告使用该 API 删除存储池时务必谨慎——删除存储池意味着该池及其全部数据都会永久丢失。底层实现上rados.pyxpool_exists调用rados_pool_lookup返回值大于等于 0 表示池存在返回-ENOENT表示不存在其他负值则抛出异常create_pool支持可选的crush_rule参数指定 CRUSH 规则从而控制数据在集群中的放置策略。I/O 上下文Ioctx读写数据的前提对 Ceph 对象存储进行读写必须创建 I/O 上下文ioctx它把连接绑定到一个特定的存储池。用户需要具备访问该池的相应 CAPS 权限——例如只有读权限的用户将无法写入。# 按池名称打开推荐 ioctx cluster.open_ioctx(data)或者按池 ID 打开ioctx cluster.open_ioctx2(pool_id)从源码看open_ioctx内部调用rados_ioctx_create、open_ioctx2内部调用rados_ioctx_create2rados.pyx两者都要求集群句柄处于connected状态。Ioctx类还提供了get_stats()获取池的使用统计、get_last_version()获取最近一次写操作的版本号可用于实现乐观锁/条件更新语义等能力。对象操作写入、读取与删除拥有 I/O 上下文后即可对对象进行操作。写一个不存在的对象时 Ceph 会创建它写一个已存在的对象时 Ceph 会覆盖它除非指定了 range此时只覆盖该 range 内的内容print(\nWriting object hw with contents Hello World! to pool data.) ioctx.write_full(hw, Hello World!) print(\n\nContents of object hw\n------------------------\n) print(ioctx.read(hw)) print(\nRemoving object hw) ioctx.remove_object(hw)同步对象操作 APIIoctx类提供的核心同步对象操作方法定义于 rados.pyx 附近方法说明write(key, data, offset0)从指定偏移开始同步写数据rados_writewrite_full(key, data)整体覆写对象原子地截断后再写入rados_write_fullappend(key, data)在对象末尾追加数据writesame(key, data, write_len, offset0)将同一缓冲区重复写入指定长度read(key, length8192, offset0)从指定偏移同步读取length字节默认一次读 8 KiBstat(key)返回(size, mtime)元组trunc(key, size)将对象截断到指定大小remove_object(key)删除对象注意write与write_full在语义上的区别write是按偏移覆盖写入不会改变对象已有尾部write_full是整体替换先原子截断再写入适合初始化或全量更新场景。异步对象操作 API对于高吞吐场景可以使用异步方法。异步操作需要提供完成回调oncomplete/onsafe并通过aio_flush()等待未决操作落盘aio_write(object_name, to_write, offset0, oncompleteNone, onsafeNone)异步写aio_write_full(object_name, to_write, oncompleteNone, onsafeNone)异步整体写aio_append(object_name, to_append, oncompleteNone, onsafeNone)异步追加aio_read(object_name, length, offset, oncomplete)异步读aio_flush()阻塞直至所有异步写操作安全落盘此外set_locator_key(loc_key)可以为对象设置 locator key用于控制对象的放置位置Ioctx还支持通过set_namespace()在命名空间内隔离对象仓库中的实现位于 rados.pyx 的 Ioctx 类中。扩展属性XATTR读写对象创建后可以为其写入并读取扩展属性XATTR常用于存储对象元数据print(\n\nWriting XATTR lang with value en_US to object hw) ioctx.set_xattr(hw, lang, en_US) print(\n\nGetting XATTR lang from object hw\n) print(ioctx.get_xattr(hw, lang))XATTR 相关方法包括set_xattr(key, xattr_name, xattr_value)设置扩展属性get_xattr(key, xattr_name)读取单个扩展属性值get_xattrs(oid)返回XattrIterator迭代器可遍历对象上全部扩展属性rm_xattr(key, xattr_name)删除扩展属性XattrIterator的__next__()返回(属性名, 属性值)形式的元组配合循环即可枚举对象的所有元数据。列出对象与文件式 Object 接口如果需要检查池中的对象列表可以通过对象迭代器遍历object_iterator ioctx.list_objects() while True: try: rados_object object_iterator.__next__() print(Object contents {}.format(rados_object.read())) except StopIteration: break # 或更简洁的写法 [print(Object contents {}.format(obj.read())) for obj in ioctx.list_objects()]Object类为对象提供了类似文件的接口定义于 rados.pyx内部维护一个offset游标支持连续读写read(length1024*1024)从当前游标读取默认一次读 1 MiB并自动推进游标write(string_to_write)从当前游标写入并推进游标seek(position)移动读写游标stat()返回(size, mtime)get_xattr(xattr_name)/get_xattrs()/set_xattr(xattr_name, xattr_value)/rm_xattr(xattr_name)扩展属性操作remove()删除对象需要说明的是Object接口提供的是同步的文件式操作异步操作应使用 I/O 上下文Ioctx的方法以获得更好的并发性能。对象删除后其状态变为removed此时再调用方法会抛出ObjectStateError。通过 Python 调用集群管理命令rados模块的集群句柄还封装了四类管理命令通道——Ceph CLI 工具内部正是通过这些 Python 绑定方法与集群交互的mon_command(cmd, inbuf, timeout0, targetNone)向 Monitor 发送命令。cmd是 JSON 格式字符串target可指定某个 Monitor 的名称或 rank返回(ret, outbuf, outs)三元组。例如检查 OSD 是否可安全销毁import json c rados.Rados(conffile/etc/ceph/ceph.conf) c.connect() cmd json.dumps({prefix: osd safe-to-destroy, ids: [2], format: json}) c.mon_command(cmd, b)osd_command(osdid, cmd, inbuf, timeout0)向指定 OSD 发送命令mgr_command(cmd, inbuf, timeout0, targetNone)向 Ceph Manager 发送命令pg_command(...)向 Placement Group 发送命令从源码rados.pyx可以看到mon_command在未指定target时调用 C 层的rados_mon_command指定时调用rados_mon_command_targettimeout参数在当前 C API 中并未实现仅为向后兼容旧版 Python 绑定而保留。命令返回的outbuf是命令输出的字节内容outs是错误/附加信息文本。集群句柄 API 速查配置相关无需连接即可调用方法说明conf_get(option)读取配置项的值返回None表示未设置conf_set(option, val)设置配置项conf_read_file(pathNone)读取 Ceph 配置文件path为None时读取标准配置文件conf_parse_argv(args)解析并消费 Ceph 认识的命令行参数返回剩余未知参数conf_parse_env(varCEPH_ARGS)解析环境变量中的 Ceph 参数version()返回 librados C 库版本(major, minor, extra)三元组这些方法要求句柄处于configuring或connected状态参见源码中的require_state(configuring, connected)校验但不需要已经连接到集群。配置项的完整清单参见仓库的 Storage Cluster Configuration 文档。连接管理相关方法说明connect(timeout0)连接集群timeout当前被忽略仅保留兼容性shutdown()断开连接并释放资源get_fsid()获取集群文件系统 IDget_cluster_stats()返回集群统计字典键为kb总空间、kb_used已用空间、kb_avail可用空间、num_objects对象总数require_state(*args)断言句柄处于某个状态如configuring、connecting、connected否则抛出RadosStateErrorget_instance_id()获取当前实例的全局 ID注意get_cluster_stats()返回的数据是最终一致的——写入数据后不会立即更新。连接失败或操作出错时绑定会把 C 层的错误码转换为 Python 异常如Error、TypeError、LogicError、RadosStateError等因此建议用try/except包裹网络与 I/O 相关调用。源码级延伸阅读src/pybind/rados/rados.pyxrados模块的 Cython 实现包含Rados、Ioctx、Object、ObjectIterator、XattrIterator等类以及错误码到异常的全部转换逻辑。阅读它可精确掌握每个方法的参数语义、默认值、状态机约束configuring→connected→shutdown与底层rados_*C 函数调用链。doc/rados/api/librados-intro.rstlibrados 各语言绑定C/C/Python/Java/PHP的入门指南包含集群句柄创建、I/O 上下文建立与多语言对照示例。doc/rados/api/librados.rst 与 doc/rados/api/libradospp.rstC 与 C 版本的 API 参考便于对照理解 Python 绑定与底层接口的对应关系。examples/librados/仓库自带的 librados 编程示例可与本文的 Python 示例互为印证。小结通过rados模块你可以用最少的样板代码把 Python 应用接入 Ceph 分布式存储创建集群句柄、读取配置并连接集群、打开 I/O 上下文、执行对象与扩展属性的同步/异步读写、管理存储池甚至直接向 Monitor/OSD/MGR 下发管理命令。理解 rados.pyx 中各方法对底层 C API 的封装与状态机约束能帮助你在实际项目中写出健壮、可维护的 Ceph Python 客户端——无论是自定义对象存储网关、数据迁移工具还是基于 RADOS 的领域专用存储系统。赞分享存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载相关推荐深入解析 Ceph LibCephFS Python 绑定用 cephfs 模块编写分布式文件系统客户端深入解析 Ceph LibCephFS Python 绑定用 cephfs 模块编写分布式文件系统客户端 本文围绕 Ceph 官方文档 LibCephFS P存储分布式文件系统对象存储后端高可用Ceph librados 开发指南用 RADOS API 构建自定义存储接口Ceph librados 开发指南用 RADOS API 构建自定义存储接口 Ceph 存储集群Ceph Storage Cluster在底层由 RAD存储分布式文件系统对象存储后端高可用Tinode Python gRPC 绑定包 tinode_grpc 完整指南gRPC 客户端与插件开发实战Tinode Python gRPC 绑定包 tinode_grpc 完整指南gRPC 客户端与插件开发实战 本篇指南围绕开源即时通讯平台 Tinode 的后端即时通讯创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表