2013年12月21日土曜日

Google Appengine の Master/SlaveからHRD移行

久しぶりに仕事ネタです。最近出稼ぎばかりなので。

顧客に使ってもらってるAppengineが何か最近重い気がするので、今更High Replicationに移行することにしました。
そうです。割と最近までMaster/Slaveだったのです。

結論から言うと、移行自体は最近ようやく落ち着きましたが、結構渋いトラブルに見舞われました。

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

とりあえず心に刻んだのは

  • PolyModelは辞めよう。小生には使いこなせない
  • Model.key()を直接扱うのは辞めよう。
  • 同一アプリケーションに、複数バージョンのpython runtimeは混在できない。