python使用ceph的对象存储

参考文档

配置ceph

对象网关服务部署

添加rgw组件

ceph orch host label add r1-ceph1 rgw
ceph orch host label add r1-ceph2 rgw
ceph orch host label add r1-ceph3 rgw

上面命令将3台主机分别打上rgw标签
然后执行下面命令,将rgw服务部署到带有rgw标签的主机上:

# 部署一个 RGW 实例,命名为 my-rgw
ceph orch apply rgw my-rgw '--placement=label:rgw'

默认情况下,所有rgw服务都会启动并监听在主机的 80 端口上。

配置帐号

rgw服务配置成功以后,需要创建一个对象存储用户

radosgw-admin user create --uid=aaa --display-name="aaa" --email=aaa@123.com

会返回access_key和secret_key,记录下来后面使用。示例输出如下:

{
    "user_id": "aaa",
    "display_name": "aaa",
    "email": "aaa@123.com",
    "suspended": 0,
    "max_buckets": 1000,
    "subusers": [],
    "keys": [
    {
         "user": "aaa",
         "access_key": "WBTYDONO2DN3YT009INS",
         "secret_key": "XSNAGRyJYA1yL9pJvEAR8UTk22iWQaAXGaWfzX8s"
     }
     ],
     ....

列出用户

radosgw-admin user list

如果忘记密钥,可以重新生成密钥

radosgw-admin user modify --uid=<username> --gen-secret

运行这个命令后,原来的Access Key和Secret Key将失效,同时会显示新的密钥信息

利用python来存取文件

安装Python SDK

使用 boto3 库与 Ceph RGW 交互。安装 boto3

pip install boto3

Python 代码示例

import boto3
from botocore.client import Config

# Ceph RGW 配置
endpoint_url = 'http://r1-ceph1:80'  # 替换为你的 RGW 地址
aws_access_key_id = 'WBTYDONO2DN3YT009INS'  # 替换为你的 access_key
aws_secret_access_key = 'XSNAGRyJYA1yL9pJvEAR8UTk22iWQaAXGaWfzX8s'  # 替换为你的 secret_key

# 创建 S3 客户端
s3_client = boto3.client(
    's3',
    endpoint_url=endpoint_url,
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key,
    config=Config(signature_version='s3v4')  # Ceph RGW 需要使用 s3v4 签名
)

# 1. 创建存储桶
bucket_name = 'my-bucket'
try:
    s3_client.create_bucket(Bucket=bucket_name)
    print(f"Bucket '{bucket_name}' 创建成功.")
except Exception as e:
    print(f"bucket创建失败: {e}")

# 2. 列出存储桶
try:
    response = s3_client.list_buckets()
    print("Buckets:")
    for bucket in response['Buckets']:
        print(f"- {bucket['Name']}")
except Exception as e:
    print(f"Failed to list buckets: {e}")

# 3. 上传对象
object_key = 'abc.txt'
with open(object_key, 'rb') as file:
    file_content=file.read()
    print(f"file_content: {file_content}")
try:
    s3_client.put_object(Bucket=bucket_name, Key=object_key, Body=file_content)
    print(f"Object '{object_key}' 上传成功")
except Exception as e:
    print(f"object上传失败: {e}")

# 4. 下载对象
try:
    response = s3_client.get_object(Bucket=bucket_name, Key=object_key)
    downloaded_content = response['Body'].read()
    print(f"下载的正文是: {downloaded_content}")
    with open('downloaded_file.txt', 'wb') as file:
        file.write(downloaded_content)
except Exception as e:
    print(f"Failed to download object: {e}")

# 5. 删除对象
try:
    s3_client.delete_object(Bucket = bucket_name, Key = object_key)
    print(f"Object '{object_key}' deleted successfully.")
except Exception as e:
    print(f"Failed to delete object: {e}")

# 6. 删除存储桶
try:
    s3_client.delete_bucket(Bucket = bucket_name)
    print(f"Bucket '{bucket_name}' deleted successfully.")
except Exception as e:
    print(f"Failed to delete bucket: {e}")

注意事项

  1. 权限问题:确保 RGW 用户的权限足够执行上述操作。
  2. 网络连接:确保 Python 运行环境可以访问 Ceph RGW 的端点。
  3. 存储桶命名:存储桶名称必须全局唯一。

使用 rados 命令行工具

在 Ceph 集群中,对象存储(RGW)的数据是以对象的形式存储在存储池(Pool)中的。

要查看存储在 Ceph 集群中的内容,可以通过以下几种方式:

使用 rados 命令行工具

rados 是 Ceph 提供的底层工具,可以直接与存储池交互,查看存储的对象。

列出存储池

首先,列出集群中的所有存储池:

rados lspools

输出示例:

.rgw.root
default.rgw.control
default.rgw.meta
default.rgw.log
default.rgw.buckets.index
default.rgw.buckets.data  # 这个一般是存储文件的

列出存储池中的对象

使用 rados ls 命令列出指定存储池中的所有对象:

rados -p <pool-name> ls

例如,列出 default.rgw.buckets.data 存储池中的对象:

rados -p default.rgw.buckets.data ls

查看对象内容

使用 rados get 命令将对象内容导出到本地文件:

rados -p <pool-name> get <object-name> <output-file>

例如,将对象 my-object 导出到本地文件 output.txt

rados -p default.rgw.buckets.data get my-object output.txt

另外也可以上操作文件

# 上传文件
rados -p default.rgw.buckets.data put cccccc anaconda-ks.cfg

# 查看
rados -p default.rgw.buckets.data ls
cccccc

# 下载
rados -p default.rgw.buckets.data get cccccc abc.txt

# 删除
rados -p default.rgw.buckets.data rm cccccc

使用 radosgw-admin 命令行工具

radosgw-admin 是专门用于管理 RGW 的工具,可以查看用户、存储桶和对象信息。

列出所有用户

radosgw-admin user list

查看用户详细信息

radosgw-admin user info --uid=<username>

例如:

radosgw-admin user info --uid=myuser

列出用户的存储桶

radosgw-admin bucket list --uid=<username>

例如:

radosgw-admin bucket list --uid=myuser

查看存储桶中的对象

radosgw-admin bucket stats --bucket=<bucket-name>

例如:

radosgw-admin bucket stats --bucket=my-bucket

通过 Ceph 文件系统(CephFS)查看

如果对象存储的数据存储在 CephFS 中,可以通过挂载 CephFS 查看文件。

挂载 CephFS

mount -t ceph <monitor-ip>:6789:/ /mnt/cephfs -o name=admin,secret=<key>

查看文件

挂载后,可以通过文件系统查看存储的内容:

ls /mnt/cephfs

注意事项

  • 权限问题:确保你使用的用户有足够的权限查看存储池或存储桶。
  • 数据一致性:直接使用 rados 工具查看对象时,可能会看到底层存储的碎片化数据,建议优先使用 radosgw-admin 或 S3 客户端。
  • 性能影响:在大型集群中,直接列出所有对象可能会影响性能,建议结合过滤条件使用。

通过以上方法,你可以方便地查看 Ceph 集群中存储的内容

posted @ 2025-03-07 10:51  厚礼蝎  阅读(198)  评论(0)    收藏  举报