50
Docker だらけの FRESH! 動画配信 プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers Conference @stormcat24 / CyberAgent, Inc.

Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Embed Size (px)

Citation preview

Page 1: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Dockerだらけの FRESH!な 動画配信プラットフォーム

2016/06/03 AWS Summit Tokyo 2016 Developers Conference

@stormcat24 / CyberAgent, Inc.

Page 2: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

stormcat24

‣ Akinori Yamada ‣ CyberAgent, Inc. / AbemaTV, Inc. ‣ Technical Engineer ‣ http://blog.stormcat.io ‣ AmebaFRESH! ⇒ AbemaTV FRESH!

Page 3: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Agenda‣ FRESH!とは

‣ 配信プラットフォームとして目指した価値

‣ Microservices

‣ FRESH!とDocker

‣ DockerとAmazon EC2 Container Services でのサービス構成パターン

‣ Blue Green Deployment

‣ Dockerを検討されている皆様へ

Page 4: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

AbemaTV FRESH!とは‣ 4/1にAmebaFRESH!から名称変更

‣ ※AbemaTV(無印)とは別のサービスです

‣ 生放送配信プラットフォーム

‣ 現在約500チャンネル、様々なコンテンツプロバイダー(配信主)が利用。年内1,000チャンネルまで拡大予定

Page 5: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers
Page 6: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers
Page 7: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

FRESH!のサービス特性‣ 24時間いつでも、常に何かしらの配信がされている

‣ 放送しっぱなし定点カメラもあり

‣ 配信主はいつでも配信可能

‣ テレビとは違い、番組編成をサービス側でコントロールできるものではない

Page 8: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

配信プラットフォームとして 目指した価値とは?

Page 9: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

答え 可用性とスケーラビリティ

Page 10: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

高い可用性‣ サービス全停止でのメンテナンスを極力しない

‣ デプロイによるダウンタイムを作らない

‣ 仮に一部分が障害を起こしても、動画配信・視聴というユーザーにとっての絶対的主目的は守りぬく

動画配信+視聴が24時間365日 いつでも行えるプラットフォームを目指す

Page 11: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

スケーラビリティ‣ 人気番組・特番時のキャパシティ不足、視聴品質劣化を起こさない

‣ 容易にスケールできるシステム構成であること(スケールデメリットがある構成は避ける)

どんな人気コンテンツでも 誰もが等しく快適に視聴できること

Page 12: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

目指すべき価値の解‣ Microservices

‣ Docker + Immutable Infrastructure

‣ Blue Green Deployment

Page 13: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Microservices‣ システムを解決すべきドメイン領域によって切り分けるパターン

‣ FRESH!の例(一部)

‣ User API

‣ Broadcast

‣ Chat

‣ Timeline

‣ Tracking

Page 14: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Microservicesと可用性‣ Amazon RDS(以後RDSと省略)の再起動や、時間のかかるスキーマチェ

ンジの運用課題

‣ Service別にDBを持つため、システム全体を止めてのメンテナンスを回避できる

‣ 呼び出し側のServiceでのケアを用意しておく

‣ (例)Disable XXX Service Mode

‣ (例)〜の機能は現在ご利用いただけません

Page 15: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Docker利用のモチベーション‣ Immurable Infrastructureとの親和性、ポータビリティの高さ

‣ イメージ作ってしまえば、コンテナ上げるだけ

‣ Provisioningでインフラの面倒を続けるより、コンテナの面倒を見る方が敷居が低いのでは?という仮説

‣ コンテナを簡単に増やせる仕組みさえあればスケールする

Page 16: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

FRESH!とDocker‣ Amazon EC2 Container Services(以後Amazon ECSまたはECS

と省略)の東京リージョンリリースから利用

‣ ホストOSはUbuntu

‣ Docker 1.10.3

‣ ecs-agent 1.9.0

‣ 軽量化を図るため、ベースイメージはAlpine Linux

Page 17: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

コンテナ化方針‣ 基本的にデータストア以外はコンテナ化する

‣ インフラとアプリケーションがコンテナによってセットで扱うことができるメリットは大きい

‣ ログはホストにボリュームマウントし、fluentdでAmazon S3(以後S3と省略)やElasticsearchに転送する

‣ アプリケーションの設定や、ミドルウェアの設定は環境変数で設定できるようにする

Page 18: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

コンテナ化、結局何がおいしい?‣ 環境差異問題からの脱却

‣ Aの環境では動くが、Bの環境では動かない的なあるあるな問題

‣ 環境再現のしやすさ

‣ インフラのメンテコストの軽減

‣ Provisioningほとんど要らないよね(FRESHはclout-initだけ)

Page 19: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

コンテナ時代の設定管理‣ 環境別の設定ファイルはDockerにはそぐわない

‣ 環境変数変更だけで挙動を変えられてこそのポータビリティ

‣ 環境変数ベース

‣ アプリケーションの設定変更にビルド不要

‣ 環境変数を変えてのデプロイで済む

Page 20: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Amazon ECSと設定管理‣ github.com/stormcat24/ecs-formation

‣ docker-composeライクのAmazon ECSクラスタ構成管理ツール

‣ Blue Green Deploymentもサポート

Page 21: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

FRESH!がDocker化しているもの‣ REST API(Go)

‣ Job Worker(Go)

‣ React(Node.js)

‣ Chat(Node.js)

‣ 独自Cron(Java)

‣ Nginx

‣ Wowza Streaming Engine

‣ HAProxy

‣ fluentd

Page 22: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Dockerと Amazon EC2 Container Serviceでの

サービス構成パターン

Page 23: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Amazon ECSの予備知識‣ ECSでのコンテナの集合体をTaskとして定義する

