Phpstudy98

270
-1

Published on

第98回PHP 勉強会 LT発表資料

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
270
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Phpstudy98

  1. 1. AWSの最果てを見た日 第98回PHP勉強会 2016.01.27 林 正紀 @m_norii
  2. 2. About me • 林 正紀 (HAYASHI Masanori) • 1974年09月12日生 (41歳) • 埼玉生まれ埼玉育ち埼玉ふじみ野在住 • 埼玉大学/大学院・数学専攻 • 埼玉土着エンジニア • EMTG 所属 • @m_norii • http://norii.hatenablog.com/ • https://www.facebook.com/m.norii
  3. 3. http://emtg.co.jp/archives/2975 http://theyellowmonkeysuper.jp/
  4. 4. TYMS検定 • アーティストに関するクイズを50問出題 • 回答時間は30分間 • 成績優秀者には、アーティストノベルティのプ レゼントの他、SNS運営ボランティアになれる かも
  5. 5. 画面構成 TYMS検定 Q1 ・・・・・・ ○ 選択肢1 ○ 選択肢2 ○ 選択肢3 Q2 ・・・・・・ ○ 選択肢1 ○ 選択肢2 ○ 選択肢3 Q50 ・・・・・ ○ 選択肢1 ○ 選択肢2 ○ 選択肢3 回答を送信 TYMS検定 回答を受け付けました ご参加ありがとうござい ました。 DBへ登録
  6. 6. ビジネス面での要件 • ボランティアスタッフ募集については、 この検定のあと、全国で面接を行う日程も決 まっているため、やり直しが効かない 絶対に落とすわけにいかない • 各種メディアにも露出しているので、実施当日 は相当のアクセス集中が予想される
  7. 7. 技術面で取った戦略 • 限定30分間企画なので、ショットでこの企画 専用の最強サーバ群を構成する • 当然終わったら即削除 • プログラム処理はとにかく無駄を排除。軽く。 • DBも回答データは1カラムでJSON化して保存 • 回答の分析は企画終わってからやればいいので • 万一DBに保存できない時のためにローカル ディスクにも回答保存 • それでも落ちた場合用にメールでの投稿受付も 準備
  8. 8. テーブル定義 • 回答データは1カラムにJSON化して保存 CREATE TABLE `certification` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `answer` mediumtext NOT NULL COMMENT '回答', `created_time` datetime NOT NULL COMMENT '作成日', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
  9. 9. 投稿データ登録プログラム(抜粋) <?php $answer = json_encode($_POST); //ログへ書き込み list($usec, $timestamp) = explode(' ', microtime()); $logPath = sprintf('%s%s%s.txt', LOG_DIR, date('YmdHis', $timestamp), substr($usec, 2)); file_put_contents($logPath, $answer . PHP_EOL); //DBへ書き込み $dsn = sprintf('mysql:dbname=%s;host=%s', DB_NAME, DB_HOST); $sql = sprintf("INSERT INTO %s (answer, created_time) VALUES (:answer , :created_time)", TABLE_NAME); try { $pdo = new PDO($dsn, DB_USER, DB_PASS); $stmt = $pdo->prepare($sql); $stmt->execute([':answer' => $answer, ':created_time' => date('Y-m-d H:i:s', $timestamp)]); } catch (Exception $e){ file_put_contents(ERROR_LOG_PATH, $e->getMessage() . PHP_EOL, FILE_APPEND); } //受付完了ページへリダイレクト header('Location: https://example.com/done');
  10. 10. サーバ構成 暖気申請 Failover時は S3静的ホスティングで メール投稿で受付け R3.4xlarge 10台 16 vCPU メモリ122GiB Db.m4.10xlarge 40 vCPU メモリ160GiB
  11. 11. 結果 • 企画は30分間、滞り無く完了 • Web、DBとも負荷は余裕でさばいた
  12. 12. しかし実はその裏で AWSの最果てを見た男がいた
  13. 13. 17:00 専用環境構築開始 19:00 RDSを検証用のスペックから db.m4.10xlarge へ変更 20:00 ????????????? 20:30 ????????????? 21:00 ????????????? 22:00 すべてのサーバ設置完了 23:00 TYMS検定開始 当日のタイムテーブル
  14. 14. RDSインスタンスクラス変更 変更中
  15. 15. 1時間後
  16. 16. 変更中
  17. 17. 変わってない… ネットで調べる限り インスタンスクラス変更は5分程度で終わるはずなのに・・・
  18. 18. AWSサポートに問い合わせる
  19. 19. 17:00 専用環境構築開始 19:00 DBサーバを検証用のスペックから db.m4.10xlarge へ変更 20:00 DBサーバのスペックアップが完了しないため、 AWSサポートへ連絡 20:30 ???????????????????? 21:00 ???????????????????? 22:00 すべてのサーバ設置完了 23:00 TYMS検定開始
  20. 20. 30分後 AWSサポートから 回答がきた
  21. 21. キャパシティ枯渇
  22. 22. 17:00 専用環境構築開始 19:00 DBサーバを検証用のスペックから db.m4.10xlarge へ変更 20:00 DBサーバのスペックアップが完了しないため、 AWSサポートへ連絡 20:30 AWSから「db.m4.10xlargeのリソース枯渇」の連絡 21:00 ???????????????????? 22:00 すべてのサーバ設置完了 23:00 TYMS検定開始
  23. 23. スナップショットから復元 • とのことなので、スナップショットから db.r3.8xlargeに変更して復元
  24. 24. 17:00 専用環境構築開始 19:00 DBサーバを検証用のスペックから db.m4.10xlarge へ変更 20:00 DBサーバのスペックアップが完了しないため、 AWSサポートへ連絡 20:30 AWSから「db.m4.10xlargeのリソース枯渇」の連絡 21:00 検証DBのスナップショットから復元、 db.r3.8xlargeで再立ち上げ 22:00 すべてのサーバ設置完了 23:00 TYMS検定開始
  25. 25. 教訓 • AWSといえど、リソースは無限じゃない • ショットでサーバ強くするにしても 最低でも1日前から準備したほうが身のため • AWSサポートには入っとけ (本当にありがとうございました)
  26. 26. エンジニア募集中! http://emtg.co.jp/recruit
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×