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}")
注意事项
- 权限问题:确保 RGW 用户的权限足够执行上述操作。
- 网络连接:确保 Python 运行环境可以访问 Ceph RGW 的端点。
- 存储桶命名:存储桶名称必须全局唯一。
使用 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 集群中存储的内容
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/18757210

浙公网安备 33010602011771号