More Related Content
Similar to 初心者向け負荷軽減のはなし (20)
初心者向け負荷軽減のはなし
- 2. 自己紹介
株式会社NDPマーケティング
メディア事業部 本部長兼CTO
大西 貴聡
twitter @taka0024
Facebook taka0024
はてなID taka0024jp
主な仕事
Webサイトのプロデュース、 プランナー、ディレクション、マネージメント、S
テスト、サイト運営、企画作成、コンサルティング、flash作成、画像作成、コーディン
- 3. 宣伝①
NDPマーケティングの主な事業
• リスティング広告全般(PC、モバイル)
• SEO キャッシング
• 各種アフィリエイト リスティング
• 各種メディア運営 リスティング
• スマフォ向け広告媒体
SEO
キャッシングす
るならどこが良
いだろう?
リスティング
- 4. 宣伝② ツイナビアプリにて絶賛公開中
デザインはテスト中のモノです。
- 5. はじめに
• 今日話すのは初心者向けの内容となります。
– 負荷軽減を今から進めるに当たり、どんな部分に着
目すべきかを話します。
• 負荷軽減は色々なコスト削減に繋がります。
• 様々なアプローチでバランスが大事となりま
す。
– プログラミングだけでは完結しません
– DBだけ見るものでもありません
– クラウドだけでは解決しません。
• サーバーサイドとクライアントまでの全てが対
象です。
– つまり、実行される環境を全て見る必要がありま
す。
- 10. おことわり
• あまり今回はソースコードに関する説明はしま
せん。(プログラムコードに期待していた方ス
イマセン)
• 概要などに留めている為、コアな話は少ないで
す。
• LAMPの構成の話をしますが他の環境下でも互換
性がある様に話す様努めます。
(nginx+phpのカリカリの構成を期待してる方ゴ
メンナサイm(__)m)
- 20. DBの垂直分散と水平分散とは・・・。
• 垂直分散とは
全てのテーブルを列単位で見て分割する事
αテーブル
A~Eカラム F~Zカラム
サーバー1 サーバー2
α -1 α -2
テーブル テーブル
•JOINが苦手(どうしてもJOINしたいテーブル同士は同じサーバー内にしなければならな
•元々使っているテーブル数が多い場合には有効な場合もある
•負荷の状況に応じて、分散計画を立てやすいので、都度変更に応じられる
(ただし、本来の仕様を必要に応じて変える事が出来ない場合は、それ以上望めない)
- 21. DBの垂直分散と水平分散とは・・・。
• 水平分散とは
テーブルを行単位で見て分割する事
1~1000行 サーバー1
β -1テーブル
βテーブル
サーバー2
β -2テーブル
1001行~
•元々取り扱うデータ量が多いテーブルで有効
•分散方法(パーティション)をレンジ、リスト、ハッシュなどから選べるが、
mysqlの場合上限は1024個まで
•DB自体の機能として実装してないものもある。
- 25. 今ならこうするDB負荷分散1
• マスタースレーブ構成+ memcached
当然、書き込み負荷が高い場合は有効的ではありません。
MySQLだったら・・・。
master
masterはブラックホールエンジンを
使う
slave slave masterのバイナリログ書き出し場所
をRAMディスクとする(MySQLの場
合)
ランキングなどの再生成が可能で、
memca 参照が多くて揮発性の高いデータなどを
定期的にキャッシュ生成させる
ched
(マスタ系のデータはマスタ更新時にキャッシュ化させ
るなど、タイミングが超重要!)
当然sessionはmemcachedを使いDBに格納なんてしません!
- 26. • 水平分散によるマルチマスタ構成
master slave ユーザー毎に使うマスターを変える
為、
1 1 中間的にハッシュ用途のDBを用意
(HASH) 参照先を動的に替えられる様にする
DB サーバーを増やした場合は、
ハッシュの値を更に分散するだけで
master slave 対応が早くできる
2 2
key-value ストアがオススメ
•TokyoCabinet / TokyoTyrant
•Kyoto Cabinet
•MongoDB
などなど・・・。
- 31. 改善候補のSQLに対して
• ①の場合
– SQL構文自体を見直し、改善点を探る。
(この時ORマッパーを使っているシステムだと最
悪!)
– テーブル構造に誤りがないかを探る。
(当然JOIN句が多いものは必然的に出てくる)
– 計画的にindexを再生成する
• ②の場合
– memcacheに格納出来そうな場合は、それを利用する
- 33. サーバー構成
AWS内
Webサーバー DBサーバー
(master)
ロードバランサー
DBサーバー
(slave)
Webサーバー DBサーバー
(slave)
ロードバランサーを除く全てのサーバーは64bit構成
点線表記はオートスケールで増えるサーバーとアクセス構成
VPS ×20台
- 35. 開発時に意識した点
• ゲーム内でキーワードが含まれるツイート数を
ゲーム実行時から60分前までの有効数としてカ
ウントする
• AWSを使ってクラウド環境を確保したので、ト
ラフィックによる従量課金のコスト
(さくらのクラウドがあれば・・・。)
• フューチャーフォン向けのサービスなので、携
帯までのパケットの流れ
(いまさらフューチャーフォンですが・・・。)
- 38. 具体的なテクニック( HTMLを徹底的に圧縮 )
• Smartyのプラグインを使った場合の例です。
<?php
function smarty_outputfilter_cutpacket($output, &$smarty){
$output = preg_replace('/ss+/',' ',$output);
$output = preg_replace('/[tnr]/','',$output);
$output = preg_replace('/<!--.*-->/U','',$output);
$output = mb_convert_kana($output, 'ka', 'SJIS-win');
return $output;
}
?>
- 39. 具体的なテクニック(画像サーバーに振り分け
る)1
<?php
function smarty_function_imgserver($params, &$smarty)
{
return imgserver::get_imgserver();
}
class imgserver
{
private static $list = array('http://01. hoge.jp', 'http://02.hoge.jp');
private static $server = null;
public static function get_imgserver()
{
if ( !self::$server && is_array(self::$list) && count(self::$list) ) {
self::$server = self::$list[mt_rand(0,count(self::$list)-1)];
}
return self::$server;
}
}
?>