Movatterモバイル変換


[0]ホーム

URL:


kidach1, profile picture
Uploaded bykidach1
PDF, PPTX25,453 views

大規模Node.jsを支える ロードバランスとオートスケールの独自実装

東京Node学園祭2015http://nodefest.jp/2015/#!/schedule

Related topics:

Embed presentation

Download as PDF, PPTX
大規模Node.jsを支えるロードバランスとオートスケールの独自実装2015/11/7DaikiTaniguchi (@kidach1)Akatsuki inc.#nodefest2015
・Github https://github.com/kidach1・Twitter https://twitter.com/kidach1・Qiita http://qiita.com/kidach1・Akatsuki Inc.・Node / JavaScript /TypeScript Ruby / Rails / Android Dvorak Keyboardkidach1
http://qiita.com/kidach1/items/b75882edd4f715ebc213事前資料
アジェンダ・作ったもの・アーキテクチャ ・経緯 ・ロードバランス ・オートスケール・負荷試験・その他 ・FRP ・可用性 ・監視
作ったもの・2D横スクロールアクション・マルチプレイ ・4人同時対戦 ・座標同期型 ・プレイヤーマッチング (Rating / Keyword)
作ったもの• リアルタイム非同期4人同時プレイ奪い合いアクションゲーム• 動きやモーション、ダメージ、アイテム取得/使用などのイベントを4人で連携しあう
Client: Cocos2d-x (c++)Server: API Server:Rails Websocket Server:Node.js詳しくはスマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介http://www.slideshare.net/aktsk/ss-52126411/1システム概要
・同時一万接続を想定 → 常時数十∼百数十台規模の軽量インスタンスが稼働・柔軟なオートスケール → 負荷に応じて柔軟に自律的に伸縮してくれるようなインフラにしたいシステム規模 / 要件
ArchitectureRealtimeClusterLB ClusterAPIClusterRedisCluster
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
本構成に至った経緯
立ちはだかる壁Websocket / Socket.ioは(E)LBと相性悪いらしい※ 正確には、「LBがクライアントからのリクエストを受け付け、配下のサーバ群へ振り分ける形式」との相性
・Websocketと(E)LBの相性 ✕ Websocketは一度接続するとサーバー/クライアント間のセッションを張りっぱなしにするため、コネクション確立時以外LBを挟むメリットがない。むしろコネクション数が肥大化し、ボトルネックになり得る立ちはだかる壁
・Socket.ioとELBの相性 ✕ ✕ ELBのTCP Listenerを使った場合StickySessionがサポートされていないため、Socket.ioのhandshakingが通らずコネクションが確立できない立ちはだかる壁
今回はNodeやwsに乗る場面じゃなかったか・・?しかし最近のNode・JavaScript界隈の目覚ましい進化や、npmの資産は魅力的→もう少し過去事例を調べる
 ・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立てて、はどうみても辛い
・運用コスト増大(LBとProxy)・そもそもupstreamの動的変更が出来ない(※)ため、ぶら下がるec2インスタンスの変更には手動対応が必要  → オートスケール実現不可 ※ 実際はNGINX Plusの購入をすれば可能だが、多数のインスタンスを柔軟に追加削除するには、結局追加モジュールを書く必要がありそう過去事例1
 ・ELBはセッション確立時のみ、もしくはELBなしでロードバランスするケース   過去事例2WebSocket on AWS (ロードバランサとSocket接続を使用したイベント通知サーバの負荷分散)http://www.slideshare.net/AmazonWebServicesJapan/socket-15753751TV連動サービスのリアルタイム通知を支える技術http://www.slideshare.net/tsuyoshitorii5/public-43549341
