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

文章目录

  • 前提
  • 重要概念
  • 部署rgw
  • 使用对象存储(s3cmd)
    • 创建radosgw user
    • 安装s3cmd
    • 配置s3cmd
    • s3cmd使用
  • 使用对象存储(Java代码)
    • 引入依赖
    • 编码测试
  • 参考

前提

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 --configureEnter 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]: noOn 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: 9N1QNJ1SMB5G6FPNFCPQSecret Key: E6Q8FBz5x7W6Hz9AfvWcUOesgHGKVfohvKISCcYEDefault Region: USS3 Endpoint: 192.168.64.128:80DNS-style bucket+hostname:port template for accessing a bucket: 192.168.64.128:80/%(bucket)sEncryption password: Path to GPG program: /usr/bin/gpgUse HTTPS protocol: FalseHTTP Proxy server name: HTTP Proxy server port: 0Test 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 httpsClientConfiguration 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);

参考

  • https://scs.buaa.edu.cn/doc/ns-labs/table-of-contents/ceph/#ceph-rgw-%E5%AF%B9%E8%B1%A1%E5%AD%98%E5%82%A8
  • https://www.cnblogs.com/sunhongleibibi/p/11661123.html
  • https://developer.aliyun.com/article/794642
  • https://www.jianshu.com/p/41095ae4a5f5
  • https://www.cnblogs.com/zyxnhr/p/10599990.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/214490.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页设计中增强现实的兴起

目录 了解增强现实 增强现实的历史背景 AR 和网页设计的交叉点 AR 在网页设计中的优势 增强参与度和互动性 个性化的用户体验 竞争优势和品牌差异化 AR 在网页设计中的用例 结论 近年来&#xff0c;增强现实已成为一股变革力量&#xff0c;重塑了我们与数字领域互动的方式。它被…

科研绘图配色方案

科研绘图配色方案 在撰写论文的时候&#xff0c;美观&#xff0c;大气&#xff0c;上档次的图表能够很好地给自己的论文加分。但是在绘制图表的时候往往会面临色彩搭配的问题&#xff0c;选择合适的色彩搭配能够有效地展示自己的方法&#xff0c;但是色彩搭配选择不当的话往往会…

coding创建远程分支。并拉取远程新分支+推送代码

进入coding ----项目----代码仓库---点击 下拉之后查看全部----创建分支 创建分支之后执行下面命令 git branch -a // 查看所有分支 这个时候发现自己创建的分支没有显示这是因为自己在远程创建了分支但是本地还没有分支 执行 git fetch命令 用于从远程仓库获取最新的提交…

《深入理解计算机系统》学习笔记 - 第四课 - 浮点数

Floating Point 浮点数 文章目录 Floating Point 浮点数分数二进制示例能代表的数浮点数的表示方式浮点数编码规格化值规格化值编码示例 非规格化的值特殊值 示例IEEE 编码的一些特殊属性四舍五入&#xff0c;相加&#xff0c;相乘四舍五入四舍五入的模式二进制数的四舍五入 浮…

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 目录 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-A 需要环境或者解析可以私信 &#xff08;二&#xff09;A 模块基础设施设置/安全加固&#xff08;200 分&…

golang学习笔记——sync.Pool

