Lv1から始める Webサービスのインフラ構築 2014-09-09 AWS Cloud Storage & DB Day 株式会社マイネット 伊藤 祐策.

Slides:



Advertisements
Similar presentations
プロジェクト名称 Inception Deck (Project Charter) 201X.XX.XX.
Advertisements

マイクロソフトがホスティングする拡張性に優れたサービス ベース アプリケーション プラットフォーム.
IBM SmarterCloud Control Desk 7.5 新機能ガイド - 資産と構成アイテムの同期
7-1.WEKOコンテンツ 一括登録 マニュアル Version2.5
4 相互作用図 後半 FM13001 青野大樹.
4.ユーザー登録マニュアル              Version 年6月10日 国立情報学研究所.
相互作用図 FM11010 田中健太.
安全なログオン手順 2004/08/26 Port139 伊原 秀明.
DB(データベース)のおはなし 作成者:小野正広 DBと言っても、  ドラゴンボール ではないですぞ! 3/1/2017.
リレーショナル・データベース データベース論 第10回.
Skypeの使い方 ス  カ  イ  プ ア ン ド ロ イ ド Android版.
WordPressの基礎.
IGD Working Committee Update
Accessによるデータベース(3) Ver /11.
IM、プレゼンス、連絡先 IM 要求に応答する プレゼンスを設定または変更する ユーザーを検索する
5.WEKOコンテンツ登録 準備 マニュアル Version 2.1
SQL J2EE I 第3回 /
DBバックアップあーんどリカバリ HN おいろん.
DBバックアップあーんどリカバリ HN おいろん.
技術トピックス 2014/08.
クイズ 「インターネットを使う前に」 ネチケット(情報モラル)について学ぼう.
バージョン管理超入門 まだファイルコピーしてます?
稚内北星学園大学 情報メディア学部 助教授 安藤 友晴
F5 を押すか、または [スライド ショー] > [最初から] をクリックして、コースを開始してください。
第6章 トランザクション管理 6.1 トランザクションの概念 6.2 同時実行制御 6.3 障害回復.
IM、プレゼンス、連絡先 IM 要求を受け入れる Lync 2013 クイック リファレンス プレゼンスを設定または変更する ユーザーの検索
RDBMSについて 2年7組  小鹿 慎太郎.
第7章 データベース管理システム 7.1 データベース管理システムの概要 7.2 データベースの格納方式 7.3 問合せ処理.
Web上で管理・利用できる 面接予約データベースシステムの構築
(B2) 親: minami, kazuki 多様な認証機器に対応する 認証システム (B2) 親: minami, kazuki.
SAP & SQL Server テクニカルアーキテクチャ概要 マイクロソフト株式会社 SAP/Microsoft コンピテンスセンター
14.テーブル定義,一対多の関係,多対多の関係, 外部キー,索引(インデックス),データベース操作
現金に替わる電子マネーの実装 200702894 大城 翔太 木下研究室.
情報 第2回:状態遷移 その2.
マイクロソフト Access を使ってみよう 第1回
マイクロソフト Access での SQL 演習 第1回 SQL問い合わせ(クエリ)
マイクロソフト Access を使ってみよう 第4回
ファイアウォール 基礎教育 (2日目).
15.同時実行制御,トランザクション, データベースの回復
2004年度 サマースクール in 稚内 JavaによるWebアプリケーション入門
  情報に関する技術       情報モラル授業   .
