【问题标题】:safe to touch data after migrating to high replication datastore before another incremental copy?在另一个增量复制之前迁移到高复制数据存储后是否可以安全地访问数据?
【发布时间】:2012-03-13 20:50:49
【问题描述】:

为了迁移我们的应用程序(2 岁,相当数量的数据),我计划使用recommended tool

我们的一些实体存储带有对键的引用的序列化字典,因此我们需要转换它们以更改键的应用程序名称部分。我的问题是,更改已迁移的数据是否会扰乱迁移工具对增量复制期间需要迁移的内容的理解?例如,这样做是否安全:

  • 启动迁移工具
  • 运行我们的自定义工具以迁移存储的密钥(在新应用中)
  • 验证我们的应用是否正常运行
  • 运行增量复制
  • 再次运行我们的工具

【问题讨论】:

    标签: google-app-engine google-cloud-datastore


    【解决方案1】:

    事实证明,在迁移过程中,目标应用处于只读模式,因此无法在迁移完成之前在目标 hrd 应用上运行任何修复工具。

    相反,我现在的方法是修改 db.get 以动态重写密钥,然后在迁移后修复目标应用程序中的引用。到目前为止,我已经验证了我的新人力资源应用程序可以在猴子补丁到位的情况下正常工作。一旦新版本上线,我就不得不修复引用,这让我很谨慎,但事实就是如此。

    from google.appengine.ext import db
    import os
    
    APP_ID = os.getenv('APPLICATION_ID')
    
    def replace_key(key_str, app_id=None):
        app_id = app_id or APP_ID
        oldkey = db.Key(key_str) if not isinstance(key_str, db.Key) else key_str
        if oldkey.app() != app_id:
            fixedkey = str(db.Key.from_path(oldkey.kind(), oldkey.id_or_name(), _app=app_id))
            logging.info("rewriting %s to %s", str(oldkey), fixedkey)
            return fixedkey
        else:
            return key_str
    
    old_get = db.get
    
    def monkeyed_get(keys, **kwargs):
        single = False
        if isinstance(keys, (basestring, db.Model, db.Key)):
            single = True
            keys = [keys]
    
        results = old_get(map(lambda k: replace_key(str(k)), keys), **kwargs)
        return results[0] if single else results
    
    db.get = monkeyed_get
    

    【讨论】:

      【解决方案2】:

      我们将目标应用设置为只读的唯一原因是为了防止任务队列或 cron 作业等操作在部分复制的数据上运行,这可能会在目标应用中产生错误数据。

      可以手动将目标数据存储置于读写模式,或编写自定义 MR,该 MR 使用覆盖只读设置的数据存储选项来修复序列化实体作为流程的一部分。

      迁移工具只在Master/Slave应用中寻找变化,然后盲目复制到HRD应用中。如果您在 HRD 应用程序中进行了更改,那么如果在您的主/从应用程序中对同一实体进行了更改,它们将被覆盖。

      话虽如此,我实际上更喜欢您的方法,它支持两者并按需修复密钥。您还可以编写一个 MapReduce 来修复此方法未修复的任何引用。

      【讨论】:

      • 感谢您的澄清 - 很高兴知道在迁移完成之前可以覆盖读/写。但就像你推荐的那样,一旦我在只读/只读的限制下工作,它实际上似乎是一种更清洁的方法。我们的迁移已成功完成。
      猜你喜欢
      • 2013-12-21
      • 2023-04-08
      • 2011-09-08
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 2014-09-06
      相关资源
      最近更新 更多