Slide 1

Slide 1 text

DMM動画の可用性を支えるConsul DMM.com 動画配信事業部 菊地 弘晃 @第4回 HashiCorp User Group Meetup (2018/12/17)

Slide 2

Slide 2 text

いきなりで恐縮ですが みなさんに質問が・・・

Slide 3

Slide 3 text

Consul

Slide 4

Slide 4 text

こんさる vs. こんする問題

Slide 5

Slide 5 text

※当日、会場の皆さんに挙手して頂いたら、 ほぼ満場一致で「こんさる」でした

Slide 6

Slide 6 text

動画配信事業部 配信基盤スクラムチーム 菊地 弘晃 ͖ͪ͘ͻΖ͖͋ C V 菊地 弘晃 T E A M @_tinoji ピチピチの新卒2年目(アラサー)。X線の研究をして ましたが、飽きたのでエンジニアになりました。 仕事ではGoとLuaを書くことが多いです。二郎系と 温泉とラジオとHashiCorpが好き。 ࣗ ݾ ঺ հ Who am I

Slide 7

Slide 7 text

動画配信事業部 ←わかる 配信基盤スクラムチーム ←わからん 「スクラム」って部分が 妙にダサい

Slide 8

Slide 8 text

% . . ಈ ը ͷ α ʔ Ϗ ε Our Services http://www.dmm.com/digital/

Slide 9

Slide 9 text

規模的には・・・ トラフィック: 200Gbps超 再生数(VOD): 年間 4億超

Slide 10

Slide 10 text

% . . ಈ ը ͷ α ʔ Ϗ ε Our Services

Slide 11

Slide 11 text

再生ボタンポチーをしてから動画を見終わるまで のシステムを担っているチームです

Slide 12

Slide 12 text

࠶ ੜ 6 3 - Streaming URL まぁよくある話ですね(白目) 再生ボタンポチーの後、まず最初に行われるのが「再生URLの生成」。 ユーザーの購入情報などをもとに、どのコンテンツをどのデバイスでどんな画質で再生するのか等 を決定し、適切なURLを生成します。 この処理、いわゆるモノリシックでビッグなシステムの中の1ライブラリが行っていました。

Slide 13

Slide 13 text

• 各サービスの機能にURL生成機能が密結合。 • ライブラリは動画サービス以外でも使用されている。 • バージョン管理も各サービスで行っており、
 修正時にはそれぞれの担当部署がデプロイする必要あり。 ࠶ ੜ 6 3 - Streaming URL

Slide 14

Slide 14 text

シンプルにつらい・・・ので、

Slide 15

Slide 15 text

今年リプレイスされました オウンドメディアで 記事を書きました〜 https://inside.dmm.com/entry/2018/10/17/create-playurl

Slide 16

Slide 16 text

Ϧ ϓ Ϩ Π ε Replacing

Slide 17

Slide 17 text

Ϧ ϓ Ϩ Π ε Replacing st-apiというのが新システムの
 名前です

Slide 18

Slide 18 text

新システム(st-api)に 最も求められるものは?

Slide 19

Slide 19 text

高可用性

Slide 20

Slide 20 text

VODの再生数は年間 4億2千万

Slide 21

Slide 21 text

最も多いときで分間 4000再生

Slide 22

Slide 22 text

再生URLが生成できない = 当然、再生できない

Slide 23

Slide 23 text

st-apiが1分間死ぬ = 最大4000再生に影響が出る

Slide 24

Slide 24 text

やばい(やばい) どうやって高可用性を 実現しよう?

Slide 25

Slide 25 text

Consulの用途 その1

Slide 26

Slide 26 text

ߴ Մ ༻ ੑ High Availability 高可用性をどうやって実現しよう? (以下DNS-RRで負荷分散する前提で話しています) 少しでも異常があるノードは速やかにサービスアウトしてほしい (当然リカバリ時には自動でサービスインしてほしい) => APIでDNS in/outが可能で、かつ信頼性の高いRoute53をパブリックDNSに使うことに!

Slide 27

Slide 27 text

ࢮ ׆ ؂ ࢹ Health Check Route53にもヘルスチェック機能はあるが、HTTP, HTTPS, TCPに限られる => 可用性を高めるために、もっと細かい監視・制御がしたい・・・ 特定のミドルウェアの死活監視、DBとの疎通チェック etc… 死活監視は別のなにかで行い、フェイル/リカバーをフックしてRoute53のAPIを叩けたらいいなぁ

Slide 28

Slide 28 text

・・・ɾɾɾɾ

Slide 29

Slide 29 text

・・・Consul!!

Slide 30

Slide 30 text

