0%

SequoiaDB-S3对象存储部署与应用开发

配置 SequoiaDB 巨杉数据库存储引擎

在 SequoiaDB 巨杉数据库存储引擎中开启 RC 级别事务,并且配置为等锁模式,同时为 SequoiaS3 的存储创建专属的域。

1)通过 Linux 命令行进入 SequoiaDB Shell;

1
sdb

2)通过 javascript 语言连接协调节点,获取数据库连接;

1
var db = new Sdb("localhost", 11810);

3)开启 RC 级别事务,且配置为等锁模式;

1
db.updateConf( { transactionon: true, transisolation: 1, translockwait: true } );

4)创建存储元数据的集合空间所在的域;

1
db.createDomain("metaDomain", [ "group1", "group2", "group3" ], { AutoSplit: true} );

5)创建存储对象数据的集合空间所在的域;

1
db.createDomain("dataDomain", [ "group1", "group2", "group3" ], { AutoSplit: true} );

6)退出 SequoiaDB Shell;

1
quit;

配置 SequoiaS3 系统

为 SequoiaS3 系统设置监听端口、数据存储域、存储引擎的协调节点等启动的基础配置。

1)进入 SequoiaS3 包目录;

1
cd /opt/sequoiadb/tools/sequoias3

2)配置 SequoiaS3,配置对外监听端口;

1
echo 'server.port=8002' >> config/application.properties

3)配置 coord 节点的 IP 和端口,可以配置多组并使用逗号分隔

1
echo 'sdbs3.sequoiadb.url=sequoiadb://localhost:11810' >> config/application.properties

4)配置 SequoiaS3 的存储创建了专属的域

1
2
echo 'sdbs3.sequoiadb.meta.domain=metaDomain' >> config/application.properties
echo 'sdbs3.sequoiadb.data.domain=dataDomain' >> config/application.properties

Note:

启动 SequoiaS3 系统

1)配置修改完成后,通过 ./sequoias3.sh 可执行脚本启动 SequoiaS3;

1
/opt/sequoiadb/tools/sequoias3/sequoias3.sh start

2)进入 SequoiaDB Shell,查看 SequoiaS3 元数据表,SequoiaS3 实例在启动的时候如果这些元数据表不存在会自动创建;

1
sdb

3)使用javascript语法连接协调节点,获取 db 数据库连接;

1
var db = new Sdb("localhost", 11810);

4)查看集合列表;

1
db.list(SDB_SNAP_COLLECTIONS);

操作截图: 图片描述

5)退出 SequoiaDB Shell;

1
quit;

Note:

系统启动时需确保数据库已经正常运行,系统启动后会创建默认管理员用户,您可以使用该默认管理员用户创建新的用户,然后使用新用户角色进行桶操作,对象操作。

  • 默认管理员账户名:administrator
  • 默认管理员AccessKeyID:ABCDEFGHIJKLMNOPQRST
  • 默认管理员用户SecreatKeyID:abcdefghijklmnopqrstuvwxyz0123456789ABCD

用户接口相关操作

在本例中将使用 curl restful 方式来测试 SequoiaS3 用户接口,主要包括用户创建、密钥获取、用户删除等相关操作。后续操作需要启动 SequoiaS3 进程,如有关闭需要打开。

创建用户

使用 curl 创建用户 s3user(其中 ABCDEFGHIJKLMNOPQRST 为默认管理员 AccessKeyID ,为 abcdefghijklmnopqrstuvwxyz0123456789ABCD 默认管理员用户 SecreatKeyID ):

1
curl -v -X POST "http://localhost:8002/users/?Action=CreateUser&UserName=s3user&role=admin" -H "Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"

操作截图:

图片描述

获取用户的访问秘钥

使用 curl 获取 s3user 用户访问秘钥(需管理员用户权限):

1
curl -v -X POST "http://localhost:8002/users/?Action=GetAccessKey&UserName=s3user" -H "Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"

操作截图:

图片描述

删除用户

使用 curl 删除用户 s3user(需管理员用户权限):

1
curl -v -X POST "http://localhost:8002/users/?Action=DeleteUser&UserName=s3user" -H "Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"

操作截图:

图片描述

图片描述

桶增删查接口相关操作

在本例中将使用 curl restful 方式来测试 SequoiaS3 桶接口,主要包括桶创建、桶获取、桶删除等相关操作。

创建桶