Copyright © 2014 JOPS AWS Working Group, All rights reserved.
Riakデータベース on SoftLayer
新たなバックアップソリューション「クローン機能」はここがスゴイ 新たなバックアップ方法「クローン機能」なら全て解決!
新たなバックアップソリューション「クローン機能」はここがスゴイ 新たなバックアップ方法「クローン機能」なら全て解決!
VM専用仮想メモリとの連携による VMマイグレーションの高速化
仮想メモリを用いた VMマイグレーションの高速化
すぐできるBOOK -基本設定編-.
gate-toroku-system のしくみ
3-3.テーブルを更新する 2004年 4月22日(木) 01T6074X 茂木啓悟.
G Suite導入ガイド Ver1.3.
中国の日系企業に最適のシステム 御社の業務に最適な3つの理由 初期投資なしで すぐに始められる ITに詳しい 担当者不要 何度でも 変更可能.
すべて読む Microsoft SharePoint ニュース
PaaSの起源.
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
gate登録システム: 設計ポリシーから使い方まで
データベースシステム入門 10.データウエアハウス
修士研究計画 CGM作成・共有支援基盤(仮)の構築
本当は消去できていない!? ~データを完全消去する方法~
本当は消去できていない!? ~データを完全消去する方法~
リレーショナル・データベース J2EE I (データベース論) 第2回 /
常設チャット トピック フィードを作成してアクティビティをフォローする Lync 2013 クイック リファレンス
CO-Client Opeartion 1.1 利用履歴データベースの設計 (スキーマ バージョン 対応)
アルゴリズム入門 (Ver /10/07) ・フローチャートとプログラムの基本構造 ・リスト ・合計の計算
モグラたたき.
IPmigrate:複数ホストに分割されたVMの マイグレーション手法
より分かりやすい ユースケースモデルを作る
サーバーレス キャンペーンインフラご提案 特徴 料金 初期費用 0円 月額 120,000円 初期費用 0円 月額 380,000円
gate-toroku-system のしくみ
Presentation transcript:

Lv1から始める Webサービスのインフラ構築 AWS Cloud Storage & DB Day 株式会社マイネット 伊藤 祐策

自己紹介 名前 伊藤 祐策 勤務先 株式会社マイネット 肩書 アーキテクト 事業内容 スマートフォン向けゲームの開発・運営 お仕事内容 ・自社ゲームタイトルのサーバーインフラ構築 ・アプリケーション開発 ・主にサーバーサイド設計(特にDB設計!)

自己紹介 大好きなAWSサービスは? 1位.Amazon DynamoDB 2位.Amazon S3 3位.Amazon CloudFront

自己紹介 まあでも青いアイコンのサービスはだい たい大好きです。

今日のお話はこんな人におすすめ Webサービスを作って スタートアップしたい人 ユーザー数1人から100万人までをAWSで!

もくじ 第一部 Lv1から始めるWebサービス 第二部 スケーラブルな構成にするには? 第三部 DynamoDBの正しい使い方

第一部 Lv1から始めるWebサービス

シナリオ あなたはとあるWeb系会社のエンジニアです。 ある日、社長が突然こんなことを言い出しました。 「我が社もソーシャルゲーム事業に参入するぞ!」 一瞬目眩がしましたが、あなたは覚悟を決めてシス テム設計を開始しました・・・。 ※このシナリオは全てフィクションです

シナリオ サービスリリースまでのステップ 1. アプリケーション開発 2. 社内アルファテスト(ユーザー数10人) 3. ベータテスト(同500人~???) 4. 正式オープン(同1万人~???)

シナリオ 先輩社員の助言によりAWSを採用することは決定し ましたが、あなたはAWSは全くの未経験でした。 そこでまずはAWSのアカウントを取るところから始 めることにしました。 【最初の目標】 アルファテスト用の環境を構築する

Step1 アカウント取得 AWSアカウントを取得する ★ここがポイント 必ず2アカウント用意しよう! ・本番環境用アカウント ・開発環境用アカウント(兼試験環境) テストや訓練に費用を惜しまないこと!

Step2 IAM IAMで子アカウントを作成する グループは以下の2種類を作る ・AWSコンソールにアクセスする「人間ユーザー」 → Administratorテンプレートをそのまま使う ・アプリケーションユーザー → 必要最低限のアクセス権限だけを付与する ※IAMを作ったらrootアカウントは封印しましょう

Step3 VPC VPCを構築する サブネットとゲートウェイを作成して関連付ける ★ここがポイント ・サブネットは適切に切る(後述) ・"Auto-Assign Pulibc IP"をONにする → EIPを使う数を節約できる

Step3 VPC サブネットはこんな分割方法がオススメ /17 ← まずは半分をAZ-aに /18 ← 残りを半分をAZ-cに /19 ← さらもう半分をAZ-a に 領域を使いきってしまうとあとで困る!

