暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

巨杉Tech | SequoiaS3 原理及最佳实践

巨杉数据库 2020-04-28
1553

概述

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

整体架构

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

SequoiaS3架构图

相关概念

  • 存储桶是 SequoiaS3 中用于存储对象的容器。每个对象都储存在一个存储桶中。例如,如果名为 photos/puppy.jpg 的对象存储在 sdbs3存储桶中,则可使相应的 SDK 或者 RESTFul 接口对该对象进行访问。
    存储桶是 SequoiaS3 中最高级别组织的命名空间,可用于多种用途:负责存储和数据传输,管理访问控制等。
  • 对象是 SequoiaS3 中存储的基本实体。对象由对象数据和元数据组成,存储在巨杉数据库中。数据部分为业务系统需要存储的数据;元数据是一组描述数据部分的名称-值对,其中包括一些默认元数据和标准 HTTP 元数据(如Content-Type),用户可以在存储对象时指定自定义元数据。在存储桶中,对象将由键和版本 ID 进行唯一地标识。
  • 是指存储桶中对象的唯一标识符。存储桶内的每个对象都只能有一个键。存储桶、键和版本 ID 的组合唯一标识各个对象。因此,可以将 SequoiaS3 看作“存储桶 + 键 + 版本”与对象本身之间的基本数据映射。
  • 区域是指在 SequoiaS3 中可以根据业务系统的需求按照某种规划进行数据存储,满足业务数据的隔离需求。

最佳实践

1. SequoiaS3 环境部署
以本地虚拟机部署为例,虚拟机配置信息如下:

虚拟机数量:3台

CPU

1CORE

内存

1GB

磁盘

20GB

操作系统

RedHat7.4

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

    cd opt/sequoiadb/tools/sequoias3
    • 修改目录中的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安装与配置 章节。
      • 启动SequoiaS3服务

        ./sequoias3.sh start

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

        2. 应用示例

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

        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();

          2.2 桶相关操作
          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.2.2 桶删除

              Java语言代码如下:
                s3Client.deleteBucket("sdbbucket");
                Linux curl命令如下:
                  curl -v -X DELETE "http://localhost:8002/sdbbucket" -H "Host: localhost:8002" -H "Authorization: AWS ABCDEFGHIJKLMNOPQRST:abcdefghijklmnopqrstuvwxyz0123456789ABCD"
                  2.2.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" 

                      2.3 对象相关操作
                      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.3.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"
                              2.3.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 实例,从而实现文件的上传、下载和删除等操作。

                                  往期技术干货

                                  巨杉内核笔记 | MVCC多版本控制原理

                                  巨杉内核笔记 | 分布式事务漫谈
                                  巨杉内核笔记 | 会话(Session)

                                  巨杉Tech | SequoiaDB高可用原理详解

                                  巨杉Tech | 分布式数据库负载管理WLM实践

                                  巨杉Tech | 巨杉数据库的HTAP场景实践

                                  巨杉Tech | SequoiaDB SQL实例高可用负载均衡实践

                                  巨杉Tech | 并发性与锁机制解析与实践

                                  巨杉Tech | 几分钟实现巨杉数据库容器化部署

                                  巨杉Tech | “删库跑路”又出现,如何防范数据安全风险?

                                  巨杉Tech | 分布式数据库千亿级超大表优化实践

                                  社区分享 | SequoiaDB + JanusGraph 实践

                                  巨杉Tech | 巨杉数据库的并发 malloc 实现

                                  巨杉数据库v5.0 Beta版正式发布

                                  巨杉数据库无人值守智能自动化测试实践

                                  巨杉Tech | 读写分离机制与实践
                                  巨杉Tech | 巨杉数据库数据高性能数据导入迁移实践



                                  点击阅读原文,获取更多精彩内容
                                  最后修改时间:2020-04-29 08:31:32
                                  文章转载自巨杉数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                  评论