【问题标题】:What will happen with a gsutil command if a DRA bucket's contents are unavailable?如果 DRA 存储桶的内容不可用,使用 gsutil 命令会发生什么情况?
【发布时间】:2015-03-14 19:36:21
【问题描述】:

我正在使用DRA (Durable Reduced Availability) bucket,并且我经常执行gsutil rsync 命令来向存储桶上传/下载文件。

由于文件)可能不可用(由于 DRA),当遇到这种情况时,gsutil rsync 会话期间究竟会发生什么?

  1. gsutil 是否会等到不可用的文件可用并完成任务,从而始终从存储桶中下载所有内容?
  2. 或者gsutil 会退出并发出有关某个文件不可用的警告,如果是,那么究竟正在使用什么输出(以便我可以编写脚本来查找此类消息)?
  3. 在发现文件不可用的会话中,gsutil 命令的返回码是什么?

我需要 100% 确定我从存储桶中下载了所有内容,我猜想在下载数百 GB 的数据时很难跟踪这些内容。如果gsutil rsync在没有下载不可用文件的情况下完成,是否可以构造一个命令重试不可用文件,直到所有此类文件都成功下载?

【问题讨论】:

    标签: google-compute-engine gsutil


    【解决方案1】:
    1. 如果您的文件超过可恢复阈值(从 4.7 开始,为 8MB),任何可用性问题都将根据num_retriesmax_retry_delay 配置变量使用指数退避重试。如果文件小于阈值,则不会重试(这将在 4.8 中得到改进,因此小文件也会重试)。
    2. 如果任何文件未能成功传输,gsutil 将停止并根据遇到的失败输出异常。如果您使用gsutil -m rsyncgsutil rsync -C,gsutil 将继续出错,最后,您将收到带有消息“N 个文件/对象无法复制/删除”
    3. 如果重试次数用尽和/或出现 #2 中描述的任一失败情况,退出代码将非零。

    为了确保您从存储桶下载所有文件,您可以简单地重新运行gsutil rsync,直到您获得非零退出代码。

    请注意,gsutil rsync 依赖于列出对象。在 Google Cloud Storage 中列出最终是一致的。因此,如果您将文件上传到存储桶然后立即运行gsutil rsync,您可能会错过新上传的文件,但下一次运行gsutil rsync 应该会拾取它们。

    【讨论】:

    • 优秀。谢谢!
    【解决方案2】:

    我对一个项目进行了一些测试,但无法让gsutil 抛出任何错误。 Afaik,gsutil 在目录级别上运行,它不是在寻找特定的文件。

    当您运行时,例如 $ gsutil rsync local_dir gs://bucket ,gsutil 不期望任何特定文件,它只会获取您在“local_dir”中的任何内容并将其上传到 gs://bucket,所以:

    1. gsutil 不会等待,它会完成。

    2. 您不会收到任何错误 - 我收到的唯一错误是本地目录或存储桶完全丢失。

    3. 如果假设local_dir 上缺少一个文件,但它在存储桶中可用,然后您运行$ gsutil rsync -r local_dir gs://bucket,那么存储桶中不会发生任何变化。使用“-d”选项,文件将在存储桶端删除。

    作为建议,您可以添加一个 crontab 条目以在一天或晚上重新运行几次 gstuil 命令。

    另一种方法是创建一个简单的脚本并将其添加到您的 crontab 中,以便每隔一小时左右运行一次。这将检查您的文件是否存在,如果存在,它将运行 gsutil 命令:

    #!/bin/bash
    FILE=/home/user/test.txt
    
    if [ -f $FILE ];
    then
       echo "file exists..or something"
    else
       gsutil rsync /home/user gs://bucket
    fi
    

    更新:

    我认为这可能是您需要的。在 ~/ 你应该有一个 .boto 文件。

    ~$ more .boto | grep max
    # num_retries = <integer value>
    # max_retry_delay = <integer value> 
    

    取消注释这些行并添加您的数字。默认为 6 次重试,因此您可以执行 24 次重试,并在其间放置 3600 次。这在理论上应该始终保持循环。

    希望这会有所帮助!

    【讨论】:

    • 你指的是上传到bucket,对吗?我想知道您何时从存储桶中下载
    • 嗯,这是相同的过程,但你只是改变了参数的顺序。 gsutil rsync gs://bucket /home/user
    • 是的,当然。但是您的答案并没有真正涵盖当存储桶中的文件不可用时会发生什么,该存储桶位于您正在下载的目录中。或者如何确保 gsutil 在实际下载该文件之前一直尝试。我无法为此运行 crontab 作业。我需要 gsutil 向我的应用程序抛出错误,或者让我的应用程序能够识别出未下载文件。更好的是,让 gsutil 坐下来等到文件可用后再下载。
    • 如果您正在查找单个文件,如何使用“$ gsutil cp”。我知道它不是“rsync”,但是如果在存储桶中找不到文件,它会给你一个错误:$ gsutil cp gs://bucket/log1.txt /home/user/ CommandException: No URLs match: gs: //bucket/log1.txt
    • 就我而言,我不是在寻找单个文件。我只需要确保从存储桶中成功下载了所有内容。而且我不想使用 gsutil cp。我希望使用 gsutil rsync。我有点困惑,似乎没有这方面的任何信息。
    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 2020-09-07
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多