Step4 セキュリティグループ セキュリティーグループを構築する サーバーの役割種別ごとにセキュリティーグループ を1個作る。 【例】 ・Webサーバー 外部から80番、443番。内部から22番。 ・RDS(MySQL)サーバー 内部から3306番。

Step5 EC2 EC2インスタンスを作成する ★ここがポイント ・配置先AZに気をつけて! → リザーブドインスタンスを買う時に困る → たまにインスタンスタイプが枯渇する ※AWSの営業の人に相談しよう ・セットアップが完了したらAMIをとっておこう!

Step6 EIP EIPを取得する 外部に公開するインスタンスのENIにアタッチする。 ★ここがポイント ・EIP取得数の制限に注意!(申請で解除可能) ・インスタンスタイプ別にも関連付け可能数の制限 がある

Step6 EIP 必要なEIPはいくつ? 1個目 一般公開サイト用 2個目 運営管理サイト用 3個目 メール配信サーバー用 4個目 SSHゲートウェイサーバー用 だいたい4個もあれば十分なのです!

Step7 Route53 Route53でゾーン設定をする 取得したEIPをホスト名登録する ★ここがポイント ・メール送信するときはSPFの設定を忘れずに! ・さらにEIPに対するメール送信制限解除申請も必 要なので一緒に済ませておこう!

システム構成図(Lv1) t2.micro PHP MySQL 約 2,000 円 / 月

シナリオ アプリケーションも完成に近づき、いよいよ一般 ユーザーへサービスを公開することにしました。 しかし先輩社員はこんなことを言いだしました。 「この構成でインスタンスタイプ 上げるだけじゃダメなの?」

問題 この構成のままインスタンスタイプを上 げるだけでは商用環境としてダメな理由 を答えなさい。

解答 データの保全性が確保されてい ないから。

Webサービスとは サービ ス アプリ ケーショ ン データ + = Web サービスは「生き物」です!

保全性について 「アプリケーション」は subversionやgithub等にマス ターがあるので保全性が確保さ れている。

保全性について 一方「データ」はEC2のEBS上に あるのである日突然失われる可 能性がある。 データが消失 → サービス終了!

商用環境の最低ライン 「隕石が直撃しても大丈夫」 データセンターが1つ壊滅して もサービスを復旧できること。

システム構成図(商用Lv1) 約 10,000 円 / 月 db.m1.small t2.small Multi-AZ 配置 EIP AMI 同期

システム構成図(商用Lv2) 約 13,000 円 / 月 db.m1.small t2.small ログ出 力 Multi-AZ 配置 EIP AMI S3 ELB 同期

データセンター 隕石 ちょっと隕石当ててみましょう

システム構成図(隕石直撃前) db.m1.small t2.small ログ出 力 Multi-AZ 配置 EIP AMI S3 ELB 同期

システム構成図(AZ壊滅後) db.m1.small t2.small ログ出 力 Multi-AZ 配置 EIP AMI S3 ELB 同期

問題 以下のAWSストレージ系サービスうち、 デフォルトでデータの保全性が確保され ているものはどれか? S3 EBS DynamoDB RDS Multi-AZ ElastiCache

解答 以下のAWSストレージ系サービスうち、 デフォルトでデータの保全性が確保され ているものはどれか? S3 EBS DynamoDB RDS Multi-AZ ElastiCache

まとめ 「大事なデータ」は保全性が確 保されているストレージサービ スに保存しましょう。 データさえ生き残っていれば サービスは何度でも蘇ります!

この式は見覚えありますよね? MTBF MTBF + MTTR A = A 可用性 MTBF... 平均故障間隔 MTTR... 平均復旧間隔

まずはMTTRを∞にしない保証を作ること MTBF MTBF + MTTR A = A 可用性 MTBF... 平均故障間隔 MTTR... 平均復旧間隔 コレの件 ・・・というお話でした。

質問タイム 2分ほど休憩

第二部 スケーラブルな構成にするには?

シナリオ 保全性の確保された構成の構築方法はわかったので すが、この「商用Lv2」の構成ではベータテストの 負荷には耐えられそうにありません。しかし、ベー タテストでは何人のユーザーが押し寄せるのか全く 検討もつきません。 【次の目標】 想定以上の負荷が来ても すぐに対応できる環境を構築する

