ラベル appengine python27 の投稿を表示しています。 すべての投稿を表示
ラベル appengine python27 の投稿を表示しています。 すべての投稿を表示

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は混在できない。


2012年9月30日日曜日

appengine python27 threadsafe:true

先日、python2.7環境で「動かしただけ」のappengine アプリケーションを、本格的に threadsafe:trueを試してみました。

例によって、情報は足りてるのですが、英語のドキュメントを読んでも今ひとつ要領を得ません。

早い話がこうです。

  • threadsafe:trueにしたら
    • app.yamlは
      • actionsの拡張子はすべて"app"にしなければならない
      • いや?*.pycじゃね?と思うかも知れませんが、カンケーないらし。
    • 個々の*.pyは
      • import webapp2
      • webapp2.WSGIApplicationの変数名を、必ず"app"にしなければならない
        • yamlの*.appってそういう意味????
      • 直接、深いディレクトリの*.pyを起動することは出来ない。
        • ひょっとして、modulename.modulename.app とか書けばいいのか??

2012年9月15日土曜日

app engine python27に移行

訳あって、app engine アプリケーションを製作中。当然pythonです。

で、tumblpyが、python2.7ベースで出来てることもあり、
https://github.com/michaelhelmick/python-tumblpy
ヨクヨク見たら、appengine もpython2.7で稼働できるらしく、
じゃあ移行してみようかと。

結論から言うと、ハマりますね。オフィシャルドキュメントを読んでも散漫でよくわからない。情報量は足りてるのですが。

  • アプリケーションインスタンス設定
    • High Replication Datastoreである必要があります。
    • そんな難しい話じゃなくて、https://appengine.google.com/ のStorage Schemeの欄を参照。
    • 残念ながら駄目だった場合、新規にアプリケーションを作成する必要があります。1個損した気分。
      • 同じ個数をDisable/Deleteそれば、総数は相殺するらしい。
    • ドキュメントには application idに"-hrd"を付けてね!とか書いてあるけど、これは移行するときに、id名の重複を懸念してのアドバイスであって、本質的には「設定」の問題。
      • 新規(Create Application )の場合でのみ、Storage Optionが選択できる。
        • High Replication(default) と Master/Slaveが選べるらしい。
          • 前者がdefaultになってるし、後者はdeprecatedなので、わざわざ選び直す意味はないと思われる。
  • app.yaml
    • runtime: python27
    • threadsafe: false
      • 無論、trueが望ましいと思われるが、実装に依存する可能性もあり、怖気づいたので。
  • wsgiref
    • os.path.dirname(__file__) != "."
      • テンプレートの読み込み等で、カレントディレクトリ前提に書いちゃってる部分は、フルパスを補う必要があり。
    • self.respone.writeの引数に、strしか受け付けない
      • assert type(data) is StringType,"write() argument must be string" AssertionError: write() argument must be string とか面妖なエラーメッセージに化けて迷宮入りします。
      • self.response.write( str(html1) ) とかで解決することはする