在应用之间共享存储桶

时间:2018-03-06 16:54:20

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

我有一个内部工具,可以让我编辑配置文件,然后配置文件会同步到Google存储空间(* * * * * gsutil -m rsync -d /data/www/config_files/ gs://my-site.appspot.com/configs/)。

如何在Google App Engine中的多个实例中使用这些配置文件? (我不想使用Google PHP SDK读取/写入存储桶中的配置文件。)

我唯一能想到的就是创建一个cron.yaml文件,每分钟从桶中下载配置到/app/configs/,但是我必须每分钟重新加载php-fpm同样。

的app.yaml:

runtime: custom

env: flex
service: my-site

env_variables:
  CONFIG_DIR: /app/configs

resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

automatic_scaling:
  min_num_instances: 2
  max_num_instances: 20
  cpu_utilization:
    target_utilization: 0.5

Dockerfile:

FROM eu.gcr.io/google-appengine/php71

RUN mkdir -p /app;

ADD . /app
RUN chmod -R a+r /app

2 个答案:

答案 0 :(得分:0)

我假设您正在设计一个解决方案,您可以在GCS存储桶上使用拉取请求来快速配置和更新应用程序。

此过程中有很多要点,具体取决于您的确切流程,您可以在哪里插入"请立即更新"命令。例如,为什么在更新GCS存储桶中的配置时,您只是简单地排队任务?该任务基本上会降低配置并重新部署您的应用程序。

除非您考虑使用可访问该存储桶的多个应用程序,并且您希望能够集中同时更新它们。在这种情况下,您的cron作业解决方案是有道理的。 Dan的建议肯定有效,但我认为你可以通过使用版本号来简化它。只需要另一个带有版本号的文件,cron作业就会拉出该文件,对其进行比较,然后在版本较新的情况下执行更新。它与Dan的解决方案非常相似,除非你真的不需要散列任何东西。如果您使用配置更新GCS,也可以使用版本信息标记另一个文件。

另一种解决方案是在所有这些应用程序中公开处理程序,例如" / update"处理程序。无论何时命中,应用程序都会执行更新。只要您实际更新GCS中的配置,就可以点击该处理程序。这更像是推动解决方案。优点是您可以更好地控制哪些应用程序获取更新,如果您还不确定某个配置,那么这可能非常有用,因此您不希望一次更新所有内容。

答案 1 :(得分:0)

我们不想在我们的应用程序中为此添加处理程序。我们认为最好使用supervisord。

附加supervisord.conf:

[program:sync-configs]
command = /app/scripts/sync_configs.sh
startsecs = 0
autorestart = false
startretries = 1

sync_configs.sh:

#!/usr/bin/env bash

while true; do
    # Sync configs from Google Storage.
    gsutil -m rsync -c -r ${CONFIG_BUCKET} /app/config

    # Reload PHP-FPM
    ps ax | grep php-fpm | cut -f2 -d" " - | xargs kill -s USR2

    # Wait 60 seconds.
    sleep 60
done

Dockerfile:

COPY additional-supervisord.conf /etc/supervisor/conf.d/