用語おさらい 「スケーラブル」とは? 1. 増大する負荷に容易に対応できる 2. 負荷に合わせて自動的に拡張される

用語おさらい 「スケーラブル」とは? 1. 増大する負荷に容易に対応できる ↑こっちの話をします 2. 負荷に合わせて自動的に拡張される ↑これはややこしいのでまた今度...

用語おさらい スケールアップ ノードの性能を上げること =インスタンスタイプを上げること スケールアウト ノードの数を増やすこと = インスタンスを追加すること

理想パターン ・EC2インスタンスを追加すると全体性 能があがる。 ・RDSのリードレプリカを増やすと全 体性能があがる。 ・DynamoDBの性能予約を買い足すと 全体性能があがる。

将来が不安なパターン ・インスタンスタイプを上げると全体性 能があがる。 ・EBSのIO性能を上げると全体性能が あがる。 → コスト効率が悪くなる → 性能拡張に上限がある

つまりこういうこと スケールアウトできる形にする スケールアップで全体性能があがるのは当たり前!

スケーラブルな構成(基本形) EC2 書き込み EC2 マスター DB リードレプリ カ ELB 読み込み

スケーラブルな構成(基本形) EC2 書き込み EC2 リードレプリ カ 読み込み マスター DB ELB CPU 負荷 DB 読み込み負荷 DB 書き込み負 荷 スケールアウ ト スケールアッ プ

サーバー負荷の傾向と対策 ボトルネックになるのは いつだってデータベース負荷 マスター DB \もう限界/

各種ストレージサービス解説 Amazon RDS フルマネージドリレーショナルDB Amazon DynamoDB フルマネージドKVS型分散DB Amazon ElastiCache ただのキャッシュサーバ

Amazon RDS ここがすごい! ・メンテナンスフリー! 自動的に定期バックアップ AZ間でレプリケーション ※Multi-AZ配置時 ・リードレプリカをボタン1発で作成! 読み込み性能を簡単スケーリング

Amazon RDS ここは注意! ・一度起動すると止められない 稼働停止=データ削除 EC2のように休止ができない ・スケールアップ時にアクセス不可になる だいたい10分~30分くらい メンテナンスモード必須

リレーショナルDB特有の問題 マスターDBへの負荷は どうあがいてもボトルネックになる。 書き込み処理が激しいアプリケーションでは いずれ限界が・・・。...しかしそこへ救世主が登場!

Amazon DynamoDB ここがすごい! ・メンテナンスフリー! ・すごい耐障害性 ※3箇所以上に分散保存 ・性能予約課金 ・動的な性能調整が可能 ・負荷による性能劣化を起さない

Amazon DynamoDB Amazon DynamoDBは マスターDBへの書き込み負荷が ヤバい時の救世主!?

Amazon DynamoDB ここは注意! ・ 一貫性のあるバックアップを動的にとれない 「一貫性」か「動的」のどちらかを諦める ・性能上限に達すると一時的にアクセス不可になる ちょっと余裕を持って予約する必要がある ・単純な機能しかない 集計とかは無理です

Amazon DynamoDB どう使うか? 負荷分散のための補助データベースとして使う NoSQL初心者にはこちらがオススメ。 メインデータベースとして使う 鬼門。死ヲ覚悟セヨ。 (※第三部で解説)

Amazon ElastiCache ここがすごい! ・とにかく速い ※中身はただのMemcachedです。 ※でも最近Redisも対応しました!

Amazon ElastiCache どう使うか? ・大事なデータの格納はNG ・ストレージの読み込み負荷を軽減 させるためのキャッシュとして使う

まとめ スケールアウト可能な構成をがん ばって構築しましょう。 しかし、それでもいつかはマスター DBの負荷が限界にくることでしょ う。

質問タイム 2分ほど休憩

第三部 DynamoDBの正しい使い方

シナリオ 無事リリースされたサービスは幸運にも大ヒットし、 ユーザー数を急速に伸ばしていきました。しかしマ スターDBの負荷は増大し、インスタンスタイプを db.r3.8xlarge まで上げたのにも関わらず性能の限界 が来てしまいました。そこであなたが決断した最後 の手段とは・・・。 【次の目標】 DynamoDBを使ってピンチを乗り切る

