久しぶりのでかいトラブル

商用サーバーのバックヤードとの同期処理が失敗してた。

現象

サービスで使ってるデータベースには供給元からのクローンが含まれていて、これを日時で同期かけてる。
それが何故か昨日から同期処理に失敗するようになった。
それが原因で、最新のデータがサイトに反映されずあわやクレーム直前に。

とりあえず

バックアップされてるインスタンスへの同期は成功しているようなので、フロントラインから繋げるデータベースをバックアップ側に切替えて運用。
ここまでが昨日の18:00までの出来事。

原因追求

  • 同期処理の構造はフロントラインのPHPでトリガーを受けて、データベース鯖のストアドプロシージャで定義されてる同期処理をキックする。
  • その結果正常終了した場合はcommitを発行して、トランザクションを完了する。

バックアップサーバーはこの処理をPHP起動じゃなくて、シェルスクリプト起動になってる。
怪しいのはPHPか?

原因追求 その2

フロント鯖のプロセスリストを見るとPHPのプロセスが残ってた。
STATEはtcp_data。なんじゃこりゃ。
対するデータベースのセッションリストを見るとphpで確立してるはずのセッションがいない。
ぬう。

原因追求 その3

実行ログを見ると同期処理のストアドは実行された模様。
でも、終了のログが無いからストアドの完了待ちでプロセスが止まってるようだ。

・・・ナニコレ。

気になる点

  • プロセスのステータスがtcp_data
  • データベースサーバーのセッションは空
  • シェル起動のバックアップ鯖は正常に処理が終了してる。

ピコーン

フロントエンド-DB間のファイアーウォールで無通信時間が閾値を越えたセッションは強制終了させてたな。

対応

同期用の巨大なストアドを分割してphpからちまちま叩くように変更。
こうすればちまちま通信されるから止まらなくなる(ハズ)

結果

あー疲れた。