1.
ID:EiaQgLCED22014/01/30(木) 09:15:02
ガールズちゃんねる管理人です。
報告が遅くなってしまい申し訳ございません。このたびの一連の不具合について調査をいたしまして、原因と今後の対策をまとめましたので、こちらで報告いたします。
まず、今回の不具合の大枠は下記のようになります。
【1】田中将大選手のトピックでエラーが発生した
↓
【2】そのエラーが発生しないようにプログラムを修正したところ、修正したプログラムに誤りがあり、全体にエラーが出てしまった
このように一部のエラーを修正しようとして全体にエラーを出してしまうという致命的なミスを犯してしまい、誠に申し訳ございませんでした。
以下、具体的に説明してまいります。
(できるだけ技術用語を排して説明いたしますが、非常に細かいロジックの話になりますので、興味のない方には大変申し訳ございません)
2.
ID:EiaQgLCED22014/01/30(木) 09:16:39
※続きです
【1】田中将大選手のトピックでエラーが発生した
発端となった当該トピックのコメント206番でエラーが起きた原因は、「田中選手の画像コメント」と「文字のみのコメント」がほぼ同時に投稿されたものの、「田中選手の画像コメント」のほうで画像の読み込みに時間がかかり、「文字のみのコメント」とのタイムラグが発生し、結果として「文字のみのコメント」で上書きされてしまったことでした。
具体的には、下記の順番とタイミングで発生しました。
■1. はじめに「田中選手の画像」をユーザーが投稿し、コメント206番として投稿確認画面に移った。しかし、正確にはシステム上、「投稿確認画面で画像をきっちり読み込み終わってから、コメント番号206番を設定する」という順番の処理になっていたため、画像が読み込み終わるまではコメント番号が設定されなかった。
↓
■2. その間に「文字のみのコメント」が投稿され、こちらもコメント206番として投稿確認画面に移った。文字情報だけなので読み込みが一瞬で済み、先ほどの「田中選手の画像」が画像の読み込みに時間がかかっている間に、コメント番号206番を設定された。
↓
■3. ここで、はじめに投稿されたほうの「田中選手の画像」の読み込みが終わり、こちらもコメント番号206番を設定された。
↓
■4. そのまま「田中選手の画像」が投稿され、コメント206番として投稿完了した(文章ではなく画像なので、読んでチェックするほどの時間がかからなかったようで、すぐに投稿完了画面に進んだ)。
↓
■5. 上記の3、4が進んでいる間、「文字のみのコメント」はしばらく投稿確認画面で止まっていた(おそらくユーザーがしばらく放置していた)が、ここでやっと「文字のみのコメント」も投稿され、コメント206番として投稿完了した。
↓
■6. しかし、すでに206番には「田中選手の画像」が投稿されていた。そのため206番に「文字のみのコメント」が上書きされ、「田中選手の画像」は消えてしまった。
順番としては以上のようになります。
読んでいただけるとお分かりになるかと存じますが、このエラーが発生する条件とタイミングは非常にシビアで、それゆえに今まで問題が発覚しなかったものと思われます。今までこのような欠陥があることに気が付かず、誠に申し訳ございません。
3.
ID:EiaQgLCED22014/01/30(木) 09:17:05
※続きです
ここでもう一つの問題が出てまいります。
これまでの説明は、マスターのデータベースサーバ1台に限った場合の説明であり、全てのサーバについて説明したものではありません。
ガールズちゃんねるのデータベースサーバは1台ではなく7台あり、それらは常に同じ内容になるように同期(コピー)されています(念のため全体像を明かしますと、ウェブサーバが30台、データベースサーバが7台、合計37台のサーバによって構成されています)。
そして、データベースサーバ群は、具体的には下記の条件で動いています。
■7台のデータベースサーバは、マスター(原本・オリジナル)が1台、スレーブ(複製・コピー)が6台に分かれており、スレーブはマスターのデータベースを常にコピーしている。
■同期するたびにデータベースの中身すべてを丸ごとコピーするのは非効率すぎるため、差分(前回の同期とくらべて追加された箇所)だけをコピーしている。
■差分コピーは「最終コメント番号+1に、コメントを追加する」仕様になっている。たとえば、そのスレーブにコメント200番までのデータがあれば、200+1で、201番のコメントとして追加される。
■ユーザーがどのデータベースサーバにつながるかは接続するたびに違う。ただし、マスターの1台に直接つながることはなく、スレーブの6台のどれかにランダムでつながる。
■ユーザーがコメントを投稿する際には、スレーブを通して間接的にマスターにコメントを投稿することになるため、スレーブのデータが誤っているとそれがマスターに誤ったまま伝わってしまう。
データベースの動作は以上のようになります。
こうした条件下で動いているため、コメント206番が上書きされた際のスレーブサーバの動きは、次の【A】【B】のように2パターンに分かれました。
【A】田中選手の画像を投稿したユーザーが接続していたスレーブサーバでは、(このスレーブサーバでは田中選手の画像が206番に投稿成功したことになっていたため)マスターサーバから差分データとして「206+1=207番に『文字のみのコメント』を追加しなさい」という指示を受けた。
【B】それ以外の5台のスレーブサーバでは、(すぐに上書きされたせいで田中選手の画像が206番に投稿されたという事実をマスターサーバから受け取っていないため)マスターサーバから差分データとして「205+1=206番に『文字のみのコメント』を追加しなさい」という指示を受けた。
そのため、【A】「コメント207番まで存在するスレーブサーバ(1台)」と、【B】「コメント206番までしか存在しないスレーブサーバ(5台)」が両方存在することになりました。
そして、【A】「コメント207番まで存在するスレーブサーバ(1台)」のコメント数のほうが常に1つ多かったため、【B】「コメント206番までしか存在しないスレーブサーバ(5台)」から最新コメントを書き込むと、【A】の最新コメントを後から上書きしてしまうことになりました。【A】は1台、【B】は5台ありますので、1台のコメントを、他の5台のどれかが次々に上書きしてしまう、という状況です。
これが原因で、6分の1の確率でコメントが上書きされる(消える)という現象が発生しました。
5.
ID:EiaQgLCED22014/01/30(木) 09:17:37
※続きです
【2】そのエラーが発生しないようにプログラムを修正したところ、修正したプログラムに誤りがあり、全体にエラーが出てしまった
こうした原因でエラーが発生することが分かりましたので、対策として下記のようにプログラムを修正しました。
■1. コメントが投稿される際には、画像を読み込む前にコメント番号を設定する(画像が読み込み終わるまでコメント番号が設定されず、タイムラグが生じたことが今回のエラーの原因であったため)
■2. コメント番号を設定する際には、マスターサーバから最新コメント番号を取得する(スレーブサーバのコメント番号を基準に+1していたことが上書きエラーがずっと続いたことの原因であったため)
しかし、適用した修正プログラムに誤りがあり、今度はガールズちゃんねる全体でコメントが投稿できなくなるという不具合が発生してしまいました。
原因は、マスターサーバから最新コメント番号を取得するようにしたものの、それをスレーブサーバに伝える部分の動作にミスがあったためでした。テスト環境はデータベースサーバ1台(マスターサーバのみ)だったため、この不具合を発見することができず、本番環境(マスター+スレーブのデータベースサーバ合計7台)に適用した際にはじめて不具合が露見することになりました。
また、下記のような事情が重なったことにより、不具合が長時間にわたってしまいました。
■すでに不具合が起きている本番環境のプログラムを下手に触るとさらに被害が拡大したり、原因が迷宮入りする可能性があるため、再度のプログラム修正には非常に慎重にならざるをえなかった
■ユーザーによるコメントをできるだけ救出しようと、破損したデータベースを回復させようとしたが、何度やっても一部しか元に戻らず、時間を消費してしまった
このように数々の不手際が重なり、ユーザーの皆さまにご迷惑をお掛けし、不信感を抱かせてしまいましたこと、心よりお詫び申し上げます。
重ね重ねとなりますが、このたびは誠に申し訳ございませんでした。
現在は、原因となった不具合は修正されており、上記のような対策も完了しております。また、コメント番号設定の際のチェックを厳重にしたため、投稿いただいたコメントが反映されるまでに時間がかかる場合も出てくるようになりました。そのため、コメント投稿完了画面に、
--------------------
※コメントがすぐに反映されない場合もあります。
その場合、少し時間を置いてから
再読み込みをしてみてください。
--------------------
という文言も追記しておりますので、ご了承ください。
このたびの不具合を踏まえ、改めて不具合が出ないようできる限りチェックしたつもりではございますが、まだ何かしらのバグが残っている可能性もございます。もし、バグらしき現象を発見された方は、最下部の「お問い合わせ」から管理人にメールをお送りいただけますと幸いです。メールアドレスはinfo@girlschannel.netになります。
このたびはお忙しい中、このような長文をお読みいただきありがとうございました。また、重ね重ね、ご迷惑をおかけしてしまい申し訳ございません。
今後ともどうぞよろしくお願いいたします。