トラブル☆しゅーたーず#02 ~あいつがまたやらかした~ on Zusaarに参加してきました。
とても勉強になりましたが、まずは課題の複数を環境があるうちに試してみましたので、手順を紹介します。
復習してみた自分なりのオペレーション手順
1. ローバランサーから EC1/2 をはずして、Sorry ページ(メンテナンス中)をすぐに表示する
=> メンテナンス中の旨とこれから対策を実施することをお客様に報告する
2. Nifty Cloud カスタム – プライベートから「EC1Backup」からサーバを作成する(バックアップの作成日時が「2012/06/02 11:13:19」であるのに対して、既存の EC1 の作成日時が「2012/06/02 09:01:43」であることからEC1Backupはちゃんとしたバックアップであることが分かる)、なお作成したサーバ名は EC3 としておく
3. EC3 を起動すると、そうすると Nginx が起動するという罠があるので Nginx を停止して Apache を起動する
EC3# /sbin/service nginx stop
EC3# /sbin/chkconfig nginx off
EC3# /sbin/service httpd start
EC3# /sbin/chkconfig httpd on
4. リニューアルサイト用のバックアップをとってから、/var/www へ展開する
EC3# cd /var/www
EC3# mv data1 data1-old
EC3# mv site site-old
EC3# cp /root/files/20120602renewal.tar.gz .
EC3# tar zxfv 20120602renewal.tar.gz
5. Apache の設定をすこし変更してから、Apache を再起動する
EC3# vi /etc/httpd/conf/httpd.conf
空の VirtualHost をコメントする
ecX.sotm.jp の VirtualHost に「ServerName test.sotm.jp」を追加する
EC3# /sbin/service httpd graceful
6. 自分の PC の /etc/hosts を書き換えて、test.sotm.jp にアクセスできるようにする
7. ブラウザから test.sotm.jp を閲覧して、サイトの内容がおかしいことを確認する
8. 原因はデータベースが古いことが原因なので、mysqlに接続する(データベースサーバは EC3 ではなく EC1 なので注意すること)
EC1$ mysql -u root -h localhost -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
9. すべてのデータベースが閲覧することができない、原因は root ユーザの localhost に対するアクセス権限がないのが原因なので、127.0.0.1 で接続する
EC1$ mysql -u root -h 127.0.0.1 -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
...
(略)
...
10. 念のため、root ユーザの localhost に対するアクセス権限を復活させておく
mysql> GRANT ALL PRIVILEGES ON *.* To root@localhost;
mysql> flush privileges;
11. サイトの表示内容がおかしいのは、データベース名の設定がおかしいことが原因なので、設定を変更する
$ cd /var/www/data1
$ vi config/config.php
10c10
< define ('DB_NAME', 'ec_2012');
---
> define ('DB_NAME', 'eccube_new');
12. ブラウザでリロードして、正しく商品画像などが表示されることを確認する
13. 商品をかごに入れるとEC-Cubeからシステムエラーが発生することを確認する、原因は設定ファイルのURLが違っていることが原因なので修正する(DEBUG_MODE を有効にすると、便利かもしれない)
$ vi config/config.php
3,4c3,4
< define ('HTTP_URL', 'http://ecun.sotm.jp/');
< define ('HTTPS_URL', 'http://ecun.sotm.jp/');
---
> define ('HTTP_URL', 'http://test.sotm.jp/');
> define ('HTTPS_URL', 'http://test.sotm.jp/');
14. 正しくカートに追加できること、/admin以下にアクセスして管理者でログインできることを確認する
15. ロードバランサーに、EC3 のみを追加して、サービスを再開させる(その際に test.sotm.jp は本番の URL に書き直すことを忘れずに!)
=> お客様に不具合が解消されたこと、サービスを再開させたこと、負荷対策を実施する旨(あわせてコストがかかること)を事前に連絡する
16. 次に負荷対策に移行する、今回は EC Cube という PHP 製のプログラムのため、次のような構成をとるとよいと思われる、負荷対策までプログラムなどをチューニングしている時間はないのでサーバを増やすことで暫定対処する。
EC3# /sbin/service mysqld stop
EC3# /sbin/chkconfig mysqld off
EC3# /sbin/service iscsi stop
EC3# /sbin/chkconfig iscsi off
EC3# /sbin/service iscsid stop
EC3# /sbin/chkconfig iscsid off
EC3# /sbin/service yum-updatesd stop
EC3# /sbin/chkconfig yum-updatesd off
EC3# vi /etc/httpd/conf/httpd.conf
<IfModule prefork.c>
StartServers 40
MinSpareServers 40
MaxSpareServers 40
ServerLimit 40
MaxClients 40
MaxRequestsPerChild 4000
</IfModule>
17. EC3 をシャットダウンして、EC3 をイメージ化してオートスケールするように設定する(これには10〜20分くらい時間を要する)
18. EC1(Apache を落として、MySQ Lのみにして InnoDB まわりを軽くチューニングをする)
19. EC3 のコピーサーバ EC4 を作成して、ロードバランサーに追加して問題がないかどうかチェックする
20. EC3 を起動させて、オートスケールの設定を行う
=> 負荷対策が完了したことをお客様に報告する
その他、次の事項を提案する
- 今度、同じような問題が発生しないための提案をする
- 管理画面、カートなど個人情報を扱う部分のセキュリティを強化する(管理画面は ADMIN_FORCE_SSL を有効にすればよいと思われる)
今回のトラしゅを振り返ってみての反省は、次のとおりです。
- チームの中で比較的作業ができる人たちでがんがん作業しまった結果、チーム全体として大きな成果を出すことができなかった
- お客様にとっても「最大の問題点」をすぐに把握することができず、最初のメンテナンス画面を表示するのに、たしか二時間ほどかかってしまった
- クラウドの場合、サーバを捨てることで対策が早くできる場合があるので、まずサーバを捨てることができるか検討すれば良かった
- EC Cube というよく分からないプログラムの調査にかなりの時間がかかってしまった、この作業は僕が全部やってしまったけれど、みんなで分担してやれば良かった
- 最終的な負荷対策まで、とても手が回らなかった、最初の不具合が治った時点で、負荷対策をどうするべきか検討に入るべきだった
- お客様の立場になって、お客様と密接に情報の共有ができなかった(僕はひたすら治すことに集中してしまったし、時間がないなかで落ち着きがなくなってしまった、深呼吸本当に大事・・・)
というわけで、チーム5の皆さん、ありがとうございました!!!
また、会場や環境を提供してくださいましたニフティの皆さん、スタッフの皆さん(スタッフの皆さんは徹夜で作業されたようです・・・大変お疲れ様でした)、ありがとうございました!!!
第三回目も何らかの形で協力ができる機会があればいいなぁと思いました。次回参加する機会があれば、もっと積極的にチームでコミュニケーションをとるようにリーダーをやってみたいと思いました!
Tags: study