$ P O T V M Ͱ % / 4 ੾ Γ ସ ͑ Update DNS by Consul ɾservice.json ɾwatch.json ɾ(PͰॻ͍ͨ$-*πʔϧ TUBQJʹ%#ͱͷૄ௨౳ΛؚΊͨεςʔλενΣοΫ༻"1*Λ࡞੒ɻ ͜ΕΛୟ͍ͯϔϧενΣοΫɻ ˢͷαʔϏε౳Λ؂ࢹ͠ɺมԽ͕͋ͬͨ৔߹ˣͷπʔϧΛ࣮ߦɻ 3PVUFͷ"1*Λୟ͍ͯ%/4Λߋ৽͢Δɻ ҟৗͷ͋Δϊʔυ͸αʔϏεΞ΢τ͞ΕΔɻ ϊʔυ௥Ճ࣌ʹ͸$POTVM,74Ͱ%/4ొ࿥ର৅֎ϦετΛ࡞੒ɻ ಈ࡞ݕূ׬ྃ·ͰύϒϦοΫ%/4ొ࿥ΛߦΘͳ͍Α͏ʹ͍ͯ͠Δɻ "services": [ { "name": “st-api", "checks": [ { "id": "hoge", "name": “foo", “http": “εςʔλενΣοΫAPI”

Slide 31

Slide 31 text

ɾservice.json ɾwatch.json ɾ(PͰॻ͍ͨ$-*πʔϧ TUBQJʹ%#ͱͷૄ௨౳ΛؚΊͨεςʔλενΣοΫ༻"1*Λ࡞੒ɻ ͜ΕΛୟ͍ͯϔϧενΣοΫɻ ˢͷαʔϏε౳Λ؂ࢹ͠ɺมԽ͕͋ͬͨ৔߹ˣͷπʔϧΛ࣮ߦɻ 3PVUFͷ"1*Λୟ͍ͯ%/4Λߋ৽͢Δɻ ҟৗͷ͋Δϊʔυ͸αʔϏεΞ΢τ͞ΕΔɻ ϊʔυ௥Ճ࣌ʹ͸$POTVM,74Ͱ%/4ొ࿥ର৅֎ϦετΛ࡞੒ɻ ಈ࡞ݕূ׬ྃ·ͰύϒϦοΫ%/4ొ࿥ΛߦΘͳ͍Α͏ʹ͍ͯ͠Δɻ “watches”: [ { “type”: “service”, “service”: “st-api”, “handler_type”: “script”, “args”: [(GoͷπʔϧΛ࣮ߦ)] }, …(ͦͷଞͷwatch) ] $ P O T V M Ͱ % / 4 ੾ Γ ସ ͑ Update DNS by Consul

Slide 32

Slide 32 text

st-api自体の高可用性は実現できた! (Consulによる細かい監視+Route53でサービスイン・アウト)

Slide 33

Slide 33 text

DBも高可用じゃないと ダメっすね、、、

Slide 34

Slide 34 text

Consulの用途 その2

Slide 35

Slide 35 text

3 F E J T ͷ ϑ Σ Π ϧ Φ ʔ ό ʔ Failover of Redis st-api master.service.consul slave.service.consul slave.service.consul 接続 Consul DNSを使用 Redis Sentinel

Slide 36

Slide 36 text

3 F E J T ͷ ϑ Σ Π ϧ Φ ʔ ό ʔ Failover of Redis st-api master.service.consul slave.service.consul slave.service.consul 接続 Consul DNSを使用 Sentinelによって新しいmasterが選出 Redis Sentinel

Slide 37

Slide 37 text

st-api slave.service.consul slave.service.consul 3 F E J T ͷ ϑ Σ Π ϧ Φ ʔ ό ʔ Failover of Redis 死んだRedisに繋いだまま Redis Sentinel master.service.consul

Slide 38

Slide 38 text

3 F E J T ͷ ϑ Σ Π ϧ Φ ʔ ό ʔ Failover of Redis 一般的な解決法 (http://tech.gmo-media.jp/post/48748908427/introduce-redis-sentinel) ・LBでどうにかする ・VIPでどうにかする ・DNSでどうにかする ・hostsでどうにかする ・iptablesでどうにかする ・(クライアント側でどうにかする) チームの要求 ConsulのServiceに、masterかslaveかを含めてRegisterしておいた方がUIから見たときに 分かりやすそう。なのでフェイルオーバー時にはServiceの更新も行っておきたい。

Slide 39

Slide 39 text

3 F E J T ͷ ϑ Σ Π ϧ Φ ʔ ό ʔ Failover of Redis 一般的な解決法 (http://tech.gmo-media.jp/post/48748908427/introduce-redis-sentinel) ・LBでどうにかする ・VIPでどうにかする ・DNSでどうにかする ・hostsでどうにかする ・iptablesでどうにかする ・(クライアント側でどうにかする) チームの要求 ConsulのServiceに、masterかslaveかを含めてRegisterしておいた方がUIから見たときに 分かりやすそう。なのでフェイルオーバー時にはServiceの更新も行っておきたい。 ← Consul DNSでいけそう

Slide 40

Slide 40 text

st-api slave.service.consul notification script(※)を利用して Consul DNSを変更 3 F E J T ͷ ϑ Σ Π ϧ Φ ʔ ό ʔ Failover of Redis ※reconfiguration scriptの方がいいかも Redis Sentinel master.service.consul

Slide 41

Slide 41 text

st-api slave.service.consul slave.service.consul slave master notification scriptを利用して Consul DNSを変更 3 F E J T ͷ ϑ Σ Π ϧ Φ ʔ ό ʔ Failover of Redis Redis Sentinel master.service.consul

Slide 42

Slide 42 text

st-api slave.service.consul slave.service.consul master notification scriptを利用して Consul DNSを変更 3 F E J T ͷ ϑ Σ Π ϧ Φ ʔ ό ʔ Failover of Redis => 30行弱のPythonスクリプトで実現できてしまった 他の方法と比較してもかなりシンプルかも? Redis Sentinel slave master.service.consul

Slide 43

Slide 43 text

· ͱ Ί Summary 再生URL生成APIを例に、Consulのユースケースを紹介しました〜 ① Conuslで死活監視→Route53のAPIでサービスイン・アウトを制御 細かい監視と柔軟なサービスイン・アウトを実現! ② Redisの自動フェイルオーバー時のmaster再接続 超シンプルなスクリプトで再接続を実装!

Slide 44

Slide 44 text

DMMの動画サービスの可用性は Consulによって支えられています!!!

Slide 45

Slide 45 text

Amazon Web Services、"Powered by AWS"ロゴ、およびかかる資料で使用されるその他のAWS商標は、 米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。 本資料で使用されるHashiCorp、Consul及びそのロゴはHashiCorp, Inc.の商標です。