7. サーバー構成
ユーザーアクセス
Load Balancer
WEB MySQL Memcached LVS admin
WEB MySQL Memcached LVS admin
WEB MySQL Memcached
WEB MySQL
WEB MySQL
ログ集積
マイニング用DB
マスター1台
スレーブ x台
バックアップ1台
管理用アクセス
※データベースは分割する場合もある
16. 各種データと集計方法(4)
課金UU(日別・時間帯別)
• 課金したユーザー数を集計
sales
id
int
user_id
int
coin
int
created
int
SELECT count(distinct user_id) FROM sales
WHERE created
BETWEEN 123456 AND 234567
17. 各種データと集計方法(5)
ページビュー(PV)(日別)
• まず当日のページビューログのカウントし、
結果をバッチ処理でDBに入れておく
pageviews.20100822.log
Aug 22 00:01:02 app_a [pageview]u=12345,page=home
Aug 22 00:01:05 app_a [pageview]u=6789,page=item_shop
...
pageviews_cron.sh
...
perl -wnl -e '/,p=(.+?),/ and print $1;' /var/log/httpd/pageviews.THISDAY_YMD.log ¦
sort ¦ uniq -c ¦ perl -wn -e "s/s+/,/g and print "$THISDAY_UNIX" and print $_ and
print "n";" > /tmp/accesspv.csv
mysql -h admin_master -u datamining -p -e 'LOAD DATA LOCAL INFILE "/tmp/
accesspv.csv" INTO TABLE datamining.pageviews FIELDS TERMINATED BY ","'
...
18. 各種データと集計方法(5)
ページビュー(PV)(日別)
• そのテーブルを使って結果を取得
pageviews
time
int
page_name
varchar
pv_count
int
SELECT pv_count FROM pageviews
WHERE time = unix_timestamp( 2010-08-22 00:00:00 )
AND page_name = hoge ;
19. 各種データと集計方法(6)
ユニークユーザー数(UU)(日別)
• まず当日のページビューログを集計し、
結果をバッチ処理でDBに入れておく
pageviews.20100822.log (さっきと同じ)
Aug 22 00:01:02 app_a [pageview]u=12345,page=home
Aug 22 00:01:05 app_a [pageview]u=6789,page=item_shop
...
uu_cron.sh
...
perl -wnl -e '/[pageview]u=([0-9]+?),/ and print $1;' /var/log/httpd/pageviews.
$THISDAY_YMD.log ¦ sort ¦ uniq -c ¦ perl -wn -e "s/s+/,/g and print "$THISDAY_UNIX" and
print $_ and print "n";" > /tmp/accessuu.csv
mysql -h admin_master -u datamining -p -e 'LOAD DATA LOCAL INFILE "/tmp/accessuu.csv"
INTO TABLE datamining.uniqueusers FIELDS TERMINATED BY ","'
...
22. 各種データと集計方法(8)
SQL負荷・実行時間
• SQLが実行された際に一定の割合(特定のサーバーのみ)でログを出力し、
結果をバッチ処理でDBに入れておく
sql.20100822.log
Aug 22 00:01:02 app_a [sql]place=home
(10),count=10,time_sum=0.1,time_min=0.01,time_max=0.5,host=m1,query=SELECT id
FROM users WHERE id = 12345
Aug 22 00:01:03 app_a [sql]place=top
(15),count=20,time_sum=0.1,time_min=0.01,time_max=0.5,host=m1,query=SELECT
price FROM items WHERE id = 123
...
sql_cron.sh
...
長いので略
...
26. 各種データと集計方法(10)
カスタマーサポート用ログ
ユーザーの行動ログはアプリケーション(PHP)からsyslog関数で出力
useractivity.20100822.log
Aug 22 00:01:02 app_a [buyitem]user_id=12345,item_id=101,serial_id=98765
Aug 22 00:01:05 app_a [comment]user_id=6789,friend_id=1234,body=仲間申請ありがとう
...
データベースに存在するテーブル名と上記テキストログのキー名を一致させておき、自動でログをDBに入れる
useractivity_cron.sh
...
for x in `mysql -h $HOST -u $USER -p$PASS -e 'use datamining;show tablesG' ¦ perl -wnl -
e '/Tables_inS+s(S+?)$/ and print $1'`
do
/usr/local/bin/activitylog2csv --type $x --date $DATE --hour $HOUR
mysql -h $HOST -u $USER -p$PASS -e 'load data infile "/tmp/'$DATE'.'$HOUR'.'$x'.log"
into table datamining.'$x' fields terminated by ","' >> $LOG 2>&1
done
27. 各種データと集計方法(10)
カスタマーサポート用ログ
前ページのログの例だと、こんなテーブルを作っておくようにする
timeとuser_idのフィールドは必ず存在するように
buyitem comment し、インデックスを貼っておく。
time time
それ以降のフィールドはログ出力時にカンマ区切り
int int
にすることでcsvにしたときに順番にデータベースに
user_id user_id
入れられるので、途中からのフィールドの追加も問
int int
題ない。
item_id friend_id
int int
ログを追加するのに必要な作業はPHP側でログを出
serial_id body
力することと、データベース側でそれに合わせた
bigint varchar
テーブルを作成するだけ。
28. 各種データと集計方法(10)
カスタマーサポート用ログ
Model(右図)とController(下図)
アクションの引数にテーブル名が入る appname/models/cslog.php (CakePHP)
この他、config/bootstrap.php(設定ファイル)でテー <?php
ブル名やフィールド名と日本語名をマッピングしておく class Cslog extends AppModel{
var $name = 'cslog';
var $useTable = false;
appname/controller/cslog_controller.php (CakePHP) var $useDbConfig = 'datamining';
<?php }
class CslogController extends AppController {
var $uses = null;
(中略)
function view($modelname=null) {
if(!$modelname){ ※関係者しかアクセスしない用途のた
$this->redirect(array("action"=>"index")); め、セキュリティが甘いです。外部公
} 開用のコードに使わないでください
App::import('Model','Cslog');
$cslog = new Cslog('cslog',$modelname,'datamining');
(以下略)