CEPH RGW集群和bucket的zone group 不一致导致的404异常解决 及 使用radosgw-admin metadata 命令设置bucket metadata 的方法...

本文介绍了一种在Ceph Rados Gateway (RGW)中由于bucket的ZoneGroup配置不一致导致的对象访问404错误的现象及解决方案。通过调整bucket的ZoneGroup配置使其与集群保持一致,可以有效解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

问题现象: 最近在研究zonegroup的配置操作,发现在配置zonegroup后修改了default zone,导致访问对象报404错误。

问题原因:

rgw 日志 报异常’request for data in a different zonegroup ’

 

rgw源码:

https://github.com/ceph/ceph/blob/d346b1b83597644b4ce58bae4bc14629f69ef667/src/rgw/rgw_op.cc

 

结论: bucket的zonegroup字段和集群新的id不一致。

 

 

解决方案: 使集群和bucket的zone group 一致。

1.  旧的zonegroup还存在的情况下,设置default zone group 为旧的 default。 

2.  的zonegroup 删除的情况, 设置 dubbucket的zonegroup字段为新的zonegroup id。 可以使用如下工具批量设置bucket metadata ;注意要重启rgw 服务进程

主要配置命令:

radosgw-admin metadata get bucket:qtest3
radosgw-admin metadata get bucket.instance:qtest3:3d240698-79c4-4af0-abab-6b83b340a538.33547209.1 > conf.json
radosgw-admin metadata put bucket.instance:qtest3:3d240698-79c4-4af0-abab-6b83b340a538.33547209.1 < conf.json

 

 

cat set_bucket_meta.py 
#!/usr/bin/env python

import rados
import os
import json
import copy
import subprocess
import sys

ceph_rgw_pool = ".rgw"

def change_bucket_zonegroup(bucket, zgp):
        print("radosgw-admin metadata get bucket:" + bucket)
    me = os.popen("radosgw-admin metadata get bucket:" + bucket)
    meta = json.loads(me.read())
    id = meta['data']['bucket']['bucket_id']
        print("radosgw-admin metadata get bucket.instance:" + bucket + ":" + id)
    mei = os.popen("radosgw-admin metadata get bucket.instance:" + bucket + ":" + id)
    imeta = json.loads(mei.read())
    newmeta = copy.copy(imeta)
    newmeta['data']['bucket_info']['zonegroup'] = zgp
    stdin = json.dumps(newmeta)
        print("radosgw-admin metadata put bucket.instance:" + bucket + ":" + id)
    process = subprocess.Popen(['radosgw-admin', 'metadata', 'put', "bucket.instance:" + bucket + ":" + id], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    process.stdin.write(stdin)
    process.stdin.close()
    process.wait()

def get_all_buckets():
    me = os.popen("radosgw-admin bucket list");
        return json.loads(me.read())
if __name__ == '__main__':
    if sys.argv[1] == 'all':
        for bk in get_all_buckets():
                        #print(bk)
            change_bucket_zonegroup(bk, sys.argv[2])
        #change_bucket_zonegroup('ivanwa','9affcd3e-c66c-48e4-b961-3a43a289268f')
    else:
        change_bucket_zonegroup(sys.argv[1],sys.argv[2])

#设置所有 bucket zone_group id
sudo python set_bucket_meta.py  all 833a4781-0da0-4810-8f0c-4e6e00b15a1e

#设置名为test 的bucket zone_group id
sudo python set_bucket_meta.py  test 833a4781-0da0-4810-8f0c-4e6e00b15a1e

 参考:https://blog.widodh.nl/2013/11/changing-the-region-of-a-rgw-bucket/

转载于:https://www.cnblogs.com/bodhitree/p/6702615.html

### Java 连接 Ceph 并进行操作 为了通过 Java 操作 Ceph,通常会采用基于 RESTful API 或者特定 SDK 的方式。对于 Ceph 来说,Rados Gateway (RGW) 提供了一个兼容 Amazon S3 Swift 的接口,这意味着可以利用任何支持这些协议的语言库来进行交互[^1]。 下面是一个简单的例子展示如何使用 AWS SDK for Java 访问由 RadosGW 提供的服务: #### 添加依赖项 如果项目构建工具是 Maven,则可以在 `pom.xml` 文件中加入如下依赖声明: ```xml <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>2.20.0</version><!-- 版本号需根据实际情况调整 --> </dependency> ``` #### 初始化客户端实例 创建一个用于与 Ceph RGW 通信的 S3 客户端对象: ```java import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.s3.S3Client; public class CephS3Example { private static final String ENDPOINT_URL = "http://your-ceph-radosgw-endpoint"; private static final String ACCESS_KEY_ID = "your-access-key-id"; private static final String SECRET_ACCESS_KEY = "your-secret-access-key"; public static void main(String[] args){ AwsBasicCredentials awsCreds = AwsBasicCredentials.create(ACCESS_KEY_ID,SECRET_ACCESS_KEY); Region region = Region.of("us-east-1"); // 可能需要实际区域名 S3Client s3 = S3Client.builder() .region(region) .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) .endpointOverride(new URI(ENDPOINT_URL))// 设置自定义终结点URL指向CEPH集群地址 .build(); System.out.println(s3.serviceMetadata().serviceId()); } } ``` 这段代码展示了怎样设置必要的认证信息,并建立到 Ceph 集群的连接。需要注意的是,在生产环境中应当妥善管理凭证的安全性。 #### 执行基本操作 一旦成功建立了 S3 客户端实例之后就可以调用各种方法来实现上传下载等功能了。比如要列举某个 bucket 下面所有的 object keys: ```java s3.listObjectsV2(req -> req.bucket("example-bucket")) .contents() .forEach(obj -> System.out.printf("%s: %d bytes\n", obj.key(),obj.size())); ``` 上述示例说明了如何通过 Java 编程语言访问部署有 RADOS GW 组件的 Ceph 存储系统,从而完成诸如列出存储桶内的对象列表之类的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值