GAE開発の落とし穴
Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します
ブックマークされました!
ブックマークがエラーになりました。もう一度お願いします。
作者 Alex Popescu and Ryan Slobojan , 翻訳者 徳武 聡 投稿日 2010年4月26日
この程、InfoQ.comはこのサイトを始めてから使用していたバックエンドのデータベースを刷新した。しかし、すべて計画通りに事が運んだわけではなかった。ほとんどの移行作業は滞りなく進んだが、いくつかの予期していなかった問題(現在は解決済み)に直面した。この記事では、私たちがどんな計画をして、何が成功し何がうまくいかなかったのか、そして直面した問題をどのように検知し解消したのかを詳しく論じたい。
今回の更新作業は複雑な案件であり、2、3ヶ月を必要とした。既存のデータベースサーバは、最初に導入した2006年からハードを変えていなかったので、ほとんど最大限に利用している状況だった。そしてこの結果、性能上の問題が顕在化し始めていた。特に定期的に実行されるレポート出力処理が走っているときは性能劣化が顕著だった。加えて、単一のマスタMySQLデータベースからマスタ/スレーブ構成のMySQLデータベースへ移行する良い機会でもだった。この構成にしておけば、ホットフェイルオーバが可能になり、マスタデータベースではなくスレーブに対してレポート処理やバックアップを行うことができる。InfoQ.comのユーザはこのような処理の性能上の悪影響を受けずにすむようになる。
私たちは下記のような複数の段階を踏む計画を立案した。
master <-- slave 1 <-- slave 2という構成になる。こうしておくことで、スレーブ1からスレーブ2への同期の高速化が実現できる。これは(最大限に利用されていて負荷も高い)マスタと同期するmaster <-- slave 1, slave 2という構成よりも圧倒的に早い。また、新しい2つのスレーブサーバにMySQL 5.1を導入したことで、更新作業に伴うサービス停止時間が少なく抑えられることがわかった。私たちの調査によると、MySQL 5.1のスレーブはMySQL 5.0のマスタと正常に同期ができる。したがってスレーブにMySQL 5.1を導入する作業から始めることで、ファーストスレーブを新しいマスタに置き換える作業とMySQL 5.1へのアップグレードをあわせて行うことができる。
他のとりうる選択肢(サービスの停止を回避できる)としてはマスタを停止してファイルのコピーを実施するのではなく、mysqldumpを使ってマスタサーバからデータを取り出しスレーブに転送する方法があった。しかし、対象が最大限に利用されているサーバなのでこの方法は選択肢から除外した。というのは、バックアップ処理を実施すればマスタデータベースに対して過大な負荷がかかり、その結果、応答の遅延が発生して最終的にはサービスが停止している状況と同じになってしまう可能性があるからだ。
最初に直面した課題は計画を実施の適切な時間を見つけることだった。開発チームはルーマニア、ISPはミズーリ、オペレーションチームはバンクーバーとオレゴンに分散している。結局、InfoQ.comへのアクセスが少ない時間帯をサービス停止時間にできること、オペレーションチームが夜間に作業を開始できることと開発チームが朝に作業を開始できること(ルーマニアとバンクーバーには10時間の時差がある)を考慮して、太平洋標準時刻の金曜深夜帯(ヨーロッパでは土曜日の朝)を実施時間とした。実施時間を決定したことで計画の第一段階が完了した。
第二段階はサービスの停止だ。計画したときには、2台のサーバをギガビットイーサネットで接続して作業を行うため、2時間程度の停止時間で大丈夫だろうと見積もっていた。しかし、実際作業をおこなうとネットワーク上の問題が見つかったため最終的には5時間以上もかかった。この点で私たちは重要な教訓を得た。すなわち、ひとつのデータセンター内の作業だからネットワーク上の問題が起きないと思っていたら大間違いだ。
第三段階から第六段階は滞りなく進み、とくに問題には直面しなかった。2月26日に新しいマスタデータベースへの切り替えを行い、その後基本的な動作確認をおこなっても問題は見られなかった。うれしい事にサイトの挙動は以前と比べて段違いに早くなった。私たちは今回の作業全体にとても満足していた。
しかし、これでこの記事が終わってしまったらちょっとつまらないでしょう。 :)
移行実行の数日後、コメントシステムにいくつかの問題があることに私たちは初めて気付いた。具体的には、新しいコメントが投稿されてもその後数分経つと消えてしまうという現象で、ユーザの印象では削除されたように見えるそうだ。結局、この問題の原因は驚くべきものだった。データベースサーバのマスタ/スレーブレプリケーションを有効にしたため、現在使っているバージョンのJiveがコメントを消失していたのだ。解決策としてトランザクションの分離レベルをREAD_UNCOMMITTEDからREPEATABLE_READへ変更した(READ_UNCOMMITTEDではレプリケーション環境でエラーを発生させてしまうからだ)。こうすれば、もう一度コメントを作成できる。
しかし、これですべての問題が解決したわけではなかった。初期のテストでは問題なくコメントが追加できていたものの、2、3日経つと一貫性についてとても奇妙な問題が発生していることがわかった。具体的に言うと、データベースの移行以後に付け加えられたコメントが、サイト上の全く関係のない既存のコメント欄に加えられているようだった。もう少し深く調べてみるとJiveが何のエラーもログを出力せずにスレッドを追跡するためのユニークなIDを初期化していることがわかった。その結果、IDのカウンターが16,000から0へ初期化されてしまった後、既存のスレッド(古いものではあるが)を上書きしてしまったり、壊してしまったりする可能性が発生していた。結局、原因は私たちが、MySQLの行ベースレプリケーションを選択したことにあった。この原因に気付いた私たちは、原因を解決して不正に割り当てられてしまったコメントの削除を実行した。
今回の更新作業で私たちは次のことを学んだ。
また、私たちはいつでもフィードバックを受け付けている。チャンネルは下記のどれでもいい(複数でも!)。
【ネクストスケープ】.NET、C#のアプリケーション開発者募集
【豆蔵】大好評のため、Jenkins講座を追加開催致します!Jenkins作者の川口氏が講師です。
Googleのクラウド環境をつかったGoogle App Engineによる開発するにあたり、初めての試みで苦悩する開発者達の経験をもとに、各開発フェーズにあわせて問題点やどう解決したかをご紹介します
去る1月12日、定理証明支援系ツールCoqの初心者向けチュートリアルが開催さ れた(http://kokucheese.com/event/index/23667/)。今後も2月2日 (http://kokucheese.com/event/index/23744/)、2月9日、2月16日と引き続き開 催されていく予定である。本記事では、開催の様子をレポートする。
Neal Gafter氏はOracleによるJava買収の影響に関する議論、Javaにセグメンテッドスタックやメタオブジェクトプロトコルを追加することについての主張、そしてJavaとC#との比較について話をしてくれた。
GoogleはVMをともなう新しい言語であり、JSコンパイラでもあるDartをプレビューした。 InfoQはDartのアプリの構築に貢献する文法の裏側を探った:スナップショット、Isolate、モジュール方式
本記事ではCSPベースの「マルチドメイン・モデル検査ツール」である、PAT(Process Analysis Toolkit)について紹介する。モデル検査は、形式手法(Formal Method)という方法論を基礎とする技術であり、複雑さが増大しながらも安全性を求められる、現在のソフトウェア開発の状況に対する処方箋の1つとして注目されている手法である。
前回まで、Jenkinsの幾つかの側面に注目して解説をしてきました。シリーズ最後の今回は、Jenkinsをサービスとして使う方法を紹介します。
Alloyは、MITにて開発された仕様記述言語であり、ツールによる自動解析を使い、インクリメンタルに形式仕様が書けることが特長である。筆者らはAlloy開発者による、Alloyを使った形式手法入門書を翻訳、今夏にオーム社より刊行した。本記事では、Alloyの簡単な概要と、翻訳書『抽象によるソフトウェア設計』(「Alloy本」)を紹介する。
スマートフォンを中心としたマルチデバイスにおけるタッチユーザーインターフェイスへの対応は、既に必須の項目となりつつある。本記事では、Windows デバイスにおける UX のベースとなっている「メトロ」というデザイン言語を掘り下げながら、既存環境を意識しつつもどのようにタッチユーザーインターフェイス開発に取り組んでいくべきであるかについて解説していく。
No comments
スレッド表示 返信