Submit Search
大規模Node.jsを支える ロードバランスとオートスケールの独自実装
56 likes
25,443 views
kidach1
東京Node学園祭2015 http://nodefest.jp/2015/#!/schedule
Engineering
Related topics:
Node.js Development
Read more
1 of 77
Download now
Downloaded 41 times
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
More Related Content
PDF
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
Amazon Web Services Japan
PDF
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
Daichi Koike
PPTX
脱RESTful API設計の提案
樽八 仲川
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
Amazon Web Services Japan
PDF
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Noritaka Sekiyama
PPTX
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
PDF
Data platformdesign
Ryoma Nagata
PDF
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa
ゲームアーキテクチャパターン (Aurora Serverless / DynamoDB)
Amazon Web Services Japan
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
Daichi Koike
脱RESTful API設計の提案
樽八 仲川
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
Amazon Web Services Japan
Hadoop/Spark で Amazon S3 を徹底的に使いこなすワザ (Hadoop / Spark Conference Japan 2019)
Noritaka Sekiyama
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
Data platformdesign
Ryoma Nagata
マルチテナントのアプリケーション実装〜実践編〜
Yoshiki Nakagawa
What's hot
(20)
PPTX
Redis勉強会資料(2015/06 update)
Yuji Otani
PPTX
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
Yuki Hirano
PPTX
[社内勉強会]ELBとALBと数万スパイク負荷テスト
Takahiro Moteki
PDF
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
NTT DATA Technology & Innovation
PDF
Dockerからcontainerdへの移行
Kohei Tokunaga
PDF
君はyarn.lockをコミットしているか?
Teppei Sato
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
Naoya Kishimoto
PPTX
大規模データ活用向けストレージレイヤソフトのこれまでとこれから(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
NTT DATA Technology & Innovation
PDF
[JAWS DAYS 2019] Amazon DocumentDB(with MongoDB Compatibility)入門
Shuji Kikuchi
PDF
REST API のコツ
pospome
PDF
マイクロにしすぎた結果がこれだよ!
mosa siru
PPTX
Redisの特徴と活用方法について
Yuji Otani
PPTX
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
PDF
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Masahito Zembutsu
PDF
実務で役立つデータベースの活用法
Soudai Sone
PPTX
分散トレーシングAWS:X-Rayとの上手い付き合い方
Recruit Lifestyle Co., Ltd.
PDF
IoT向けプラットフォーム「SORACOM」とは? 他2本
SORACOM,INC
PDF
Nginxを使ったオレオレCDNの構築
ichikaway
PDF
20210127 AWS Black Belt Online Seminar Amazon Redshift 運用管理
Amazon Web Services Japan
PDF
負荷試験入門公開資料 201611
樽八 仲川
Redis勉強会資料(2015/06 update)
Yuji Otani
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
Yuki Hirano
[社内勉強会]ELBとALBと数万スパイク負荷テスト
Takahiro Moteki
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
NTT DATA Technology & Innovation
Dockerからcontainerdへの移行
Kohei Tokunaga
君はyarn.lockをコミットしているか?
Teppei Sato
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
Naoya Kishimoto
大規模データ活用向けストレージレイヤソフトのこれまでとこれから(NTTデータ テクノロジーカンファレンス 2019 講演資料、2019/09/05)
NTT DATA Technology & Innovation
[JAWS DAYS 2019] Amazon DocumentDB(with MongoDB Compatibility)入門
Shuji Kikuchi
REST API のコツ
pospome
マイクロにしすぎた結果がこれだよ!
mosa siru
Redisの特徴と活用方法について
Yuji Otani
イベント駆動プログラミングとI/O多重化
Gosuke Miyashita
Docker入門-基礎編 いまから始めるDocker管理【2nd Edition】
Masahito Zembutsu
実務で役立つデータベースの活用法
Soudai Sone
分散トレーシングAWS:X-Rayとの上手い付き合い方
Recruit Lifestyle Co., Ltd.
IoT向けプラットフォーム「SORACOM」とは? 他2本
SORACOM,INC
Nginxを使ったオレオレCDNの構築
ichikaway
20210127 AWS Black Belt Online Seminar Amazon Redshift 運用管理
Amazon Web Services Japan
負荷試験入門公開資料 201611
樽八 仲川
Ad
Viewers also liked
(20)
PDF
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
Tomomi Imura
PPTX
The State of JavaScript (2015)
Domenic Denicola
PDF
unassert - encourage reliable programming by writing assertions in production
Takuto Wada
PDF
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~
Recruit Technologies
PDF
スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介
aktsk
PPTX
TV連動サービスのリアルタイム通知を支える技術
Tsuyoshi Torii
PDF
【CEDEC2013】20対20リアルタイム通信対戦オンラインゲームのサーバ開発&運営技法
モノビット エンジン
PDF
마이크로소프트 앱 플랫폼을 이용한 어플리케이션 개발과 배포
Dae Kim
PDF
Node.jsのオートスケールをFRPで管理する
kidach1
PDF
Va tutorial
yg0808
PDF
Android nodejs binary-transfer_130531ss
ts170
PDF
THE OPEN
Yoshihiro Furukawa
PPTX
Aws 2014 lt
Yoshihiro Furukawa
PDF
OSC2010 TOKYO/Spring Asterisk Seminar
Kenichi 深海
PDF
World Cup Marketing 2014
Viddyad
PPTX
冗長構成で定価100万以下バラクーダ ロードバランサー
BarracudaJapan
PDF
Wakamonog6 “ISPのネットワーク”って どんなネットワーク?
Satoshi Matsumoto
PDF
Layer 4 Load Balancer (NAT, IP Tunnelling, DR)
Kota Uchida
PDF
Node.jsで対戦ゲーム作ったよ
Yuusuke Takeuchi
PDF
What Teens Want Beinggirl Pres
Dave Knox
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
Tomomi Imura
The State of JavaScript (2015)
Domenic Denicola
unassert - encourage reliable programming by writing assertions in production
Takuto Wada
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~
Recruit Technologies
スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介
aktsk
TV連動サービスのリアルタイム通知を支える技術
Tsuyoshi Torii
【CEDEC2013】20対20リアルタイム通信対戦オンラインゲームのサーバ開発&運営技法
モノビット エンジン
마이크로소프트 앱 플랫폼을 이용한 어플리케이션 개발과 배포
Dae Kim
Node.jsのオートスケールをFRPで管理する
kidach1
Va tutorial
yg0808
Android nodejs binary-transfer_130531ss
ts170
THE OPEN
Yoshihiro Furukawa
Aws 2014 lt
Yoshihiro Furukawa
OSC2010 TOKYO/Spring Asterisk Seminar
Kenichi 深海
World Cup Marketing 2014
Viddyad
冗長構成で定価100万以下バラクーダ ロードバランサー
BarracudaJapan
Wakamonog6 “ISPのネットワーク”って どんなネットワーク?
Satoshi Matsumoto
Layer 4 Load Balancer (NAT, IP Tunnelling, DR)
Kota Uchida
Node.jsで対戦ゲーム作ったよ
Yuusuke Takeuchi
What Teens Want Beinggirl Pres
Dave Knox
Ad
大規模Node.jsを支える ロードバランスとオートスケールの独自実装
1.
大規模Node.jsを支える ロードバランスとオートスケールの独自実装 2015/11/7 DaikiTaniguchi (@kidach1) Akatsuki inc. #nodefest2015
2.
・Github https://github.com/kidach1 ・Twitter https://twitter.com/kidach1 ・Qiita
http://qiita.com/kidach1 ・Akatsuki Inc. ・Node / JavaScript /TypeScript Ruby / Rails / Android Dvorak Keyboard kidach1
3.
http://qiita.com/kidach1/items/b75882edd4f715ebc213 事前資料
4.
アジェンダ ・作ったもの ・アーキテクチャ ・経緯 ・ロードバランス ・オートスケール ・負荷試験 ・その他 ・FRP ・可用性 ・監視
5.
作ったもの ・2D横スクロールアクション ・マルチプレイ ・4人同時対戦 ・座標同期型 ・プレイヤーマッチング (Rating /
Keyword)
6.
作ったもの • リアルタイム非同期4人同時プレイ 奪い合いアクションゲーム • 動きやモーション、ダメージ、アイ テム取得/使用などのイベントを4人 で連携しあう
7.
Client: Cocos2d-x (c++) Server: API Server:Rails Websocket
Server:Node.js 詳しくは スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介 http://www.slideshare.net/aktsk/ss-52126411/1 システム概要
8.
・同時一万接続を想定 → 常時数十∼百数十台規模の軽量インスタンスが稼働 ・柔軟なオートスケール → 負荷に応じて柔軟に自律的に伸縮してくれるような インフラにしたい システム規模
/ 要件
9.
Architecture Realtime Cluster LB Cluster API Cluster Redis Cluster
10.
A. 各Cluster/各Nodeの状態を毎秒監視 B. Node毎の重み付けを毎秒更新 C.
Clusterの状態に応じてオートスケール D. LB間でのプロセス監視&自動FailOver ①② LobbyNode取得 ③ Lobby接続 ④ マッチングとroom_idの決定 ⑤ room_id返却 ⑥⑦ start(REST API)(GameNode取得) ⑧ GameNodeとroomを指定の上 GameServer接続 ⑨ finish(REST API) Architecture
11.
本構成に至った経緯
12.
立ちはだかる壁 Websocket / Socket.ioは(E)LBと相性悪いらしい ※
正確には、「LBがクライアントからのリクエストを受け 付け、配下のサーバ群へ振り分ける形式」との相性
13.
・Websocketと(E)LBの相性 ✕ Websocketは一度接続するとサーバー/クライアント 間のセッションを張りっぱなしにするため、コネクショ ン確立時以外LBを挟むメリットがない。むしろコネク ション数が肥大化し、ボトルネックになり得る 立ちはだかる壁
14.
・Socket.ioとELBの相性 ✕ ✕ ELBのTCP
Listenerを使った場合StickySessionがサポー トされていないため、Socket.ioのhandshakingが通らず コネクションが確立できない 立ちはだかる壁
16.
今回はNodeやwsに乗る場面じゃなかったか・・? しかし最近のNode・JavaScript界隈の目覚ましい進化や、 npmの資産は魅力的 →もう少し過去事例を調べる
17.
・ELBの下にNginxやHAProxyを立ててip-hashでバランスし stickinessを担保する 過去事例1 Load-balancing Websockets on
EC2 — Medium https://medium.com/@Philmod/load-balancing- websockets-on-ec2-1da94584a5e9 →しかし、ELBの下にさらにproxy立てて、はどうみ ても辛い
18.
・運用コスト増大(LBとProxy) ・そもそもupstreamの動的変更が出来ない(※)ため、ぶら下が るec2インスタンスの変更には手動対応が必要 → オートスケール実現不可 ※
実際はNGINX Plusの購入をすれば可能だが、多数のインスタンスを柔軟に追 加削除するには、結局追加モジュールを書く必要がありそう 過去事例1
19.
・ELBはセッション確立時のみ、もしくはELBなしでロード バランスするケース 過去事例2 WebSocket on AWS
(ロードバランサと Socket接続を使用したイベント通知サー バの負荷分散) http://www.slideshare.net/ AmazonWebServicesJapan/socket-15753751 TV連動サービスのリアルタイム通知を支 える技術 http://www.slideshare.net/tsuyoshitorii5/ public-43549341
20.
・なるほど!これだ やはりクライアントとsocket.ioクラスタの間にはLB置かないべき ・AutoScalingは想定していないようだったので、その仕組みを追 加するように拡張していく方向で決定 過去事例2
21.
LoadBalance
22.
・EC2のtagをもとに、各クラスタ(lobby/game server)の各 ノードごとのコネクション数を毎秒取得 ・RedisのSortedSetで保管/更新 ・APIサーバーからリアルタイムで最も接続数の少ないノー ドを読み出し、クライアントにendpointを返却 LoadBalance
23.
LB visualization
24.
・インスタンスはコア数が少ないものを大量に横に並べる方針 ・SingleThreadで動くNodeとは相性が良い ・コア数を増やしてClusterModuleを利用する方法もあるが、 (同一コアへのバランスなど)実装が複雑化するので避ける Point
25.
・CPU使用率やLoadAverageといった指標ではなく、socket.ioプロセス (アプリケーションレイヤー)でのコネクション数を見てバランス →サーバー自体はhealtyなのにプロセスは死んでいた、等を排除 ※ websocket/socket.ioを用いる場合、httpと比べて「OSレイヤーの指標と アプリケーションのプロセスの生死」が直結していない印象だった(正確 には、その部分に対する勘所がなかった)ため Point
26.
Autoscaling
27.
・Game/Lobby各Clusterの状態を毎秒監視 ・設定した閾値に応じてサーバーを自動で追加/縮小 ・スケールアウトは最短で3分に一度、スケールインはよりシビ アに1時間に一度のスパンに制限(任意の値を設定可能) Autoscaling
28.
・ゼロダウンタイム ・サーバープロセスが立ち上がり接続が確認できるまでLB 側で有効なノードとして認識しない ・縮小時は、ノードへの接続がない状態でしかトリガーさ れない Autoscaling
29.
・Clusterの状態変化をシームレスにスケーリングイベントに 繋げるため、FRPのパラダイムを利用 ・Reactive-Extensions/RxJS ・詳細後述(時間の限り) Point
30.
・スケーリングのツールはCloudFormation ・だが、次の課題を吸収するためRubyラッパーである kumogataを利用 Point
31.
・socket.ioプロセスベースでコネクション数を監視、閾値に応じて 柔軟に増減台数を決定したい → 監視と増減台数決定部分はNode(前述のFRPの箇所)で、台数 に応じたスケーリングはCloudFormationで実現したい → CloudFormation単体(JSON)では力不足 Cloudformation
32.
・kumogata winebarrel/kumogata https://github.com/winebarrel/kumogata ・cloudformationをRubyで。 →任意のインスタンス数 指定ロジックの記述 kumogata
33.
・インスタンス50台同時起動 $ INSTANCE_NUM=50 kumogata
create cloudformation/kumogata.rb prod- realtime → LobbyServer / GameServer 25台ずつのクラスタが生成される kumogata
34.
・同時1万Connectionをシミュレートしたい ・攻撃サーバー1台ではマシンパワー不足 LoadTesting
35.
LoadTesting newsapps/beeswithmachineguns https://github.com/newsapps/beeswithmachineguns jmeter内包 =
httpのみ・・
36.
・結局自分で作る socketio/socket.io-clientベース https://github.com/socketio/socket.io-client LoadTesting
37.
・kumogataで複数攻撃サーバー同時立ち上げ $ kumogata create
cloudformation/bees-kumogata.rb bees ・ansibleでsocke.io-clientの攻撃スクリプトを複数台同時実行 $ ansible-playbook -i ./hosts/develop/ec2.py bees.yml —private- key=<key_path> LoadTesting
38.
LoadTesting
39.
・Websocket/Socket.ioとELBの相性の問題 → 消滅 実装してみて
40.
・LBが直接ユーザーからのコネクションを受けることがない ため、単一障害点になるリスクが低い。 実運用において、 ・直接的な障害無し ・緊急対応的な手動オペレーション無し (事前に必要とわかっているデプロイ/メンテ等を除く) 実装してみて
41.
・本質的な部分(※)の実装は薄く、モジュール化可能 ※各ノードの任意の状態(コネクション数やCPU使用率など)を常時監視 し、設定した閾値に応じて任意のスクリプトをトリガー ・今回のsocket.ioのようなニッチなケースに限らず、http以外 のプロトコルでAutoscaleさせたい時にも使えるかもしれない ・SPDY/HTTP2やwebRTC etc.. 実装してみて
42.
Appendix
43.
・4人同時対戦 → GameServerはマッチした4人を同一ノードに送り込む仕組み → ノード間の協調が不要、実装がシンプルに ・全国マッチング →
LobbyServerは全ノード間でユーザーのセッション情報の協調 が必要 → socketio/socket.io-redisを利用 LB Point
44.
Availability
45.
Lobby & Game
Cluster ・Multi-AZ ・擬似FailOver ・各クラスタ最低構成台数を持っておき、この閾値を下回る とAutoscaleが発火 ・AutoscaleでFOの機能をざっくり吸収 ・状態を持たないdisposableな設計のため実現しやすかった Availability
46.
LoadBalancer & Autoscaling
Server → SPOFになるとしたらこちら(直接リクエストを受け付けること がないのでリスクは少ないが、稼働台数が少ないため) ・Multi-AZ ・FailOver ・Lobbyクラスタ用LB、Gameクラスタ用LB それぞれがお互いを Socket.ioプロセスベースで監視し合う ・障害発生時に一方が片方の機能を吸収する形で自動でFailOver ・インスタンスが復旧した時点で自動でFailBack Availability
47.
・監視 ・CloudWatch ・Slack連携 ・破壊的なイベント発生時やサーバーの状態を定期的 にSlackで通知 Monitoring
48.
Autoscaling
49.
Redis内で刻々と更新されていくインスタンス毎のコネク ション数をもとに、オートスケールの発火を管理する Point
50.
_人人人人人_ > F R P <  ̄Y^Y^Y^Y ̄
51.
・Redisから取得したデータを基軸とした一本のストリーム ・ストリームに対して様々な制御(オペレーション) ・スケーリングイベントの発火 Design
52.
Autoscaling
53.
オートスケールの発火条件 ・負荷(※今回は接続数)に応じてトリガー ・指定時刻にトリガー ・事前に設定したクラスタごとの最低稼働台数を下回った際トリガー Design
54.
Implementation
55.
Implementation
56.
Implementation
57.
Implementation
58.
Anti Pattern 冗長なストリーム Redundant Stream
61.
Anti Pattern ・ Not
DRY ・ Fat I/O
62.
Observable Hot / Cold
63.
Hot / Cold ・Cold
-> Observable : Observer = 1 : 1 ・Hot -> Observable : Observer = 1 : n ・特定のオペレータ(publish等)を使うと Cold→Hotに変換可能 ・特定のオペレータ(connect等)を使うと HotObservableの値がObserver達に一斉通知
64.
Autoscaling
65.
・mainStreamをHotObservableに変換(publish) ・各observer(checkByXXX)に分岐した後にconnect
66.
Hot Observable
67.
手続き型との比較
70.
FRP比: ・プリミティブな制御構造(今回は主に条件分岐)が 随所に登場し、全体の流れを俯瞰しにくい
71.
FRP ver
72.
FRPによって ・リストとして扱うことでオペレータ(filterやmapなど) を適用でき、制御構造が抽象化/隠 される ・非同期処理もストリームの一部として違和感なく扱える 結果として「コード全体の見通し向上」 つまり「本質的な処理に集中」できる
73.
・FPR→コードの見通し↑でなかなか良い ・インフラの制御はだいたいイベント駆動なので相性◎ ・まずはRx眺めてみると良いかも 結論
74.
http://qiita.com/kidach1/items/5fd764c18de7cdae24ca
75.
WE ARE HIRING! http://aktsk.jp/recruit/ or
@kidach1
76.
Thank you !
77.
Questions
Download