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

在上一篇文章中,我们部署了如下一个ambry集群:
这里写图片描述
下面,我们来为这个集群做简单的测试:

基本Restful API

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

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

HTTP/1.1 200 OK
Content-Length: 4
GOOD

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

Request HeaderTypeRequired?Description
x-ambry-blob-sizeLongYes你要保存对象的大小,这个一定要准确,否则会上传失败
x-ambry-service-idStringYes你可以通过这个字段设定是哪个服务上传的对象
x-ambry-content-typeStringYes对象类型
x-ambry-ttlLongNo对象存活时间,默认是-1,即无限时间
x-ambry-privateBooleanNo是否是私有对象,默认为false,即任何人可以访问
x-ambry-owner-idStringNo通过这个属性指定对象的拥有者
x-ambry-um-StringNo如果用户想自定义一些属性,需要以这个开头,可以指定任意个这个开头的属性

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

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 /<ambry-id>
举例:GET /AAEAAQAAAAAAAAAAAAAAJDk3NDI2MmQ1LTU0YzktNDk5OC1iM2Q5LTE1ZTQ5NDYwNjI0Mw
这个ambry-id就是之前返回的response中的Location属性

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

4. HEAD /
HEAD /<ambry-id>
这个用于获取元数据

5. DELETE /
DELETE /<ambry-id>
这个用于删除某个ambry对象。

基本测试

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

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:

HTTP/1.1 200 OK
Content-Length: 4
GOOD

这时,我们添加一张图片:
这里写图片描述
这里写图片描述
添加图片成功,访问成功。
之后,我们停掉xx.xx.8.134,xx.xx.8.135上的ambry,再次访问xx.xx.8.133:1174/healthCheck:

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上也可以访问了

转载于:https://my.oschina.net/u/3747772/blog/1589039

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值