Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DMM動画の可用性を支えるConsul

tinoji
December 17, 2018

 DMM動画の可用性を支えるConsul

第4回 HashiCorp User Group Meetupの登壇資料
https://hashicorp.connpass.com/event/110653/

tinoji

December 17, 2018
Tweet

More Decks by tinoji

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. Consul

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. • 各サービスの機能にURL生成機能が密結合。
    • ライブラリは動画サービス以外でも使用されている。
    • バージョン管理も各サービスで行っており、

    修正時にはそれぞれの担当部署がデプロイする必要あり。
    ࠶ ੜ 6 3 -
    Streaming URL

    View Slide

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

    View Slide

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

    View Slide

  16. Ϧ ϓ Ϩ Π ε
    Replacing

    View Slide

  17. Ϧ ϓ Ϩ Π ε
    Replacing
    st-apiというのが新システムの

    名前です

    View Slide

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

    View Slide

  19. 高可用性

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. Consulの用途 その1

    View Slide

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

    View Slide

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

    View Slide

  28. ・・・ɾɾɾɾ

    View Slide

  29. ・・・Consul!!

    View Slide

  30. $ 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”

    View Slide

  31. ɾ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

    View Slide

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

    View Slide

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

    View Slide

  34. Consulの用途 その2

    View Slide

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

    View Slide

  36. 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

    View Slide

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

    View Slide

  38. 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の更新も行っておきたい。

    View Slide

  39. 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でいけそう

    View Slide

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

    View Slide

  41. 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

    View Slide

  42. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide