SequoiaS3 是基于巨杉数据库实现的一种对象存储服务,具备可扩展、数据高可用、安全、高性能等特性。SequoiaS3 兼容标准的 AWS S3 协议,用户可以直接通过 RESTFul 接口和 SDK 访问 SequoiaS3 对象存储服务。
二、整体架构
巨杉数据库安装完成后包含 SequoiaS3 服务部署介质。SequoiaS3 服务本身不会存储任何业务数据,用户可根据业务需求部署多个 SequoiaS3 服务,服务之间通过 F5/Nginx 实现服务的高可用和负载均衡,业务系统通过调用标准的 AWS S3 Java SDK 或者 RESTFul 接口访问 SequoiaS3 服务并操作对象数据。具体架构如图所示:
三、相关概念
存储桶是 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 实例,从而实现文件的上传、下载和删除等操作。