顧客に使ってもらってる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は混在できない。