・なるほど!これだ やはりクライアントとsocket.ioクラスタの間にはLB置かないべき・AutoScalingは想定していないようだったので、その仕組みを追加するように拡張していく方向で決定過去事例2
LoadBalance
・EC2のtagをもとに、各クラスタ(lobby/game server)の各ノードごとのコネクション数を毎秒取得・RedisのSortedSetで保管/更新・APIサーバーからリアルタイムで最も接続数の少ないノードを読み出し、クライアントにendpointを返却LoadBalance
LB visualization
・インスタンスはコア数が少ないものを大量に横に並べる方針 ・SingleThreadで動くNodeとは相性が良い ・コア数を増やしてClusterModuleを利用する方法もあるが、(同一コアへのバランスなど)実装が複雑化するので避けるPoint
・CPU使用率やLoadAverageといった指標ではなく、socket.ioプロセス(アプリケーションレイヤー)でのコネクション数を見てバランス →サーバー自体はhealtyなのにプロセスは死んでいた、等を排除 ※ websocket/socket.ioを用いる場合、httpと比べて「OSレイヤーの指標とアプリケーションのプロセスの生死」が直結していない印象だった(正確には、その部分に対する勘所がなかった)ためPoint
Autoscaling
・Game/Lobby各Clusterの状態を毎秒監視・設定した閾値に応じてサーバーを自動で追加/縮小・スケールアウトは最短で3分に一度、スケールインはよりシビアに1時間に一度のスパンに制限(任意の値を設定可能)Autoscaling
・ゼロダウンタイム ・サーバープロセスが立ち上がり接続が確認できるまでLB側で有効なノードとして認識しない ・縮小時は、ノードへの接続がない状態でしかトリガーされないAutoscaling
・Clusterの状態変化をシームレスにスケーリングイベントに繋げるため、FRPのパラダイムを利用 ・Reactive-Extensions/RxJS ・詳細後述(時間の限り)Point
・スケーリングのツールはCloudFormation ・だが、次の課題を吸収するためRubyラッパーであるkumogataを利用Point
・socket.ioプロセスベースでコネクション数を監視、閾値に応じて柔軟に増減台数を決定したい→ 監視と増減台数決定部分はNode(前述のFRPの箇所)で、台数に応じたスケーリングはCloudFormationで実現したい→ CloudFormation単体(JSON)では力不足Cloudformation
・kumogata winebarrel/kumogata https://github.com/winebarrel/kumogata・cloudformationをRubyで。 →任意のインスタンス数  指定ロジックの記述kumogata
・インスタンス50台同時起動$ INSTANCE_NUM=50 kumogata create cloudformation/kumogata.rb prod-realtime→ LobbyServer / GameServer 25台ずつのクラスタが生成されるkumogata
・同時1万Connectionをシミュレートしたい・攻撃サーバー1台ではマシンパワー不足LoadTesting
LoadTestingnewsapps/beeswithmachinegunshttps://github.com/newsapps/beeswithmachineguns jmeter内包 = httpのみ・・
・結局自分で作るsocketio/socket.io-clientベースhttps://github.com/socketio/socket.io-clientLoadTesting
・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
LoadTesting
・Websocket/Socket.ioとELBの相性の問題 → 消滅実装してみて
・LBが直接ユーザーからのコネクションを受けることがないため、単一障害点になるリスクが低い。実運用において、 ・直接的な障害無し ・緊急対応的な手動オペレーション無し (事前に必要とわかっているデプロイ/メンテ等を除く)実装してみて
・本質的な部分(※)の実装は薄く、モジュール化可能 ※各ノードの任意の状態(コネクション数やCPU使用率など)を常時監視し、設定した閾値に応じて任意のスクリプトをトリガー・今回のsocket.ioのようなニッチなケースに限らず、http以外のプロトコルでAutoscaleさせたい時にも使えるかもしれない ・SPDY/HTTP2やwebRTC etc..実装してみて
Appendix
・4人同時対戦 → GameServerはマッチした4人を同一ノードに送り込む仕組み → ノード間の協調が不要、実装がシンプルに・全国マッチング → LobbyServerは全ノード間でユーザーのセッション情報の協調が必要 → socketio/socket.io-redisを利用LB Point
Availability
Lobby & Game Cluster・Multi-AZ・擬似FailOver ・各クラスタ最低構成台数を持っておき、この閾値を下回るとAutoscaleが発火  ・AutoscaleでFOの機能をざっくり吸収  ・状態を持たないdisposableな設計のため実現しやすかったAvailability
LoadBalancer & Autoscaling Server → SPOFになるとしたらこちら(直接リクエストを受け付けることがないのでリスクは少ないが、稼働台数が少ないため)・Multi-AZ・FailOver ・Lobbyクラスタ用LB、Gameクラスタ用LB それぞれがお互いをSocket.ioプロセスベースで監視し合う ・障害発生時に一方が片方の機能を吸収する形で自動でFailOver ・インスタンスが復旧した時点で自動でFailBackAvailability
 ・監視  ・CloudWatch  ・Slack連携   ・破壊的なイベント発生時やサーバーの状態を定期的にSlackで通知Monitoring
