Riak-CS更新ACL有时无法使用Boto

时间:2014-06-05 10:55:33

标签: amazon-s3 boto riak riak-cs

我有一个包含5个Riak-CS节点的虚拟化集群。 Stanchion安装在第一个节点上。这些节点位于Nginx反向代理之后。

当我上传JPG文件时,使用我的Python脚本(使用boto库),它可以正常工作:

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):

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上的日志文件,并且在第一种情况下我们看到了以下内容:

"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"

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

"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 info s3://test/1.jpg”来查找文件中的ACL。似乎根据PUT acl发送到哪个Riak-CS服务器,有时文件被更改为公共,有时则不是。我已经检查了运行脚本的机器出来的网络流量,并且无论失败成功与否,每次PUT新命令的命令都完全相同。通过NGINX的消息每次都完全相同,即使它没有将ACL更新为公共,它仍然返回200.

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

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

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,看不出任何问题。

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

1 个答案:

答案 0 :(得分:2)

这是由Riak CS [1]和非同步时钟的错误引起的 服务器间。有关详细的错误描述,请参阅[1]。

目前的解决方法是同步服务器时钟。它会很低 如果你能以100毫升的顺序同步它们的可能性 第二,我猜(显然,它取决于PUT之间的间隔 客户端上的Object和PUT Acl以及之间的网络延迟 客户和riak cs)。如果它不起作用,请添加一些等待 客户端代码中的PUT对象:P

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

[1] https://github.com/basho/riak_cs/issues/879