‣ TaskはAmazon EC2(以後EC2と省略)インスタンスで構成されるクラスタ上で動作する

‣ ECSクラスタ上でTaskを起動したり、インスタンスのリソースを考慮したスケジューリングをする役割を担うのがService

Page 24: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

1クラスタに複数種のTask‣ 1つのECSクラスタに複数種類の

Taskが配置される方式

‣ 空きリソースを効果的に利用しやすい

‣ 人間的には、どこにどのTaskが配置されてるかがわかりにくい

Page 25: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

クラスタを役割で分ける‣ 役割等でECS Clusterを分ける方式

‣ わかりやすい

‣ FRESHではこの方式を採用

‣ スケールが必要な役割のものは、AutoScaling Groupと併用

Page 26: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

基本的な考え方‣ 役割(ドメイン領域)で1つのMicroservices

‣ MicroservicesはECSクラスタ単位で構成する

Page 27: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

全体構成図(※かなり簡略)

Page 28: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

各Microserviceの構築パターン

Page 29: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

PublicなService(第1段階)‣ Publicに公開するものは

Nginxを前段に

‣ Nginx+APIがTask

‣ Elastic Load Balancing(以後ELBと省略)からは各TaskのHTTPポートにリクエストを振り分ける

Page 30: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

PublicなService(第2段階)‣ この段階で実用的

‣ ログはfluentdで転送

‣ EC2 Slave群を参照するためにHAProxyを利用

Page 31: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

HAProxyのコンテナ利用‣ 各TaskにHAProxyを入れて

しまおうという考え

‣ essential設定でHAProxyが落ちれば他コンテナも道連れで落ちるようにできる

‣ HAProxyだけ落ちるという異常な状態を回避

Page 32: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

PublicなWeb + API‣ WebはReact + Fluxでの

SSR/SPA構成

‣ ネイティブはNginx -> API

‣ WebはNginx -> Node -> API

Page 33: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

assetsの扱い‣ assetsはNodeコンテナに

属する

‣ assets類はNginxから直接配信したい(gzip圧縮)

‣ コンテナ間ボリュームマウント(volume_form)

Page 34: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Internal Service‣ Internal ELB経由で、別の

Serviceを利用する

‣ REST APIベース(最近はgRPCの選択肢もある)

Page 35: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Job Worker‣ Enqueue/Dequeue型のJob

Worker

‣ Amazon SQS(以後SQSと省略)

‣ 重めの処理を担当

‣ 定時ジョブは独自CronからEnqueue

‣ Task増やすだけでスケール

Page 36: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Wowza Streaming Engine‣ 動画配信サーバ

‣ 配信はRTMP

‣ 視聴はHLS(HTTP Live Streaming)

‣ Amazon S3

‣ Amazon CloudFront(以下CloudFrontと省略)

Page 37: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

基本的にService群の組み合わせ

Page 38: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

運用・開発体制‣ サーバサイド☓6+インフラ☓1、Not Two Pizza Team

‣ サービス:開発者 = N : N

‣ 各サービス毎に主担当はいるが、他のメンバーも面倒が見れるようにしている

‣ Microservices Mapのような俯瞰できるドキュメントの作成

‣ 構成図や、ポート対応表

‣ 現状、複雑性より可用性を優先している

Page 39: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

FRESH!の今後の課題‣ HTTP2対応

‣ リソースの最適化(マシンリソースを使い切る)

‣ Circuit Breaker Pattern

‣ Service粒度の最適化

‣ 多くのMicroservicesを運用するチーム・開発体制

Page 40: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Blue Green Deployment

Page 41: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Blue Green Deployment‣ 稼働系インフラにアプリケーションをデプロイし直すのではなく、

インフラごと新しく構築して切り替えてしまう手法

‣ 旧系統から新系統にロードバランサーを切り替える

‣ ロールバックも容易

‣ カジュアルにインフラを壊していこう💪

Page 42: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

2Auto Scaling Group Pattern‣ BlueとGreenのAuto Scaling Groupを用意する

‣ Auto Scaling Group単位でELBをつけかえる

‣ Auto Scaling Group上にそれぞれECSのクラスタを作成

‣ デプロイ後、古いクラスタはDesiredCount=0にしてインスタンスを破棄

Page 43: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

ECS + 2Auto Scaling

Page 44: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Blue Greenがもたらしたもの‣ デプロイの安心感

‣ 致命的な状態を含んだ成果物が出ることを防止

‣ *.amebafresh.tv -> *.abemafresh.tvの悲しみのドメイン変更

‣ サービス名変更でドメインも変えることに

‣ 全てのServiceをダウンタイムゼロで移行成功

Page 45: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Dockerを検討されている皆様へ

Page 46: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Docker投入、考えられる障壁‣ 運用経験が無い

‣ なんとなく感じがちな、得体のしれない怖さ(((((( ;゚Д゚))))))

‣ 本当にちゃんと動くの?

‣ 地雷💣いっぱいあるんでしょ?

‣ クラスタの管理方法

Page 47: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

とりあえず開発環境から?

Page 48: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

開発環境のみの利用はもったいない‣ Dockerポータビリティは、そもそも環境を問わない実行環境を目指

したもの

‣ 既に開発環境で利用しているなら、本番でも動きますよ?

‣ 地雷💣もだいぶ踏み尽くされてきました

‣ とりあえずAWSソリューションアーキテクトの皆様に相談してみましょう!

Page 49: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

開発環境のみの利用は もったいないです(2回目)

Page 50: Dockerだらけの FRESH!な 動画配信プラットフォーム · Dockerだらけの FRESH!な 動画配信プラットフォーム 2016/06/03 AWS Summit Tokyo 2016 Developers

Have a nice container life.