首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Riak-CS更新ACL有时不使用Boto

Riak-CS更新ACL有时不使用Boto
EN

Stack Overflow用户
提问于 2014-06-05 10:55:33
回答 1查看 316关注 0票数 1

我有一个由5个Riak节点组成的虚拟集群。在第一个节点上安装了支柱。这些节点位于Nginx反向代理后面。

当我使用Python脚本(使用boto库)上传JPG文件时,它工作得很好:

代码语言:javascript
复制
cf=OrdinaryCallingFormat()
conn=S3Connection(aws_access_key_id=apikey,aws_secret_access_key=secretkey,is_secure=False,host=s3Host,port=s3Port,calling_format=cf)
b = conn.get_bucket(bucketName)
k = b.new_key(fileName)
k.set_contents_from_filename(fileName, policy='public-read')

但是,如果我这样做,有时它不会将ACL设置为公共,但有时会设置(注意:我首先上传文件,然后设置ACL):

代码语言:javascript
复制
cf=OrdinaryCallingFormat()
conn=S3Connection(aws_access_key_id=apikey,aws_secret_access_key=secretkey,is_secure=False,host=s3Host,port=s3Port,calling_format=cf)
b = conn.get_bucket(bucketName)
k = b.new_key(fileName)
k.set_contents_from_filename(fileName)
k.set_acl('public-read')

我检查了Nginx上的日志文件,并在第一个例子中看到了以下内容:

代码语言:javascript
复制
"HEAD /test/ HTTP/1.1" 200 0 "-" "Boto/2.29.1 Python/2.7.3 Windows/7"
"PUT /test/1.jpg HTTP/1.1" 200 25 "-" "Boto/2.29.1 Python/2.7.3 Windows/7"

在第二种情况下,我们得到:

代码语言:javascript
复制
"HEAD /test/ HTTP/1.1" 200 0 "-" "Boto/2.29.1 Python/2.7.3 Windows/7"
"PUT /test/1.jpg HTTP/1.1" 200 25 "-" "Boto/2.29.1 Python/2.7.3 Windows/7"
"PUT /test/1.jpg?acl HTTP/1.1" 200 0 "-" "Boto/2.29.1 Python/2.7.3 Windows/7"

这两者都是意料之中的。

我使用"s3cmd信息s3://test/1.jpg“来查找文件中的ACL。似乎取决于将PUT acl发送到哪个Riak-CS服务器,有时文件被更改为公共文件,而其他时候则不是。我已经检查了运行脚本的机器上的网络流量,不管失败的成功与否,每次放置新ACL的命令都是完全相同的。通过NGINX传递的消息每次都是完全相同的,即使它没有将ACL更新为public,它仍然返回200。

在上传过程中,我监视了每个节点上的Riak日志文件,并且似乎只在5种不同的上传场景中的两种情况下发生这种情况。以下是详细信息:

文件放在节点4上,ACL放在节点3上。查询文件的ACL (S3Cmd信息)是否针对节点1完成,结果是成功的,则ACL具有公共访问集。下面是一些更多的案例,->

代码语言:javascript
复制
Obj PUT Node: 4  ACL PUT Node: 3  Read Node: 1 = Success
Obj PUT Node: 3  ACL PUT Node: 2  Read Node: 5 = Success
Obj PUT Node: 2  ACL PUT Node: 1  Read Node: 4 = Fail
Obj PUT Node: 1  ACL PUT Node: 5  Read Node: 3 = Success
Obj PUT Node: 5  ACL PUT Node: 4  Read Node: 2 = Fail
Obj PUT Node: 4  ACL PUT Node: 3  Read Node: 1 = Success
Obj PUT Node: 3  ACL PUT Node: 2  Read Node: 5 = Success
Obj PUT Node: 2  ACL PUT Node: 1  Read Node: 4 = Fail
Obj PUT Node: 1  ACL PUT Node: 5  Read Node: 3 = Success
Obj PUT Node: 5  ACL PUT Node: 4  Read Node: 2 = Fail

正如您所看到的,有时ACL“粘住”,而另一些时候则不会。我检查了所有节点的配置,特别是1&4,看不到任何问题。

有没有人知道为什么有时这不起作用,或者有什么想法我可以继续调查这里发生了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-07 00:26:09

这是由Riak 1的错误和服务器之间不同步的时钟引起的.有关详细的bug描述,请参见1。

当前的解决方法是同步服务器时钟。我猜,如果您可以按100毫秒的顺序同步它们,则可能性很小(显然,这取决于PUT对象与将Acl放在客户端之间的间隔,以及客户机与riak cs之间的网络延迟)。如果不能工作,请在客户端代码中的PUT对象之后添加一些等待:P

马克,非常感谢你对成功/失败模式的详细分析。它导致快速的错误识别:)

1

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24058334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档