【问题标题】:How to sync a number between multiple google cloud instances using google cloud storage?如何使用谷歌云存储在多个谷歌云实例之间同步号码?
【发布时间】:2018-06-25 22:07:21
【问题描述】:

我正在尝试在谷歌云中的多个实例之间同步操作。

在我创建新实例的图像的主文件夹中,我有几个文件命名如下:1.txt2.txt3.txt、...50000.txt

我在名为gs://bucket/current_file.txt 的谷歌云存储桶中有另一个文件,该文件在一行中包含一个数字,表示所有正在运行的谷歌云实例正在处理的最新文件。最初,该文件如下所示:

0

现在我正在一个一个地创建多个谷歌实例。实例有一个这样的启动脚本:

gsutil cp gs://bucket/current_file.txt /home/ubuntu/;
past_file=`tail /home/ubuntu/current_file.txt`;
current_file=$((past_file+1));
echo $current_file > /home/ubuntu/current_file.txt;
gsutil cp /home/ubuntu/current_file.txt gs://bucket/;
process.py /home.ubuntu/$current_file.txt;

所以这个脚本下载当前正在被另一个实例处理的文件的值,然后它加1,然后开始处理这个增加的文件。还更新了gs://bucket/current_file.txt,以便其他实例知道他们可以开始处理的下一个文件的名称。当我只运行 1 个实例时,gs://bucket/current_file.txt 会正确更新,但是当我运行多个实例时,有时gs://bucket/current_file.txt 中的值会上升到一个值,然后又不规律地回落到一个减小的值。

我的假设是两个不同的实例试图同时上传同一个文件,并弄乱了文本文件中的整数值。

是否有可能锁定文件,以便其他实例等待一个实例覆盖gs://bucket/currrent_file.txt

如果没有,有人可以建议任何其他机制,一旦它被一个实例处理,我可以通过它更新 current_file 编号,然后可以与其他实例通信,以便他们可以在完成处理后开始处理以下文件手头有文件吗?

【问题讨论】:

    标签: google-cloud-platform google-cloud-storage


    【解决方案1】:

    你是对的。在您的架构中,您需要某种机制来锁定您的current-file 计数器,以便一次只有一个进程能够更改其值。当一个进程打开文件以增加文件时,您希望能够对文件应用互斥锁或锁定,以便另一个进程无法同时增加它。

    我建议您考虑其他方法。

    即使您能够锁定计数器,您的“工作人员”也会阻塞,等待轮到他们在应该能够继续处理文件时增加此变量。当您的进程一次抓取一批文件时,您还可以将处理限制为一次处理一个文件。

    您可以考虑多种方法。

    如果您的文件集是预先确定的,即您总是有 50k。当你开始时,你可以决定你希望使用多少工人,然后给他们每个人解决问题的一部分。如果选择 1000 个 worker,第一个可能会被分配 1.txt..50.txt,第二个 51.txt..99.txt 等等。如果文件中有间隙,worker 会跳过丢失的文件。

    在更复杂的场景中,当文件在存储桶中随机且持续地创建时,通常的做法是排队处理。看看Task QueuesCloud Pub/Sub。在这种方法中,您可以在文件到达时对其进行跟踪。对于每个文件,您将一个作业排入队列来处理它。使用 Tasks Queues 和 Pub/Sub,您可以创建推送或拉取队列。

    在任何一种方法中,您都会编写一个从队列中接受作业(文件)、处理它们并对处理后的文件执行某些操作的工作程序。与更简单的情况相比,这种方法有两个优点:第一个是您可以根据队列深度(要处理的文件数)动态增加|减少工作人员的数量。第二个是,如果一个worker失败了,它不会从队列中取出作业,因此另一个worker可以替换它并完成文件处理。

    您可以将已处理的文件移动到“已处理”存储桶以跟踪完成情况。这样,如果您的作业失败,您只需重新启动尚未处理的文件即可。

    最后,与其逐个创建实例,不如看看使用 Managed Instance Groups 的自动缩放功能,或者考虑使用 Kubernetes。这两种技术都可以帮助您从单个模板中克隆许多类似的流程。虽然这些解决方案都不能解决您的协调问题,但都可以帮助您管理所有工作人员。

    【讨论】:

    • @Syed Areniful haque 我同意 Cloud Pub/Sub 似乎是使用任务队列方法的最强大和最好的方法。您也可以考虑将 concurrency control 用于带有版本控制的 GCS。
    猜你喜欢
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2020-07-24
    • 2015-07-17
    • 2014-10-30
    相关资源
    最近更新 更多