我有一个由5个Riak节点组成的虚拟集群。在第一个节点上安装了支柱。这些节点位于Nginx反向代理后面。
当我使用Python脚本(使用boto库)上传JPG文件时,它工作得很好:
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信息s3://test/1.jpg“来查找文件中的ACL。似乎取决于将PUT acl发送到哪个Riak-CS服务器,有时文件被更改为公共文件,而其他时候则不是。我已经检查了运行脚本的机器上的网络流量,不管失败的成功与否,每次放置新ACL的命令都是完全相同的。通过NGINX传递的消息每次都是完全相同的,即使它没有将ACL更新为public,它仍然返回200。
在上传过程中,我监视了每个节点上的Riak日志文件,并且似乎只在5种不同的上传场景中的两种情况下发生这种情况。以下是详细信息:
文件放在节点4上,ACL放在节点3上。查询文件的ACL (S3Cmd信息)是否针对节点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,看不到任何问题。
有没有人知道为什么有时这不起作用,或者有什么想法我可以继续调查这里发生了什么?
发布于 2014-06-07 00:26:09
这是由Riak 1的错误和服务器之间不同步的时钟引起的.有关详细的bug描述,请参见1。
当前的解决方法是同步服务器时钟。我猜,如果您可以按100毫秒的顺序同步它们,则可能性很小(显然,这取决于PUT对象与将Acl放在客户端之间的间隔,以及客户机与riak cs之间的网络延迟)。如果不能工作,请在客户端代码中的PUT对象之后添加一些等待:P
马克,非常感谢你对成功/失败模式的详细分析。它导致快速的错误识别:)
https://stackoverflow.com/questions/24058334
复制相似问题