博客 > SequoiaS3 使用原理及实践

SequoiaS3 使用原理及实践

 2020-04-29  原理解析

一、概述

SequoiaS3 是基于巨杉数据库实现的一种对象存储服务,具备可扩展、数据高可用、安全、高性能等特性。SequoiaS3 兼容标准的 AWS S3 协议,用户可以直接通过 RESTFul 接口和 SDK 访问 SequoiaS3 对象存储服务。


二、整体架构

巨杉数据库安装完成后包含 SequoiaS3 服务部署介质。SequoiaS3 服务本身不会存储任何业务数据,用户可根据业务需求部署多个 SequoiaS3 服务,服务之间通过 F5/Nginx 实现服务的高可用和负载均衡,业务系统通过调用标准的 AWS S3 Java SDK 或者 RESTFul 接口访问 SequoiaS3 服务并操作对象数据。具体架构如图所示:


image.png

三、相关概念

  • 存储桶是 SequoiaS3 中用于存储对象的容器。每个对象都储存在一个存储桶中。例如,如果名为 photos/puppy.jpg 的对象存储在 sdbs3存储桶中,则可使相应的 SDK 或者 RESTFul 接口对该对象进行访问。存储桶是 SequoiaS3 中最高级别组织的命名空间,可用于多种用途:负责存储和数据传输,管理访问控制等。

  • 对象是 SequoiaS3 中存储的基本实体。对象由对象数据和元数据组成,存储在巨杉数据库中。数据部分为业务系统需要存储的数据;元数据是一组描述数据部分的名称-值对,其中包括一些默认元数据和标准 HTTP 元数据(如Content-Type),用户可以在存储对象时指定自定义元数据。在存储桶中,对象将由键和版本 ID 进行唯一地标识。

  • 是指存储桶中对象的唯一标识符。存储桶内的每个对象都只能有一个键。存储桶、键和版本 ID 的组合唯一标识各个对象。因此,可以将 SequoiaS3 看作“存储桶 + 键 + 版本”与对象本身之间的基本数据映射。

  • 区域是指在 SequoiaS3 中可以根据业务系统的需求按照某种规划进行数据存储,满足业务数据的隔离需求。


四、最佳实践

4.1 SequoiaS3环境部署

以本地虚拟机部署为例,虚拟机配置信息如下:

虚拟机数量:3台

CPU

1CORE

内存

1GB

磁盘

20GB

操作系统

RedHat 7.4

巨杉数据库采用3副本架构,本示例中的SequoiaS3服务选取任意一个节点进行部署,具体部署步骤如下:

1、 进入到SequoiaS3服务安装包目录:

cd /opt/sequoiadb/tools/sequoias3

2、 修改目录中的application.properties配置文件:

#巨杉数据库连接地址,本示例中3台服务器,配置为巨杉数据库的协调节点地址
sdbs3.sequoiadb.url=sequoiadb://192.168.137.46:11810,192.168.137.47:11810,192.168.137.48:11810
#巨杉数据库登录用户名和密码,使用“:”分开
sdbs3.sequoiadb.auth=user:password
#SequoiaS3对象存储中元数据存储数据域
sdbs3.sequoiadb.meta.domain=metaDomain
#SequoiaS3对象存储中对象存储数据域,测试环境中元数据和对象数据域可以为同一个
sdbs3.sequoiadb.data.domain=dataDomain

其他参数配置可参考官方用户手册《S3引擎》中《SequoiaS3安装与配置》章节。

3、 启动SequoiaS3服务

./sequoias3.sh start

注:SequoiaS3服务在启动后,会生成默认管理员用户,具体账号和密码可以参考SequoiaDB安装目录/opt/sequoiadb/tools/sequoias3中README.txt文件。


4.2 应用示例

本次示例通过使用Java SDK和调用RESTFul接口进行演示,其中RESTFul接口使用Linux中的curl命令进行演示。

4.2.1 初始化客户端

初始化客户端时需要使用SequoiaS3服务初始化生成的默认管理员用户,对应RESTFul接口直接在curl参数中增加相应的参数值即可。初始化客户端Java代码如下:

AWSCredentials credentials = new BasicAWSCredentials("ABCDEFGHIJKLMNOPQRST","abcdefghijklmnopqrstuvwxyz0123456789ABCD");
AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(endPoint, null);
s3Client = AmazonS3ClientBuilder.standard().withEndpointConfiguration(endpointConfiguration).withCredentials(new AWSStaticCredentialsProvider(credentials)).build();

4.2.2 桶相关操作

1. 桶创建

Java语言代码如下:

s3Client.createBucket("sdbbucket");

Linux curl命令如下:

curl -v -X PUT "http://localhost:8002/sdbbucket" -H "Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"

2. 桶删除

Java语言代码如下:

s3Client.deleteBucket("sdbbucket");

Linux curl命令如下:

curl -v -X DELETE "http://localhost:8002/sdbbucket" -H "Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"

3. 查看桶

Java语言代码如下:

ObjectListing objectListing = s3Client.listObjects("novelbucket");
List<S3ObjectSummary> objectList =  objectListing.getObjectSummaries();
for (int i = 0; i < objectList.size(); i++){
    System.out.println("key " +i + ": "+objectList.get(i).getKey());
}

Linux curl命令如下:

curl -v -X GET "http://localhost:8002" -H "Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"

4.2.3对象相关操作

1、对象上传

Java语言代码如下:

File file = new File("/home/sdbadmin/sequoiadb.txt");
InputStream inputStream = new FileInputStream(file);
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(file.length());
objectMetadata.setContentEncoding("utf8");
objectMetadata.setContentType("text/plain");
s3Client.putObject("sdbbucket","sequoiadb.txt",inputStream,objectMetadata);

Linux curl命令如下:

curl -X PUT -T "/home/sdbadmin/sequoiadb.txt" "http://localhost:8002/sdbbucket/sequoiadb.txt" -H "
Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"-H "
Content-Length:15999,Content-Encoding:utf8,Content-Type: text/plain"

 2、对象下载

Java语言代码如下:

GetObjectRequest request = new GetObjectRequest("sdbbucket", "sequoiadb.txt", null);
S3Object result = s3Client.getS3Client().getObject(request);
S3ObjectInputStream s3is = result.getObjectContent();
File file = new File("/home/sdbadmin/sequoiadb_bak.txt");
System.out.println("file path:" + file.getAbsolutePath());
FileOutputStream fos = new FileOutputStream(file);
byte[] read_buf = new byte[1024 * 1024];
int read_len;
while ((read_len = s3is.read(read_buf)) > 0) {
    fos.write(read_buf, 0, read_len);
}
s3is.close();
fos.close();

Linux curl命令如下:

curl -o sequoiadb_bak.tx -X GET "http://localhost:8002/sdbbucket/sequoiadb.txt" -H "Host: localhost:8002" -H "
Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"  -H "Content-Type: text/plain"

 

3、对象删除

Java语言代码如下:

s3Client.deleteObject("sdbbucket", "sequoiadb.txt");

Linux curl命令如下:

curl -X DELETE "http://localhost:8002/sdbbucket/sequoiadb.txt" -H "Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"

五、总结

巨杉数据库通过SequoiaS3提供对象存储服务,用户可以通过AWS S3 的 Rest 接口或者Java SDK访问 SequoiaS3 实例,从而实现文件的上传、下载和删除等操作。



准备开始体验 SequoiaDB 巨杉数据库?