Amazon DynamoDBとは何か ・分散データベースである。 ・Key Value Storeである。 ・NoSQLである。 ・スキーマレスである。 ・フルマネージド型サービスである。

Amazon DynamoDBの特徴 ・ハッシュキーを基に負荷が分散される。 ・読込性能、書込性能それぞれの予約し た性能量に対して課金される。 ・1レコードは64kBまで格納可能。 ※キー名も容量に含まれるので注意

使い方別難易度 【Easy】 ユーザー単位で独立しているデータだけを DynamoDBに移行して補助的に使う。 【Nightmare】 全てのデータをDynamoDBに載せてメイン データベースとして使う。RDSは補助データ ベースとして使う。

テーブル設計の勘所 ★ここがポイント テーブル設計は プライマリーキーの設計が命

プライマリキー設計 プライマリキーの仕様 ・プライマリキーの形式は2種類から選べる 1. ハッシュキーのみ 2. ハッシュキー + レンジキー ・処理の分散はハッシュキーによって行われ る ・レンジキーでのみ範囲検索が可能

プライマリキー設計 設計例 1 ユーザー固有情報 HashKey : ユーザー ID RangeKey : なし ・アカウント情報 ・プロフィール情報

プライマリキー設計 設計例 2 ユーザーの対ユーザー関係 HashKey : ユーザー ID RangeKey : 対象ユーザー ID ・フォロー ・ブロック

プライマリキー設計 設計例 3 ユーザーの行動履歴 HashKey : ユーザー ID RangeKey : ログ ID ・ゲーム内アイテムの購入 ・攻撃コマンドの実行 ・ etc

ログIDの作り方 ・ログの発生時刻から文字列で生成する。 ・乱数も混ぜるといいかも。 ・万が一衝突したらもう一度トライ。 例: " " ※桁数は固定しましょう

プライマリキー設計 設計例 4 ユーザーの所有オブジェクト HashKey : ユーザー ID RangeKey : オブジェクト ID ・所有カード ・投稿記事 ※オブジェクト ID はログ ID と同じ方法で 生成

プライマリキー設計 設計例 5 ユーザー間関係情報 HashKey : ユーザー ID+ 対象ユーザー ID RangeKey : なし ・フレンド ※ユーザー ID は小さい方を先にする

シナリオ マスターDBへ一番書き込んでいたのは実は ユーザーの行動履歴でした。そこで、ユー ザー行動履歴をDynamoDBに移行させたと ころ、大幅に書き込み負荷が減って無事ピン チをのりきりました。めでたしめでたし。 おしまい ※面倒くさいのでここでシナリオは打ち切りです

鬼門の入口 ここからはNightmareモードです。

リレーショナルDBの限界 レコード同士の整合性を保証する代償として、複数 のノード上で処理を分散できないという制約を受け ている。 整合性の保証

分散データベースの特徴 レコード同士の整合性を解消し、複数のノードで処 理を分担できるようにしたのが分散DB。 整合性の解消

整合性保証を失うということ 要するに 「トランザクション」 が使えなくなる

トランザクションが使えないということ 同時に2つ以上のレコードを 整合性をたもったまま 更新することができない

トランザクションがないとこうなる 100ゴールドする薬草を買います。 所持金 1,000 G 薬草 0 個0 個

トランザクションがないとこうなる 所持金を -100 します。 所持金 900 G 薬草 0 個0 個 -100

トランザクションがないとこうなる 薬草を +1 します。 所持金 900 G 薬草 1 個1 個 +1

トランザクションがないとこうなる ・・・がしかし、通信障害が発生 して更新に失敗してしまいました。 所持金 900 G 薬草 0 個0 個 +1

もし整合性保証があれば・・・ ロールバックしてしまえば所持 金も元に戻るのでユーザーの被 害はない。つまり、 ALL or Nothingが保証されている

ではどうするのか? アプリケーション側で トランザクションを実装する そりゃ鬼門と言われても仕方がないですね

トランザクションの構図(RDBMS) アプリケーション MySQL テーブル トランザクション

