顧客に使ってもらってるAppengineが何か最近重い気がするので、今更High Replicationに移行することにしました。
そうです。割と最近までMaster/Slaveだったのです。
結論から言うと、移行自体は最近ようやく落ち着きましたが、結構渋いトラブルに見舞われました。
- データモデルに一部PolyModelを使ってるのだが、外部レコード参照で仕方なくkey()を使っていた
 - Migration Toolを使って、稼働中にデータ転送を試してみたが、
 - コピー自体は一瞬でした。DataStore Staticsticsで見ると、339MB。この程度だと速いみたいですね。
 - 元サーバのdatastoreをreadonlyにして「ない」場合も一応コピーは出来ますが、Launch Incremental Copyを押せば、何度もリトライしてくれます。
 - RevertとFinishの意味を勘違いして、Finishを押してしまった。
 - RevertじゃなくてAbortとか書いてほしい。
 - Finishは「データ転送を完了ってことにしていいよ」で、次に進んじゃいます。
 - なんとDNSも書き換わって、旧URLで新URLで接続してくれてしまうことに。
 - 最悪、remote_apiでデータ運べばいいかと思っていたので泡食いました。
 - 仕方なく、新URLで確認すると、
 - データ表示がうまくいかないので、データ移行が失敗してたのかと思ったけどそうではなく、
 - 前述のキー値が書き換わってないので、旧サーバにデータを取りにいってエラーで落ちてたらしい。
 - django templateの奥で死んでいたので、シレっと処理はつづく。結果、空表示が続くことに。
 - ※Model.key()ってワールドユニークだったのね。
 - ReferencePropertyにしてるカラムは、全て、コピー先でも参照できてます。ちゃんと書き換えてくれてるらしい。
 - 仕方ないので、スクリプトをグルグル回して、key()の書き変えをすることに。
 - そしたら今度は、開発初期のゴミデータで、classプロパティが壊れてるレコードがあり、そこで引っかかってスクリプトが回らない。
 - 厳密にはPolyModelのロードで、変なクラスを探そうとして死ぬ。
 - 仕方ないので、それ以外を避けて修復。
 - はー。やっと一段落
 - ついでにruntimeをpython25からpython27に変えてみようか。
 - バージョンをずらしてupdate掛けてみたら、なんと旧バージョンが動かなくなった。
 - ログを確認すると、見たこともないエラーが
 - AttributeError: class Reference has no attribute '__new__'
 - python25プログラムから、python27ランタイムを呼んじゃってる気配。
 - runtimeバージョンは、サーバ全体で共通設定らしい。
 
とりあえず心に刻んだのは
- PolyModelは辞めよう。小生には使いこなせない
 - Model.key()を直接扱うのは辞めよう。
 - 同一アプリケーションに、複数バージョンのpython runtimeは混在できない。