68
サーバーのおしごと Web サービスにおけるサーバー構成とその目的

サーバーのおしごと

Embed Size (px)

DESCRIPTION

2014/2/8に行ったゲームサーバ勉強会でのスライドです。 サーバー構成図で登場するApplicationサーバーとDBについての基本的な事項と気をつける事について紹介しました。

Citation preview

Page 1: サーバーのおしごと

サーバーのおしごとWebサービスにおけるサーバー構成とその目的

Page 2: サーバーのおしごと

自己紹介清水 佑吾 @yamionp

id:yamionp

株式会社 gumi 勤務

Python歴約2年

サーバーさわりはじめて約10年

Page 3: サーバーのおしごと

略歴

高校:CGIやホームページを作成して小遣い稼ぎ

卒業後:ISPでネットワーク&サーバー構築のバイト

ちょっと前:PHPでウェブサービス開発

今:ソーシャルゲーム開発

Page 4: サーバーのおしごと

サーバーの話

Page 5: サーバーのおしごと
Page 6: サーバーのおしごと

使用言語・フレームワーク

Page 7: サーバーのおしごと

使用ミドルウェア

Page 8: サーバーのおしごと

最近のサーバー構成

Page 9: サーバーのおしごと

Application

MessageQueue

EC2

JobEC2

ElasticCache

Horizontal Partitioning

RDS

Database

ELBS3

今日話す範囲

Page 10: サーバーのおしごと

最小限構成

Page 11: サーバーのおしごと

Service

Request

Response DATA

Page 12: サーバーのおしごと

一番シンプルな形

問題は?

サーバーが壊れるとデータが消える

サービスも止まる

書き込み途中で壊れると中途半端な書き込みが残る

Page 13: サーバーのおしごと

アクセスが増えたら今のサーバー1台では処理しきれない時

Page 14: サーバーのおしごと

負荷への対処スケールアップ

スペックの良いサーバーに変更して処理能力UP!

スケールアウト

台数を増やして処理能力UP!

今日はこちらの話をします

Page 15: サーバーのおしごと

Service

DATA

Request

Response

Page 16: サーバーのおしごと

Service

DATA

DATA

DATA

A

B

C

Page 17: サーバーのおしごと

単にサーバーを増やした

特定のサーバーに負荷が集中すると対処出来ない

全データを見るには個別にアクセスする必要がある

可用性、整合性の問題は解決していない

Page 18: サーバーのおしごと

データベース

Page 19: サーバーのおしごと

Service

DATA

DATA

DATA

A

B

C

Page 20: サーバーのおしごと

Application

ServiceDATA

SQL

AB

CSQL

Page 21: サーバーのおしごと

データの格納にRDBを使用した

データの扱い方が統一される

(リレーショナルモデル&SQL)

どのApplicationサーバーでも同じデータを扱える

ユーザーはどれか一台にアクセスすれば良い

アクセス先はユーザーが決める

Page 22: サーバーのおしごと

ロードバランサー

Page 23: サーバーのおしごと

Application

ServiceDATA

A

B

C

助けて!

暇…

暇…

Page 24: サーバーのおしごと

Elastic Load Balancing

Page 25: サーバーのおしごと

Application

ServiceDATA

SQL

AB

C

Page 26: サーバーのおしごと

Application

Service DATA

ELBLoadBalancer

AB

C

Page 27: サーバーのおしごと

ユーザーがアクセスする先を選ぶ必要が無くなった

特定のApplicationサーバーに負荷が集中しない

=> 台数さえ増やせば処理可能

Page 28: サーバーのおしごと

レプリケーション

Page 29: サーバーのおしごと

Application

Service

ELB

DATA

Page 30: サーバーのおしごと

Application

Service

ELB

読み込み書き込み

Master Slave

Page 31: サーバーのおしごと

メリット

既存のロジックに大きな変更無しに導入可能

自動でデータが更新される

再起動しても消えない

Page 32: サーバーのおしごと

デメリット

分散可能なのは読み込みのみ

非同期の場合古いデータが最新のデータと限らない

同期の場合、Masterのパフォーマンスが悪化する

Page 33: サーバーのおしごと

KeyValueStore (KVS)

Page 34: サーバーのおしごと

KVSとは

KeyとValueのペアでデータを管理するDB

Memcache, DynamoDB, Riak, Redis…etc

それぞれ全て特徴・使い方・用途が違う

KEY VALUE

A_AGE 21

A_AGE 21

Page 35: サーバーのおしごと

Memcached

Page 36: サーバーのおしごと

Application

Service

ELB

DATA

Page 37: サーバーのおしごと

Application

Service

ELB

DATA

GET

SELECT

Page 38: サーバーのおしごと