使用 curl 创建桶 sdbbucket:

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

操作截图:

图片描述

获取桶信息

使用 curl 获取所有桶信息:

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

操作截图:

图片描述

删除桶

1)使用 curl 删除桶 sdbbucket;

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

操作截图:

图片描述

2)检查桶是否存在,确认结果中是否存在桶 sdbbucket;

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

操作截图:

图片描述

文件上传和下载相关操作

在本例中将使用 curl restful 方式来测试 SequoiaS3 文件对象接口,主要包括文件对象上传、下载、删除相关操作。
如果已经删除桶则需要重新创建,需要先确保 sdbbucket 桶已创好。
使用 curl 创建桶 sdbbucket :

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

文件对象上传

1)检查 /opt/sequoiadb/tools/sequoias3/ 目录下是否存在 sequoia-s3-3.4.jar 这个文件,后面向 sdbbucket 桶上传此文件;

1
ls /opt/sequoiadb/tools/sequoias3/sequoia-s3-3.4.jar

2)使用 curl 向 sdbbucket 中写入文件 “sequoia-s3-3.4.jar” ,在S3中的名称是 “sdbs3.jar”;

1
curl -X PUT -T "/opt/sequoiadb/tools/sequoias3/sequoia-s3-3.4.jar" "http://localhost:8002/sdbbucket/sdbs3.jar" -H "Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"  -H "Content-Type: text/plain"

3)进入 SequoiaDB Shell,查看对象是否上传成功;

1
sdb

4)使用javascript语法连接协调节点,获取 db 数据库连接;

1
var db = new Sdb("localhost", 11810);

5)在元数据集合中查找文件名,确定是否上传成功;

1
db.S3_SYS_Meta.S3_ObjectMeta.find( { "Key": "sdbs3.jar" } );

6)退出 SequoiaDB Shell;

1
quit;

Note:

  • 上传前去确保桶 sdbbucket 存在,如不存在,使用之前命令创建 sdbbucket 桶对象。
  • 第一次上传对象时,会创建 S3_ObjectData* 的集合,该集合用于保存对象文件。

文件对象下载

1)从桶 sdbbucket 中读取文件对象 “sdbs3.jar”,并存放到本地目录 sdbs3.jar 文件中;

1
curl -o sdbs3.jar -X GET "http://localhost:8002/sdbbucket/sdbs3.jar" -H "Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"  -H "Content-Type: text/plain"

操作截图:

图片描述

2)查看下载的文件 sdbs3.jar,观察该文件与 sequoia-s3-3.4.jar 大小是否一致;

1
ls -trl

操作截图:

图片描述

文件对象删除

1)从桶 sdbbucket 中删除文件对象 “sdbs3.jar”;

1
curl -X DELETE "http://localhost:8002/sdbbucket/sdbs3.jar" -H "Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"

2)进入 SequoiaDB Shell,查看对象是否删除成功;

使用 linux 命令进入 SequoiaDB Shell;

1
sdb

使用javascript语法连接协调节点,获取 db 数据库连接;

1
var db = new Sdb("localhost", 11810);

在元数据集合中查找文件名,如果返回值为空,则对象删除成功;

1
db.S3_SYS_Meta.S3_ObjectMeta.find( { "Key": "sdbs3.jar" } );

退出 SequoiaDB Shell;

1
quit;

创建 JAVA 工程项目

本小节介绍使用 Java S3 的使用样例,实现基本读写操作。

1)创建 JAVA 工程目录;

1
mkdir -p /home/sdbadmin/s3/lib

2)进入工程目录;

1
cd /home/sdbadmin/s3

3)拷贝 S3 接口需要的 jar 包;

