Cephadm部署使用rgw对象网关(s3cmd和Java)

本文介绍CephRGW部署,s3cmd配置,以及如何使用Java进行对象存储操作,包括创建用户、配置工具和基本API示例。

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

前提

RGW的部署基于以下集群,集群信息如下:

image-20231209201827764

重要概念

区域(zone): 一个ceph集群可以包含多个区域,一个区域只属于一个集群,一个区域可以有多个RGW

区域组(zonegroup):由一个或多个区域组成,包含一个主区域(master zone),其他区域称为Secondary Zone,区域组内的所有区域之间同步数据

域(realm): 同一个或多个区域组组成,包含一个主区域组,其他都次区域组。域中的所有rados网关都从位于主区域组和主区域中的rados网关拉取配置

注意:master zone group中的master zone处理所元数据更新,因此创建用户、bucket等操作都必须经由master zone

多区域网关配置架构

  • single-zone:一个realm中只有一个zonegroup和一个zone,可以有多个RGW

  • multi-zone:一个relam中只有一个zonegroup,但是有多个zone。一个realm中存储的数据复制到该zonegroup中的所有zone中

  • multi-zonegroup:一个realm中有多个zonegroup,每个zonegroup中又有一个或多个zone

  • multi-realms:多个realm

部署rgw

ceph orch apply rgw myrealm myzone --placement="3 node01 node02 node03"

查看你的Ceph版本,不同版本的命令可能不太一样,以Ceph官方文档上的为准。我这里是ceph 15.2.7

image-20231209212227308

使用对象存储(s3cmd)

创建radosgw user

radosgw-admin user create --uid=s3 --display-name="object_storage" --system

image-20231209212418579

# 记住你的access_key和secret_key
"access_key": "9N1QNJ1SMB5G6FPNFCPQ",
"secret_key": "E6Q8FBz5x7W6Hz9AfvWcUOesgHGKVfohvKISCcYE"

安装s3cmd

apt install s3cmd
# 验证s3cmd
root@node01:~# whereis s3cmd
s3cmd: /usr/bin/s3cmd /usr/share/man/man1/s3cmd.1.gz

或者在GitHub下载,下载地址:https://github.com/s3tools/s3cmd

配置s3cmd

root@node01:~# s3cmd --configure

Enter new values or accept defaults in brackets with Enter.
Refer to user manual for detailed description of all options.

Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables.
Access Key [9N1QNJ1SMB5G6FPNFCPQ]: 
Secret Key [E6Q8FBz5x7W6Hz9AfvWcUOesgHGKVfohvKISCcYE]: 
Default Region [US]: 

Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3.
S3 Endpoint [192.168.64.128:80]: 

Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used
if the target S3 system supports dns based buckets.
DNS-style bucket+hostname:port template for accessing a bucket [192.168.64.128:80/%(bucket)s]: 

Encryption password is used to protect your files from reading
by unauthorized persons while in transfer to S3
Encryption password: 
Path to GPG program [/usr/bin/gpg]: 

When using secure HTTPS protocol all communication with Amazon S3
servers is protected from 3rd party eavesdropping. This method is
slower than plain HTTP, and can only be proxied with Python 2.7 or newer
Use HTTPS protocol [No]: no

On some networks all internet access must go through a HTTP proxy.
Try setting it here if you can't connect to S3 directly
HTTP Proxy server name: 

New settings:
  Access Key: 9N1QNJ1SMB5G6FPNFCPQ
  Secret Key: E6Q8FBz5x7W6Hz9AfvWcUOesgHGKVfohvKISCcYE
  Default Region: US
  S3 Endpoint: 192.168.64.128:80
  DNS-style bucket+hostname:port template for accessing a bucket: 192.168.64.128:80/%(bucket)s
  Encryption password: 
  Path to GPG program: /usr/bin/gpg
  Use HTTPS protocol: False
  HTTP Proxy server name: 
  HTTP Proxy server port: 0

Test access with supplied credentials? [Y/n] 
Please wait, attempting to list all buckets...
Success. Your access key and secret key worked fine :-)

Now verifying that encryption works...
Not configured. Never mind.