DynamoDB トランザクションの構図(DynamoDB) アプリケーション テーブル トランザクション

トランザクションの作り方 ・更新処理の開始から完了までを1つのトラ ンザクションと捉える。 ・各レコードの更新には楽観的ロックを用い る。 ・全ての更新処理に冪等性を持たせる。 ・処理の途中で失敗したら最初からやりなお す。 ・結果が収束するまで何度もやりなおす。

用語解説 楽観的ロック 【意味】読み込んだレコードを更新する とき、他の並行プロセスによって変更が されていないことを期待して更新をする 方式。 並列性を高めるためにとても重要な概念

用語解説 CAS操作 【意味】 Compare and Swap の略。更新対 象のレコードの状態が期待した状態のと きのみ更新を実行し、そうでない場合は 何もしない操作。 楽観的ロックに必要な概念

CAS操作をSQLで表すと UPDATE user SET status=1,updated_at=NOW() WHERE id=100 AND status=0 ※初期状態は status=0 とする。

用語解説 冪等性 【意味】ある操作を 1 回行っても複数回 行っても結果が同じであること。 整合性を確保するためにとても重要な概念

冪等性のある処理の作り方 処理済? CAS で 更新 完了 開始 更新失敗 読込 更新成功 NO YES

冪等性のある処理の作り方 冪等性の確保された処理はいくつ連結し ても冪等性を保てる。 function() ✔ ✔

実装例 更新依頼書 ID:123 所持金 : -100 薬草 : +1 所持金 1,000G 薬草 0 個 レコードを準備

実装例 更新依頼書 ID:123 所持金 : -100 薬草 : +1 所持金 900G -100 ID:123 薬草 0 個 所持金を更新

実装例 更新依頼書 ID:123 所持金 : -100 薬草 : +1 所持金 900G ID:123 薬草 1 個 +1 ID:123 薬草の数を更新

実装例 更新依頼書 ID:123 所持金 : -100 薬草 : +1 状態:完了 所持金 900G ID:123 薬草 1 個 ID:123 完了済みにする

実装例 更新依頼書 ID:123 所持金 : -100 薬草 : +1 状態:完了 所持金 900G 薬草 1 個 掃除して完了

SQSと組み合わせて使う 1. 依頼書をレコードとして作る 2. SQS へ依頼書 ID が書かれたメッセージを発 行 3. バックグラウンドで SQS からメッセージを 受け取り、結果が収束するまで何度も実行す る。

全体フローチャート 依頼書 作成 完了 開始 キュー 発行 開始 冪等処理 完了 エラー発生

ロールバック処理 更新依頼書 ID:123 所持金 : -100 薬草 : +1 所持金 1,000G 薬草 0 個 レコードを準備

所持金 1,000G ロールバック処理 更新依頼書 ID:123 所持金 : -100 薬草 : +1 薬草 99 個 +99 別の並行処理が邪魔をする

ロールバック処理 更新依頼書 ID:123 所持金 : -100 薬草 : +1 所持金 900G -100 ID:123 薬草 99 個 所持金を更新

ロールバック処理 更新依頼書 ID:123 所持金 : -100 薬草 : +1 所持金 900G ID:123 薬草 99 個 +1 上限エ ラー 薬草の数を更新

ロールバック処理 更新依頼書 ID:123 所持金 : -100 薬草 : +1 状態:失敗 失敗済みにする 所持金 900G ID:123 薬草 99 個

ロールバック処理 更新依頼書 ID:123 所持金 : -100 薬草 : +1 状態:失敗 所持金 1,000G +100 薬草 99 個 所持金を戻す

ロールバック処理 更新依頼書 ID:123 所持金 : -100 薬草 : +1 状態:失敗 薬草の数も一応処理 所持金 1,000G 薬草 99 個

ロールバック処理 更新依頼書 ID:123 所持金 : -100 薬草 : +1 状態:失敗 完了(状態収束) 所持金 1,000G 薬草 99 個

まとめ 分散DBをメインDBとして使う場合、 トランザクションの再実装をしなけ ればいけないので大変。 しっかりフレームワークを組んでか ら挑むことを強く推奨。

質問タイム お疲れ様でした