前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分布式对象存储Ambry(2)基本使用API与集群容错测试

分布式对象存储Ambry(2)基本使用API与集群容错测试

作者头像
干货满满张哈希
发布2021-04-12 15:17:12
4290
发布2021-04-12 15:17:12
举报
文章被收录于专栏:干货满满张哈希

在上一篇文章中,我们部署了如下一个ambry集群:

这里写图片描述
这里写图片描述

下面,我们来为这个集群做简单的测试:

基本Restful API

首先,简单介绍下Ambry的API:

1.GET /healthCheck 这个API用来检查集群状态是否完好。 我们访问(相当于直接GET):xx.xx.8.133/healthCheck,看到返回:

代码语言:javascript
复制
HTTP/1.1 200 OK
Content-Length: 4
GOOD

2.POST / 这个API用来传入需要存储的对象和元数据并保存在ambry中,ambry会返回保存信息。 在你的Request Header中,需要提供你要保存对象的元数据:

Request Header

Type

Required?

Description

x-ambry-blob-size

Long

Yes

你要保存对象的大小,这个一定要准确,否则会上传失败

x-ambry-service-id

String

Yes

你可以通过这个字段设定是哪个服务上传的对象

x-ambry-content-type

String

Yes

对象类型

x-ambry-ttl

Long

No

对象存活时间,默认是-1,即无限时间

x-ambry-private

Boolean

No

是否是私有对象,默认为false,即任何人可以访问

x-ambry-owner-id

String

No

通过这个属性指定对象的拥有者

x-ambry-um-

String

No

如果用户想自定义一些属性,需要以这个开头,可以指定任意个这个开头的属性

在成功后,返回response的header中,会包含一个Location的属性:

代码语言:javascript
复制
HTTP/1.1 201 Created
Date: Sun, 01 May 2016 05:35:21 GMT
Location: /AAEAAQAAAAAAAAAAAAAAJDk3NDI2MmQ1LTU0YzktNDk5OC1iM2Q5LTE1ZTQ5NDYwNjI0Mw
Content-Length: 0
x-ambry-creation-time: Sun, 01 May 2016 05:35:21 GMT

这个Location,就是Ambry为每个保存的对象生成的集群内全局唯一ID,之后,根据这个ID可以拿到这个对象或者这个对象的元数据。

3. GET /

GET / 举例:GET /AAEAAQAAAAAAAAAAAAAAJDk3NDI2MmQ1LTU0YzktNDk5OC1iM2Q5LTE1ZTQ5NDYwNjI0Mw 这个ambry-id就是之前返回的response中的Location属性

GET // 举例:GET /AAEAAQAAAAAAAAAAAAAAJDk3NDI2MmQ1LTU0YzktNDk5OC1iM2Q5LTE1ZTQ5NDYwNjI0Mw/x-ambry-blob-size 这个是取对象的一个属性。

4. HEAD / HEAD / 这个用于获取元数据

5. DELETE / DELETE / 这个用于删除某个ambry对象。

基本测试

接下来,我们通过Java-web写一个小程序,来测试下Ambry的功能: 首先,保存至ambry的接口实现方法:

代码语言:javascript
复制
public String uploadFile(MultipartFile file1, String ServiceId, String owner, String fileFormat,
            String description) {
        HttpURLConnection connection = null;
        OutputStream os = null;
        DataInputStream is = null;
        InputStream inputStream = null;
        int count = 0;
        //失败重试三次
        while (count <= 3) {
            try {
                File file = new File(StrUtils.makeString(tmpFilePath,"/",file1.getOriginalFilename()));
                file1.transferTo(file);
                if (!fileFormat.equals("image")) {
                    inputStream = new StreamGenerator(file, tmpFilePath).getInputStream();
                } else {
                    inputStream = new FileInputStream(file);
                }
                int length = inputStream.available();
                connection = (HttpURLConnection) new URL(ambryUrl).openConnection();
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Content-Type", "application/octet-stream");
                //设置是否从httpUrlConnection读入,默认情况下是true;
                connection.setDoOutput(true);
                //设置是否向httpUrlConnection输出,默认为false
                connection.setDoInput(true);
                connection.setRequestProperty("x-ambry-blob-size", length + "");
                connection.addRequestProperty("x-ambry-service-id", ServiceId);
                connection.addRequestProperty("x-ambry-owner-id", owner);
                connection.addRequestProperty("x-ambry-content-type", fileFormat);
                connection.addRequestProperty("x-ambry-um-description", description);
                connection.connect();

                os = new BufferedOutputStream(connection.getOutputStream());

                byte[] buffer = new byte[4096];
                int bytes_read;
                //只要可以读取到数据,就输出写到buffer中
                while ((bytes_read = inputStream.read(buffer)) != -1) {
                    os.write(buffer, 0, bytes_read);
                }
                //数据读取完关闭inputStream
                os.close();
                inputStream.close();
                String location = connection.getHeaderField("Location");
                return StrUtils.makeString(ambryUrl, location);
            } catch (Exception e) {
                count++;
                try {
                    TimeUnit.SECONDS.sleep(1L);
                } catch (InterruptedException e1) {
                    //写失败日志,后面会有引擎继续尝试写入对象
                    log.warn("file-upload-failed:"+ JSON.toJSONString(file1)+"|||"+"{ServiceId:"+ServiceId+",owner:"+owner+",fileFormat:"+fileFormat+",description:"+description+"}");
                }
                log.warn(ExceptionUtils.getStackTrace(e));
            } finally {
                try {
                    if (os != null) {
                        os.close();
                    }
                } catch (IOException e) {
                    log.warn(ExceptionUtils.getStackTrace(e));
                }
                try {
                    if (is != null) {
                        is.close();
                    }
                } catch (IOException e) {
                    log.warn(ExceptionUtils.getStackTrace(e));
                }
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
        return null;
    }

在前端,我们利用editor.md这个markdown编辑器做测试展示: 上传:

这里写图片描述
这里写图片描述

成功后:

这里写图片描述
这里写图片描述

我们现在停掉xx.xx.8.133上的ambry: 访问xx.xx.8.133:1174/healthCheck:

代码语言:javascript
复制
HTTP/1.1 200 OK
Content-Length: 4
GOOD

这时,我们添加一张图片:

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

添加图片成功,访问成功。 之后,我们停掉xx.xx.8.134,xx.xx.8.135上的ambry,再次访问xx.xx.8.133:1174/healthCheck:

代码语言:javascript
复制
HTTP/1.1 200 OK
Content-Length: 4
GOOD

这时候就有问题了,集群状态还是良好。。。估计是我们的使用有问题,需要集群监控状态统一中心,类似于zookeeper这样的东西,我们目前的配置中没有,之后我们会讲这个配置。 这时,我们再去上传图片,发现上传不了。 接下来,我们启动xx.xx.8.133,就是在停掉这个之后上传图片的那个ambry。 访问之前上传的那个图片,发现访问不了。

这里写图片描述
这里写图片描述

之后,我们启动xx.xx.8.134,xx.xx.8.135,稍等一段时间后,发现图片又可以访问了。

这里写图片描述
这里写图片描述

之后,我们停掉xx.xx.8.134: 访问图片,正常:

这里写图片描述
这里写图片描述

停掉xx.xx.8.135: 访问图片,正常:

这里写图片描述
这里写图片描述

原来在133挂掉时上传的图片,目前在133上也可以访问了

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016/11/07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本Restful API
  • 基本测试
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档