Save settings? [y/N] y
  • Access Key:刚才创建的radosgw user的access_key
  • Secret Key:刚才创建的radosgw user的secret_key
  • Default Region:默认直接回车
  • S3 Endpoint:IP地址:port,例如“192.168.64.128:80”
  • DNS-style bucket+hostname:“bootstrap_host_ip:80/%(bucket)s”,如"192.168.64.128:80/%(bucket)s"
  • Encryption password:默认直接回车
  • Path to GPG program [/usr/bin/gpg]:默认直接回车
  • Use HTTPS protocol [No]: no
  • HTTP Proxy server name: 默认直接回车
  • Test access with supplied credentials? [Y/n] 默认直接回车
  • 最后保存设置,会生成/root/.s3cfg文件

s3cmd使用

通过s3cmd --help查看具体使用方法;

s3cmd ls # 列举所有 Buckets
s3cmd mb s3://my-bucket-name # 创建bucket,且bucket名称是唯一的,不能重复。
s3cmd rb s3://my-bucket-name # 删除空bucket
s3cmd ls s3://my-bucket-name # 列举Bucket中的内容
s3cmd put file.txt s3://my-bucket-name/file.txt # 上传file.txt到某个bucket
s3cmd put --acl-public file.txt s3://my-bucket-name/file.txt # 上传并将权限设置为所有人可读
s3cmd put ./* s3://my-bucket-name/ # 批量上传文件
s3cmd get s3://my-bucket-name/file.txt file.txt # 下载文件
s3cmd get s3://my-bucket-name/* ./ # 批量下载
s3cmd del s3://my-bucket-name/file.txt # 删除文件
s3cmd du -H s3://my-bucket-name # 来获得对应的bucket所占用的空间大小
s3cmd setacl s3://myexamplebucket.calvium.com/ --acl-public --recursive # 设置S3 bucket的Public权限

上传文件前集群对象数量:

image-20231210193145423

新建bucket,上传文件测试:

image-20231210200332640

使用对象存储(Java代码)

引入依赖

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk</artifactId>
    <version>1.12.429</version>
</dependency>

编码测试

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;

public class S3Demo {
    static AmazonS3 s3;

    private static void init() {
        AWSCredentials credentials = new BasicAWSCredentials("access_key",
                "access_secret");
        // 禁用s3 https


        ClientConfiguration configuration = new ClientConfiguration();
        configuration.setUseExpectContinue(false);
        configuration.setProtocol(Protocol.HTTP);

        String endPoint = "ip:port";
        AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(
                endPoint, null);

        s3 = AmazonS3ClientBuilder.standard().withEndpointConfiguration(endpointConfiguration)
                .withClientConfiguration(configuration).withCredentials(new AWSStaticCredentialsProvider(credentials))
                //.withChunkedEncodingDisabled(true)
                .withPathStyleAccessEnabled(true).build();
    }

    public static void deleteObject(String bucket, String object) {
        try {
            s3.deleteObject(bucket, object);
        } catch (AmazonServiceException e) {
            System.out.println("status code:" + e.getStatusCode());
        } catch (AmazonClientException e2) {
            System.out.println("status code:" + e2.getMessage());
        }
    }

    public static void putObject(String bucket, String object) {
        try {
            PutObjectRequest request = new PutObjectRequest(bucket, object,
                    new File("C:\\Users\\gengduc\\Pictures\\壁纸\\c9f5cfbd-eb85-308c-b930-894548c0daa7_wallpaper_large.jpg"));
            s3.putObject(request);
        } catch (AmazonServiceException e) {
            System.out.println("status code:" + e.getStatusCode());
        } catch (AmazonClientException e2) {
            System.out.println("status code:" + e2.getMessage());
        }
    }

    public static void getObject(String bucket, String object) {
        try {
            GetObjectRequest request = new GetObjectRequest(bucket, object, null);
            System.out.println(object);
            S3Object result = s3.getObject(request);

            S3ObjectInputStream s3is = result.getObjectContent();
            FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\gengduc\\Pictures\\" + object));
            byte[] read_buf = new byte[1024 * 34];
            int read_len = 0;
            while ((read_len = s3is.read(read_buf)) > 0) {
                fos.write(read_buf, 0, read_len);
            }
            s3is.close();
            fos.close();
        } catch (AmazonServiceException e) {
            System.err.println(e.getErrorMessage());
        } catch (IOException e) {
            System.err.println(e.getMessage());
        }
    }

    public static void listObjects(String bucket) {
        try {
            ListObjectsV2Request request = new ListObjectsV2Request();
            request.setBucketName(bucket);
            ListObjectsV2Result result = s3.listObjectsV2(request);

            List<String> commonPrefix = result.getCommonPrefixes();
            for (int i = 0; i < commonPrefix.size(); i++) {
                System.out.println("commonPrefix:" + commonPrefix.get(i));
            }
            List<S3ObjectSummary> objectList = result.getObjectSummaries();
            for (int i = 0; i < objectList.size(); i++) {
                System.out.println("key:" + objectList.get(i).getKey());
            }
        } catch (AmazonServiceException e) {
            System.out.println("status code:" + e.getStatusCode());
        } catch (AmazonClientException e2) {
            System.out.println("status code:" + e2.getMessage());
        }
    }

    public static void putBucket(String bucket) {
        try {
            s3.createBucket(bucket);
        } catch (AmazonServiceException e) {
            System.err.println(e.getStatusCode());
            System.err.println(e.getErrorCode());
            System.err.println(e.getErrorMessage());
        }
    }

    //运行主函数
    public static void main(String[] args) throws Exception {
        String bucketName = "bucket-demo";
        String keyName = "example.png";
        //初始化连接
        init();
        //创建桶
        putBucket(bucketName);
        //添加对象
        putObject(bucketName, keyName);
        //获取对象
        getObject(bucketName, keyName);
        //删除对象
        deleteObject(bucketName, keyName);
        //枚举对象列表
        listObjects(bucketName);
    }
}

代码中有三个地方需要修改:

  • access_key:改为上面用户的access_key
  • secret_key:改为上面用户的secret_key
  • endpoint:修改为s3cmd --configure中设置的IP:port

使用HTTP:configuration.setProtocol(Protocol.HTTP);

参考

<think>好的,用户想了解如何使用cephadm配置RGW,也就是Ceph对象存储网关Rados Gateway。我需要先回顾一下Cephadm的基本操作RGW的配置步骤,确保信息准确。 首先,用户可能已经安装了Ceph集群,并且使用cephadm工具管理。假设用户已经熟悉cephadm的基础命令,比如ceph orch apply。接下来,配置RGW需要几个步骤:生成密钥、创建RGW服务实例、配置领域区域组等。 需要注意,CephRGW在较新版本中可能需要使用多站点配置,但如果是单集群,可能只需要基本配置。可能需要提醒用户关于领域(realm)、区域组(zonegroup)区域(zone)的概念,不过如果只是单集群,默认配置可能足够。 然后,生成RGW的密钥环,这一步可能需要使用ceph auth get-or-create命令。然后通过ceph orch apply rgw命令部署服务。这里要指定服务名称、领域区域,可能还需要指定SSL证书,如果用户需要HTTPS的话。 另外,端口配置也很重要,默认是8080,但用户可能需要修改,或者配置负载均衡器。还要考虑DNS名称,是否需要设置域名解析。 可能的常见问题包括服务无法启动、端口冲突、权限问题等,需要提醒用户检查日志,使用ceph logs命令查看服务日志。 最后,测试部分,用户可能需要使用s3cmd或AWS CLI测试连接,创建bucket等操作。需要确保RGW服务正常运行,并且网络可达。 可能需要分步骤说明,确保用户能一步步操作。同时,注意命令的正确性,比如正确使用ceph orch apply的参数,以及密钥文件的路径是否正确。 是否需要提到多站点配置?如果用户只是单集群,可能不需要,但可以简要提及,避免混淆。另外,SSL配置可能需要额外步骤,比如获取证书,可能需要用户自行准备或者使用自签名证书。 还要注意用户的集群状态,是否已经初始化,ceph -s状态是否正常。如果用户遇到问题,建议检查ceph状态日志。 总结步骤大致如下: 1. 创建RGW领域、区域组区域(如果是多站点) 2. 生成RGW用户的密钥 3. 使用ceph orch apply部署RGW服务 4. 配置DNS防火墙 5. 验证RGW服务是否正常运行 6. 测试访问 需要确认这些步骤是否符合最新cephadm的流程,是否有变化。比如,可能现在更推荐使用服务规格YAML文件来部署服务,而不仅仅是命令行参数。需要检查文档,确认是否正确。 例如,使用服务规格文件可能更灵活,可以指定网络、端口、SSL等。因此可能需要指导用户编写YAML文件,然后应用它。或者,ceph orch apply是否支持直接参数配置。 另外,RGW的配置可能需要修改Ceph配置文件,但cephadm可能通过容器化的方式管理配置,所以可能需要通过ceph config set命令进行调整,或者在部署服务时传递参数。 可能需要提到如何自定义配置,比如修改rgw_frontends参数,指定端口协议。例如,配置为使用HTTPS,端口443,并指定证书路径。 还要注意用户权限,是否具有足够的权限执行这些命令,可能需要使用sudo或cephadm shell。 最后,确保用户了解后续步骤,如创建S3用户,配置客户端访问等。可能还需要提示用户查看官方文档或相关指南以获取最新信息。</think>以下是使用cephadm配置RGW(RADOS Gateway)的分步指南: --- ### **1. 准备Ceph集群** 确保已部署Ceph集群且状态健康: ```bash ceph -s # 检查集群状态 ``` --- ### **2. 创建RGW领域(Realm)区域(Zone)** > *若为单集群部署,可跳过多站点配置,使用默认设置。* ```bash # 创建新realm radosgw-admin realm create --rgw-realm=myrealm --default # 创建zonegroup radosgw-admin zonegroup create --rgw-zonegroup=myzg --master --default # 创建zone radosgw-admin zone create --rgw-zonegroup=myzg --rgw-zone=myzone --master --default ``` --- ### **3. 生成RGW服务密钥** ```bash # 生成密钥环 ceph auth get-or-create client.rgw.myzone osd &#39;allow rwx&#39; mon &#39;allow rw&#39; -o /etc/ceph/ceph.client.rgw.myzone.keyring ``` --- ### **4. 部署RGW服务** 使用`ceph orch`命令部署: ```bash ceph orch apply rgw myrgw --realm=myrealm --zone=myzone \ --placement="<hostname>" # 替换为实际主机名,或指定标签 ``` --- ### **5. 配置网络与端口** - **默认端口**:RGW默认使用`8080`(HTTP)或`7480`(HTTPS)。 - **自定义端口**(可选): ```bash ceph config set client.rgw.myzone rgw_frontends "beast port=80" ``` --- ### **6. 配置SSL(可选)** 若需HTTPS: ```bash ceph orch apply rgw myrgw --realm=myrealm --zone=myzone \ --ssl-cert=</path/to/cert.pem> \ --ssl-key=</path/to/key.pem> ``` --- ### **7. 验证服务** - **检查服务状态**: ```bash ceph orch ls --service-name=rgw.myrgw ``` - **查看日志**: ```bash ceph logs rgw.myrgw ``` --- ### **8. 创建S3用户** 生成访问密钥: ```bash radosgw-admin user create --uid="s3user" --display-name="S3 Test User" --access-key=ACCESS_KEY --secret-key=SECRET_KEY ``` --- ### **9. 测试访问** 使用`s3cmd`或`AWS CLI`测试: ```bash s3cmd --access_key=ACCESS_KEY --secret_key=SECRET_KEY \ --host=<RGW_HOST_IP> --host-bucket="%(bucket)s.<RGW_HOST_IP>" ls ``` --- ### **常见问题** 1. **服务未启动** - 检查防火墙是否开放端口(如8080)。 - 查看日志:`ceph logs rgw.myrgw` 2. **DNS解析问题** - 在客户端配置`/etc/hosts`或DNS服务器,确保RGW域名可解析。 --- ### **后续配置** - **多站点部署**:需配置多个zonegroupzone,并同步元数据。 - **负载均衡**:结合HAProxy或Nginx实现高可用。 - **配额管理**:通过`radosgw-admin`设置用户或bucket配额。 --- 通过以上步骤,您已完成RGW的基础部署。如需高级功能(如生命周期策略、日志记录等),请参考[Ceph官方文档](https://docs.ceph.com/)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值