爲了遷移我們的應用程序(2歲,數據量相當大),我打算使用recommended tool。在另一個增量副本之前遷移到高複製數據存儲之後可以安全地觸及數據?
我們的一些實體存儲序列化字典並引用了鍵,所以我們需要轉換它們以更改鍵的應用程序名稱部分。我的問題是,更改已遷移數據是否會影響遷移工具對增量複製期間需要遷移的內容的理解?例如,是安全的:
- 啓動遷移工具
- 運行我們的自定義工具遷移存儲鍵(在新的應用程序)
- 驗證我們的應用程序的工作原理
- 運行增量複製
- 運行我們的工具再次
爲了遷移我們的應用程序(2歲,數據量相當大),我打算使用recommended tool。在另一個增量副本之前遷移到高複製數據存儲之後可以安全地觸及數據?
我們的一些實體存儲序列化字典並引用了鍵,所以我們需要轉換它們以更改鍵的應用程序名稱部分。我的問題是,更改已遷移數據是否會影響遷移工具對增量複製期間需要遷移的內容的理解?例如,是安全的:
事實證明,在遷移過程中,目標應用爲只讀模式,所以在目標上運行的應用程序HRD任何修理工具之前遷移完成不是一種選擇。
相反,我的做法現在是猴子修補程序db.get來即時重寫密鑰,然後修復遷移後目標應用程序中的引用。到目前爲止,我已經驗證了我的新hrd應用程序可以正常使用猴子補丁。這讓我很擔心,一旦新版本正式發佈,就必須修復這些參考文獻,但事實如此。
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
我們把目標應用程序只讀的唯一原因是爲了防止事情像你的任務隊列或cron作業由部分複製的數據可能在你的目標應用程序產生錯誤的數據上運行。
可以手動將目標數據存儲設置爲讀寫模式或寫入自定義MR,該自定義MR使用數據存儲選項來覆蓋只讀設置,以將您的序列化實體作爲過程的一部分進行修復。
遷移工具僅查找主/從應用程序中的更改,然後將其盲目複製到HRD應用程序。如果您在HRD應用程序中進行更改,如果對主/從應用程序中的同一個實體進行更改,它們將被覆蓋。
這就是說,我確實喜歡你的方法,它支持並根據需要修復了這些鍵。您也可以編寫MapReduce來修復任何尚未由此方法修復的引用。
感謝您的澄清 - 很高興知道在遷移完成之前可以重寫讀/寫。但是就像你推薦的那樣,一旦我在閱讀/限制的範圍內工作,它實際上就像是一種更清潔的方法。我們的遷移已成功完成。 – 2012-03-25 13:52:20