Autoscaling
Redis内で刻々と更新されていくインスタンス毎のコネクション数をもとに、オートスケールの発火を管理するPoint
_人人人人人_> F R P < ̄Y^Y^Y^Y ̄
・Redisから取得したデータを基軸とした一本のストリーム・ストリームに対して様々な制御(オペレーション)・スケーリングイベントの発火Design
Autoscaling
オートスケールの発火条件・負荷(※今回は接続数)に応じてトリガー・指定時刻にトリガー・事前に設定したクラスタごとの最低稼働台数を下回った際トリガーDesign
Implementation
Implementation
Implementation
Implementation
Anti Pattern冗長なストリームRedundant Stream
Anti Pattern・ Not DRY・ Fat I/O
ObservableHot / Cold
Hot / Cold・Cold -> Observable : Observer = 1 : 1・Hot -> Observable : Observer = 1 : n・特定のオペレータ(publish等)を使うと Cold→Hotに変換可能・特定のオペレータ(connect等)を使うと HotObservableの値がObserver達に一斉通知
Autoscaling
・mainStreamをHotObservableに変換(publish)・各observer(checkByXXX)に分岐した後にconnect
Hot Observable
手続き型との比較
FRP比:・プリミティブな制御構造(今回は主に条件分岐)が随所に登場し、全体の流れを俯瞰しにくい
FRP ver
FRPによって・リストとして扱うことでオペレータ(filterやmapなど)を適用でき、制御構造が抽象化/隠 される・非同期処理もストリームの一部として違和感なく扱える結果として「コード全体の見通し向上」つまり「本質的な処理に集中」できる
・FPR→コードの見通し↑でなかなか良い・インフラの制御はだいたいイベント駆動なので相性◎・まずはRx眺めてみると良いかも結論
http://qiita.com/kidach1/items/5fd764c18de7cdae24ca
WE ARE HIRING!http://aktsk.jp/recruit/or @kidach1
Thank you !
Questions

Recommended

PPTX
分散トレーシングAWS:X-Rayとの上手い付き合い方
PDF
こんなに使える!今どきのAPIドキュメンテーションツール
PDF
Azure App Service Overview
PDF
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
AWSからのメール送信
PDF
インフラエンジニアの綺麗で優しい手順書の書き方
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
PDF
Kongの概要と導入事例
PPTX
Amazon EKS によるスマホゲームのバックエンド運用事例
PDF
イマドキ!ユースケース別に見るAWS IoT への接続パターン
PDF
大規模サービスにおける価値開発の“これまで”と“将来”~新たな“じゃらんnet”のチャレンジに関して~
PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
PDF
SharePoint 開発でできること 2019年9月版
PPTX
情シス必要論
PDF
DockerとPodmanの比較
PPTX
ぱぱっと理解するSpring Cloudの基本
PDF
品質を加速させるために、テスターを増やす前から考えるべきQMファンネルの話(3D版)
PDF
それはYAGNIか? それとも思考停止か?
PPTX
規模の見積もり WACATE 2016 winter
PDF
AWS X-Rayによるアプリケーションの分析とデバッグ
PDF
例外設計における大罪
PPTX
GraphQLのsubscriptionで出来ること
PDF
Fluentdのお勧めシステム構成パターン
PPTX
Redisの特徴と活用方法について
PDF
AWS初心者向けWebinar AWS上でのDDoS対策
PDF
WebSocket / WebRTCの技術紹介
PDF
【CEDEC2013】20対20リアルタイム通信対戦オンラインゲームのサーバ開発&運営技法
PDF
Wakamonog6 “ISPのネットワーク”って どんなネットワーク?

More Related Content

PPTX
分散トレーシングAWS:X-Rayとの上手い付き合い方
PDF
こんなに使える!今どきのAPIドキュメンテーションツール
PDF
Azure App Service Overview
PDF
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
PDF
マルチテナント化で知っておきたいデータベースのこと
PDF
AWSからのメール送信
PDF
インフラエンジニアの綺麗で優しい手順書の書き方
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
分散トレーシングAWS:X-Rayとの上手い付き合い方
こんなに使える!今どきのAPIドキュメンテーションツール
Azure App Service Overview
AWS Black Belt Online Seminar 2018 Amazon DynamoDB Advanced Design Pattern
マルチテナント化で知っておきたいデータベースのこと
AWSからのメール送信
インフラエンジニアの綺麗で優しい手順書の書き方
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス

What's hot