特徴

オンメモリなので非常に高速 (RDBの十倍程度)

シンプル

Page 39: サーバーのおしごと

注意点キャッシュロジックをアプリケーションに実装が必要

更新時に削除を忘れると古いデータが返る

キャッシュのデータをもとにRDBを更新してはならない

TTL以前に消える可能性

キャッシュ間のサイズが大きく違うとメモリ効率悪化

永続化は出来ない(データはメモリ上にのみ存在)

Page 40: サーバーのおしごと

Redis

Page 41: サーバーのおしごと

特徴インメモリ型KVS

永続化可能

レプリケーション可能

データ型 (LIST, SET, SORTED SET, HASH) を持つ

複雑な操作をアトミックに実行可能

Page 42: サーバーのおしごと

LIST

A B C D

LPOP

Page 43: サーバーのおしごと

LIST

B C D E

RPUSH

Page 44: サーバーのおしごと

アトミックに実行とは

Page 45: サーバーのおしごと

原子性

コマンド結果が全て成功or全て失敗しかない事

操作の途中段階にならない。

Page 46: サーバーのおしごと

データベース分割

Page 47: サーバーのおしごと

Application

Service

ELB書き込み

Master Slave

暇…助けて!

Page 48: サーバーのおしごと

書込み性能の限界

Page 49: サーバーのおしごと

垂直分割

ID 体力 やくそう ジョブ

Player A 100 2 戦士

Player B 98 8 格闘家

Player C 20 0 魔法使い

Player D 0 10 僧侶

DB 1 DB 2 DB 3

Page 50: サーバーのおしごと

Application

Service

ELB

アイテム カード

Page 51: サーバーのおしごと

メリット

分割しても集計が容易

ユニーク制約が維持される

Page 52: サーバーのおしごと

デメリット

アイテムに負荷が集中したら対処できない

実際は分割をまたいだ処理が多い

Page 53: サーバーのおしごと

水平分割

体力 やくそう ジョブ

Player A 100 2 戦士

Player B 98 8 格闘家

Player C 20 0 魔法使い

Player D 0 10 僧侶

DB 1

DB 2

DB 3

Page 54: サーバーのおしごと

Application

Service

ELB Player1

Player2

Page 55: サーバーのおしごと

メリット

ほぼ均等に負荷が分散される

プレイヤーに閉じた処理はDBをまたがなくてすむ

Page 56: サーバーのおしごと

デメリット

集計が難しい

技術的難易度(フレームワークがサポートしないetc

ユニーク制約をかけれない

ID1のデータが分割した数だけ存在する

Page 57: サーバーのおしごと

データが壊れる時

Page 58: サーバーのおしごと

GET A

3

SET A 5a = a + 2

a = 3

set(“a”, a)

A 3

A 5

DBユーザー1

Page 59: サーバーのおしごと

DBユーザー1

GET A

3

SET A 5

a = a + 2a = 3

set(“a”, a)

A 3

A 5

ユーザー2

GET A

3

SET A 5a = a + 2

a = 3

set(“a”, a)A 5

A 3

3+2+2=5

Page 60: サーバーのおしごと

ロック

Page 61: サーバーのおしごと

DBユーザー1GET A & LOCK

3

SET A 5a = a + 2a = 3

A 3

A 5

ユーザー2

GET A & LOCK

5

SET A 7 a = a + 2a = 5

A 7

A 3

Page 62: サーバーのおしごと

RDBでは標準的

SELECT FOR UPDATE

デッドロックの危険性

ロック順番を統一する

Page 63: サーバーのおしごと

CAS

Page 64: サーバーのおしごと

DBユーザー1

GET A

3, ver02

SET A 5, ver02

a = a + 2a = 3

A 3

A 3

ユーザー2

GET A

3, ver02

SET A 5, ver02

a = a + 2a = 3

A 5

A 3

ver02

ver02

ver02

ver03

A 5ver03

失敗

Page 65: サーバーのおしごと

DB ユーザー2

GET A

5, ver03

SET A 7, ver03

a = a + 2a = 5

A 5

A 5ver03

ver03A 7

ver04

失敗したので最初からリトライ

Page 66: サーバーのおしごと

Memcache, Redisなどで使用可能

ロックが無いので処理が止まらない

繰り返すロジックを自分で実装する必要が有る

永遠に失敗し続ける可能性がある

リトライ回数に上限をつける

Page 67: サーバーのおしごと

まとめ

負荷対策にはスケールアップとスケールアウトがある

データ読み込みに関しては手段が多い

KVSはそれぞれのソフトで目的・使い方が違う

書き込みの分散は整合性との戦い

Page 68: サーバーのおしごと

ご清聴ありがとうございました