1
cp /home/sdbadmin/package/s3/* ./lib

4)复制以下代码到实验环境终端执行,生成创建桶和上传文件的 Init.java 文件;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
cat > /home/sdbadmin/s3/Init.java << EOF
package com.sequoiadb.samples;

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.PutObjectRequest;
import java.io.File;
import java.io.IOException;

public class Init {

public static void main(String[] args) throws IOException {

//初始化客户端, 生成一个与SequoiaS3的连接, 此处需要修改endPoint的地址和端口, 使之指向SequoiaS3的地址和端口.
AWSCredentials credentials = new BasicAWSCredentials("ABCDEFGHIJKLMNOPQRST", "abcdefghijklmnopqrstuvwxyz0123456789ABCD");
String endPoint = "http://127.0.0.1:8002";
AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(endPoint, null);
AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(endpointConfiguration)
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.build();
//创建一个名为"javabucket"的桶
s3.createBucket("javabucket");
//从本地上传文件 sequoia-s3-3.4.jar 到"javabucket"的存储桶中,并命名为"objectname"
PutObjectRequest request = new PutObjectRequest("javabucket", "objectname", new File("/opt/sequoiadb/tools/sequoias3/sequoia-s3-3.4.jar"));
s3.putObject(request);
}
}

EOF

5)复制以下代码到实验环境终端执行,生成查询桶内对象列表和下载对象的 GetObject.java 文件;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
cat > /home/sdbadmin/s3/GetObject.java << EOF
package com.sequoiadb.samples;

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.GetObjectRequest;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;
import com.amazonaws.services.s3.model.ListObjectsV2Result;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

public class GetObject {

public static void main(String[] args) throws IOException {

AWSCredentials credentials = new BasicAWSCredentials("ABCDEFGHIJKLMNOPQRST", "abcdefghijklmnopqrstuvwxyz0123456789ABCD");
String endPoint = "http://127.0.0.1:8002";
AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(endPoint, null);
AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(endpointConfiguration)
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.build();
//查询名为"bucketname"的桶中所有对象名称
ListObjectsV2Result listObj = s3.listObjectsV2("javabucket");
System.out.println("ListObjectsV2Result: "+listObj);
//从"javabucket"获得"objectname"对象, 并将对象内容存储在本地文件中
GetObjectRequest request = new GetObjectRequest("javabucket", "objectname");
S3Object result = s3.getObject(request);
S3ObjectInputStream s3is = result.getObjectContent();
FileOutputStream fos = new FileOutputStream(new File("/home/sdbadmin/s3/java_test_s3.jar"));
byte[] read_buf = new byte[1024];
int read_len = 0;
while ((read_len = s3is.read(read_buf)) > 0) {
fos.write(read_buf, 0, read_len);
}
s3is.close();
fos.close();
}
}
EOF

6)复制以下代码到实验环境终端执行,生成删除对象和桶的 DeleteBucket.java 文件;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
cat > /home/sdbadmin/s3/DeleteBucket.java << EOF
package com.sequoiadb.samples;

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.PutObjectRequest;
import java.io.IOException;

public class DeleteBucket {

public static void main(String[] args) throws IOException {


AWSCredentials credentials = new BasicAWSCredentials("ABCDEFGHIJKLMNOPQRST", "abcdefghijklmnopqrstuvwxyz0123456789ABCD");
String endPoint = "http://127.0.0.1:8002";
AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(endPoint, null);
AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(endpointConfiguration)
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.build();
//删除"javabucket"桶中名为"objectname"的对象
s3.deleteObject("javabucket", "objectname");
//删除名为"javabucket"的存储桶
s3.deleteBucket("javabucket");
}
}

EOF

7)查询是否已经生成以上 JAVA 文件;

1
2
3
ls -trl /home/sdbadmin/s3/Init.java
ls -trl /home/sdbadmin/s3/GetObject.java
ls -trl /home/sdbadmin/s3/DeleteBucket.java

编译运行代码

上一小节已经创建了 JAVA 工程和代码并且拷贝了 JAVA 驱动,接下来我们对代码进行编译运行。

1)编译 Init.java 文件;

1
javac -cp .:./lib/* -d . Init.java

2)运行 Init 类代码,创建”javabucket”桶和上传文件;

1
java -cp .:./lib/* com.sequoiadb.samples.Init

3)编译 GetObject.java 文件;

1
javac -cp .:./lib/* -d . GetObject.java

4)运行 GetObject 类代码,查询桶内对象列表和获取对象;

1
java -cp .:./lib/* com.sequoiadb.samples.GetObject

5)查看对象是否下载成功;

1
ls -trl

操作截图:

图片描述

6)编译 DeleteBucket.java 文件;

1
javac -cp .:./lib/* -d . DeleteBucket.java

7)运行 DeleteBucket 类代码,查询桶内对象列表和获取对象;

1
java -cp .:./lib/* com.sequoiadb.samples.DeleteBucket

8)检查桶是否存在,确认结果中是否存在桶 javabucket;

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

操作截图:

图片描述

-------------本文结束感谢您的阅读-------------