文章目录 sync.Pool示例sync.Pool数据结构TCP连接池总结参考资料 sync.Pool示例 代码 sync.Pool对外提供的New、Get和Put方法。 var buffers sync.Pool{New: func() interface{} { return new(bytes.Buffer)}, }func GetBuffer() *bytes.Buffer {return buffers.Get().(*byt…

怎么查看mysql Connector/J实现的JDBC规范的版本号

打开mysql-connector-j的jar包&#xff0c;例如mysql-connector-j-8.2.0.jar&#xff0c;在Jar包的META-INF目录下面有个MANIFEST.MF文件&#xff0c;打开该文件&#xff1a; 文件内容中Specification-Version: 4.2这一项&#xff0c;就代表实现的JDBC规范的版本号&#xff0c…

忘记PDF密码了,怎么办?

PDF文件有两种密码&#xff0c;一个打开密码、一个限制编辑密码&#xff0c;因为PDF文件设置了密码&#xff0c;那么打开、编辑PDF文件就会受到限制。忘记了PDF密码该如何解密&#xff1f; PDF和office一样&#xff0c;可以对文件进行加密&#xff0c;但是没有提供恢复密码的功…

Leetcode刷题笔记题解(C++):25. K 个一组翻转链表

思路&#xff1a;利用栈的特性&#xff0c;K个节点压入栈中依次弹出组成新的链表&#xff0c;不够K个节点则保持不变 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …

上位机与PLC:ModbusTCP通讯之数据类型转换

前请提要: 从PLC读取的数值,不管是读正负整数还是正负浮点数,读取过来后都会变成UInt16,也就是Ushort类型 一、ushort(UInt16)转成 Int32 源代码方法: //ushort类型转Int32类型的方法private int ushortToInt32(ushort[] date, int start){//先进行判断,长度是否正确…

[VSCode] Java开发环境配置

文章目录 1 VSCode & Java 安装1.1 安装 VSCode1.2 安装 JDK 2 环境变量配置3 在 VSCode 中安装 Java 扩展4 运行测试 1 VSCode & Java 安装 1.1 安装 VSCode Visual Studio Code 官方下载 地址&#xff1a; https://code.visualstudio.com/详细安装步骤这里不做赘…

全面高压化与全面超快充,破解新能源汽车的时代难题

是什么让新能源车主感到疲惫与焦虑&#xff1f;是什么阻挡更多消费者选择新能源汽车&#xff1f;我们在身边进行一个简单的调查就会发现&#xff0c;问题的答案非常一致&#xff1a;充电。 充电难&#xff0c;充电慢的难题&#xff0c;始终是困扰新能源汽车产业发展&#xff0c…

【Flutter】vs2022上开发flutter

在vs上开发flutter&#xff0c;结果扩展仓库上没办法找到Dart&#xff0c;Flutter。 在 这 搜索Dart时也无法找到插件。 最后发现是安装工具出错了 安装了 开发需要的是

CentOS7 部署PostgreSQL

参考文档&#xff1a;https://www.postgresql.org/download/linux/redhat/ 1. 配置yum源 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm2. 安装PostgreSQL13 yum install -y postgresql13-server3…

C++包管理利器CPM

C包管理利器CPM 一、介绍 CPM.cmake is a cross-platform CMake script that adds dependency management capabilities to CMake. It’s built as a thin wrapper around CMake’s FetchContent module that adds version control, caching, a simple API and more. CPM.cma…

minio的k8s的单机部署

minio的k8s的单机部署 apiVersion: apps/v1 kind: Deployment metadata:name: minionamespace: itshare spec:replicas: 1selector:matchLabels:app: miniotemplate:metadata:labels:app: miniospec:containers:- name: minioimage: minio/minio:RELEASE.2022-10-15T19-57-03Z…

MySQL - 表达式With as 语句的使用及练习

目录 8.1 WITH AS 的含义 8.2 WITH AS语法的基本结构如下&#xff1a; 8.3 练习题1 8.4 牛客练习题 8.1 WITH AS 的含义 WITH AS 语法是MySQL中的一种临时结果集&#xff0c;它可以在SELECT、INSERT、UPDATE或DELETE语句中使用。通过使用WITH AS语句&#xff0c;可以将一个查…

DAPP开发【10】express.js的使用

Express.js 是一种流行、轻量级的开源 Web 应用程序框架&#xff0c;用于开发基于 Node.js 的服务器端 Web 应用程序。它提供了强大的功能集&#xff0c;适用于 Web 和移动应用程序。Express.js 旨在支持单页、多页和混合式 Web 应用程序的开发。Express.js 提供了广泛的功能&a…

面试官:性能测试瓶颈调优你是真的会吗?

引言&#xff1a;性能瓶颈调优 在实际的性能测试中&#xff0c;会遇到各种各样的问题&#xff0c;比如 TPS 压不上去等&#xff0c;导致这种现象的原因有很多&#xff0c;测试人员应配合开发人员进行分析&#xff0c;尽快找出瓶颈所在。 理想的性能测试指标结果可能不是很高&…

DOS 批处理 (二)

DOS 批处理 1. 基础 DOS 命令1.1 基础命令1.2 文件系统操作1.3 文件夹管理1.4 文件管理1.5 网络相关1.6 系统管理1.7 IF、FOR和NETIFFORNET 1. 基础 DOS 命令 command /? 查找帮助DOS命令不区分命令字母的大小写 C:\Users\Administrator>echo 1 1 C:\Users\Administrator…