PDF
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
PDF
Kongの概要と導入事例
PPTX
Amazon EKS によるスマホゲームのバックエンド運用事例
PDF
イマドキ!ユースケース別に見るAWS IoT への接続パターン
PDF
大規模サービスにおける価値開発の“これまで”と“将来”~新たな“じゃらんnet”のチャレンジに関して~
PPTX
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
PDF
SharePoint 開発でできること 2019年9月版
PPTX
情シス必要論
PDF
DockerとPodmanの比較
PPTX
ぱぱっと理解するSpring Cloudの基本
PDF
品質を加速させるために、テスターを増やす前から考えるべきQMファンネルの話(3D版)
PDF
それはYAGNIか? それとも思考停止か?
PPTX
規模の見積もり WACATE 2016 winter
PDF
AWS X-Rayによるアプリケーションの分析とデバッグ
PDF
例外設計における大罪
PPTX
GraphQLのsubscriptionで出来ること
PDF
Fluentdのお勧めシステム構成パターン
PPTX
Redisの特徴と活用方法について
PDF
AWS初心者向けWebinar AWS上でのDDoS対策
PDF
WebSocket / WebRTCの技術紹介
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
Kongの概要と導入事例
Amazon EKS によるスマホゲームのバックエンド運用事例
イマドキ!ユースケース別に見るAWS IoT への接続パターン
大規模サービスにおける価値開発の“これまで”と“将来”~新たな“じゃらんnet”のチャレンジに関して~
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
SharePoint 開発でできること 2019年9月版
情シス必要論
DockerとPodmanの比較
ぱぱっと理解するSpring Cloudの基本
品質を加速させるために、テスターを増やす前から考えるべきQMファンネルの話(3D版)
それはYAGNIか? それとも思考停止か?
規模の見積もり WACATE 2016 winter
AWS X-Rayによるアプリケーションの分析とデバッグ
例外設計における大罪
GraphQLのsubscriptionで出来ること
Fluentdのお勧めシステム構成パターン
Redisの特徴と活用方法について
AWS初心者向けWebinar AWS上でのDDoS対策
WebSocket / WebRTCの技術紹介

Viewers also liked

PDF
【CEDEC2013】20対20リアルタイム通信対戦オンラインゲームのサーバ開発&運営技法
PDF
Wakamonog6 “ISPのネットワーク”って どんなネットワーク?
PDF
スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介
 
PDF
Node.jsで対戦ゲーム作ったよ
PPTX
The State of JavaScript (2015)
PDF
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~
PPTX
冗長構成で定価100万以下バラクーダ ロードバランサー
PDF
Layer 4 Load Balancer (NAT, IP Tunnelling, DR)
PDF
Node.jsのオートスケールをFRPで管理する
PDF
마이크로소프트 앱 플랫폼을 이용한 어플리케이션 개발과 배포
PDF
Android nodejs binary-transfer_130531ss
 
PDF
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
PPTX
TV連動サービスのリアルタイム通知を支える技術
PDF
unassert - encourage reliable programming by writing assertions in production
PDF
THE OPEN
PPTX
Aws 2014 lt
PDF
OSC2010 TOKYO/Spring Asterisk Seminar
PDF
World Cup Marketing 2014
PDF
Va tutorial
 
PDF
What Teens Want Beinggirl Pres
【CEDEC2013】20対20リアルタイム通信対戦オンラインゲームのサーバ開発&運営技法
Wakamonog6 “ISPのネットワーク”って どんなネットワーク?
スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介
 
Node.jsで対戦ゲーム作ったよ
The State of JavaScript (2015)
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~
冗長構成で定価100万以下バラクーダ ロードバランサー
Layer 4 Load Balancer (NAT, IP Tunnelling, DR)
Node.jsのオートスケールをFRPで管理する
마이크로소프트 앱 플랫폼을 이용한 어플리케이션 개발과 배포
Android nodejs binary-transfer_130531ss
 
[Tokyo NodeFest 2015] Hardware Hacking for Javascript Developers
TV連動サービスのリアルタイム通知を支える技術
unassert - encourage reliable programming by writing assertions in production
THE OPEN
Aws 2014 lt
OSC2010 TOKYO/Spring Asterisk Seminar
World Cup Marketing 2014
Va tutorial
 
What Teens Want Beinggirl Pres

大規模Node.jsを支える ロードバランスとオートスケールの独自実装


[8]ページ先頭

©2009-2025 Movatter.jp