tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

mongodbで行動ログ的なサンプルデータを1億件ほどつっこんで見るスクリプト

はじめに

mongodbでいろいろ試したいけど結構なデータ件数ないと試せないことってありますよね。
今回はそんな時用にサンプルデータを1億件ほどつっこむスクリプトを書いてみたのでメモっておきます。

想定

つっこむログの内容ですがこんな感じを想定してみました

1.ユーザが数人いる
2.webが分散されてて数台のhostからログが来る
3.ゲームやらなんやらでポイントGET。GETしたタイミングでポイントの総計と内訳ログがinsertされる
4.内訳は、GETしたポイント + ボーナスポイント(GETしたポイント×0.05※消費税みたいな)

構造

想定するログの1レコードの構造です

{
"_id" : ObjectId("533006e0a2f90fb093680dc6"),
"info" : { "uid" : "id01", "ts" : "2014-03-24 00:00:00", "hn" : "sv2" },
"val" : { "total" : 87, "add" : [ 83, 4 ] }
}
※かんたんな説明
id…mongo
info…基本情報(uid:ユーザID、ts:日付、hn:ホスト名)
val…詳細情報(total:ポイントの累計、add:加算されたポイント内訳(付与ポイント、ボーナスポイント))

スクリプト

書いたスクリプトはこんな感じ
mongodb_script_insert_act_log_sample.js

もし件数(人数)を減らしたい場合は
3~12行のどれかを任意にコメントアウトすれば減ります

入れてみる

実行してみると、けっこーーーな時間かかりますw
マシンスペックによるとは思いますが、1億件入れるのに60分くらいかかりました。

======== マシン情報 ========
# uname -a
Linux hoge.co.jp 2.6.32-431.el6.x86_64 #1 SMP Mon Dec 16 12:35:39 JST 2013 x86_64 x86_64 x86_64 GNU/Linux

# cat /proc/cpuinfo| egrep "name|siblings" | head -n 2
model name      : Intel(R) Xeon(R) CPU E5-2440 0 @ 2.40GHz
siblings        : 12

# cat /proc/meminfo | grep MemTotal
MemTotal:       12144800 kB

======== つっこむ ========
# mongo sample insert_act_log_sample.js
MongoDB shell version: 2.4.8
connecting to: sample
-->id01
-->id02
        id02:100000
        
・・・省略(この間60分くらい)・・・

======== かくにん ========
# mongo sample
MongoDB shell version: 2.4.8
connecting to: sample

※約1億件はいってる
>db.actlog.find().count()
105727766

> db.actlog.find().limit(5)
{ "_id" : ObjectId("53303e4287945ceb7c87f80e"), "info" : { "uid" : "id01", "ts" : "2014-03-24 00:00:00", "hn" : "sv3" }, "val" : { "total" : 57, "add" : [  55,  2 ] } }
{ "_id" : ObjectId("53303e4287945ceb7c87f80f"), "info" : { "uid" : "id01", "ts" : "2014-03-24 00:00:00", "hn" : "sv1" }, "val" : { "total" : 107, "add" : [  48,  2 ] } }
{ "_id" : ObjectId("53303e4287945ceb7c87f810"), "info" : { "uid" : "id01", "ts" : "2014-03-24 00:00:01", "hn" : "sv1" }, "val" : { "total" : 120, "add" : [  13,  0 ] } }
{ "_id" : ObjectId("53303e4287945ceb7c87f811"), "info" : { "uid" : "id01", "ts" : "2014-03-24 00:00:03", "hn" : "sv1" }, "val" : { "total" : 121, "add" : [  1,  0 ] } }
{ "_id" : ObjectId("53303e4287945ceb7c87f812"), "info" : { "uid" : "id01", "ts" : "2014-03-24 00:00:04", "hn" : "sv1" }, "val" : { "total" : 163, "add" : [  40,  2 ] } }

ついでに

ついでといってはなんですが、入れてみたときの感じもメモ

ディスク容量
  • データつっこみ前
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       537G   89G  421G  18% /
tmpfs           5.8G     0  5.8G   0% /dev/shm
/dev/sda1       485M   39M  422M   9% /boot
  • データつっこみ後

結構ディスク容量は使う感じですね

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       537G  115G  395G  23% /
tmpfs           5.8G     0  5.8G   0% /dev/shm
/dev/sda1       485M   39M  422M   9% /boot
mongoのデータディレクトリ
  • データつっこみ前
# ls -lh
合計 81M
drwxr-sr-x 2 root wheel 4.0K  3月 24 22:29 2014 _tmp
drwxr-sr-x 2 root wheel 4.0K  3月 24 23:08 2014 journal
-rw------- 1 root wheel  64M  3月 19 17:45 2014 local.0
-rw------- 1 root wheel  16M  3月 19 17:45 2014 local.ns
-rwxr-xr-x 1 root wheel    6  3月 19 17:45 2014 mongod.lock
drwxr-sr-x 2 root wheel 4.0K  3月 24 15:44 2014 test
  • データつっこみ後

2Gごとのファイルがかなりできあがってます。
81Mから27Gになってます

# ls -lh
合計 27G
drwxr-sr-x 2 root wheel 4.0K  3月 24 22:29 2014 _tmp
drwxr-sr-x 2 root wheel 4.0K  3月 24 20:12 2014 journal
-rw------- 1 root wheel  64M  3月 19 17:45 2014 local.0
-rw------- 1 root wheel  16M  3月 19 17:45 2014 local.ns
-rwxr-xr-x 1 root wheel    6  3月 19 17:45 2014 mongod.lock
-rw------- 1 root wheel  64M  3月 24 22:29 2014 sample.0
-rw------- 1 root wheel 128M  3月 24 19:20 2014 sample.1
-rw------- 1 root wheel 2.0G  3月 24 19:52 2014 sample.10
-rw------- 1 root wheel 2.0G  3月 24 19:59 2014 sample.11
-rw------- 1 root wheel 2.0G  3月 24 22:30 2014 sample.12
-rw------- 1 root wheel 2.0G  3月 24 20:08 2014 sample.13
-rw------- 1 root wheel 2.0G  3月 24 20:15 2014 sample.14
-rw------- 1 root wheel 2.0G  3月 24 20:16 2014 sample.15
-rw------- 1 root wheel 2.0G  3月 24 20:15 2014 sample.16
-rw------- 1 root wheel 256M  3月 24 19:21 2014 sample.2
-rw------- 1 root wheel 512M  3月 24 19:23 2014 sample.3
-rw------- 1 root wheel 1.0G  3月 24 19:24 2014 sample.4
-rw------- 1 root wheel 2.0G  3月 24 19:28 2014 sample.5
-rw------- 1 root wheel 2.0G  3月 24 20:12 2014 sample.6
-rw------- 1 root wheel 2.0G  3月 24 19:54 2014 sample.7
-rw------- 1 root wheel 2.0G  3月 24 19:46 2014 sample.8
-rw------- 1 root wheel 2.0G  3月 24 19:45 2014 sample.9
-rw------- 1 root wheel  16M  3月 24 22:30 2014 sample.ns
drwxr-sr-x 2 root wheel 4.0K  3月 24 15:44 2014 test
sar -u

該当の時間(赤文字)らへんで結構がんばってる感じが出てます

# sar -u
18時00分01秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
18時10分01秒     all      0.39      0.00      0.24      0.14      0.00     99.23
18時20分01秒     all      0.64      0.00      0.30      0.09      0.00     98.97
18時30分01秒     all      1.36      0.00      0.52      0.09      0.00     98.04
18時40分01秒     all      0.36      0.00      0.22      0.10      0.00     99.33
18時50分01秒     all      0.75      0.00      0.29      0.26      0.00     98.70
19時00分01秒     all      0.33      0.00      0.21      0.08      0.00     99.37
19時10分01秒     all      1.45      0.00      0.28      0.69      0.00     97.58
19時20分01秒     all      0.33      0.00      0.22      0.10      0.00     99.34
19時30分01秒     all      9.80      0.00      0.61      3.35      0.00     86.24
19時40分01秒     all      9.88      0.00      0.62      2.76      0.00     86.75
19時50分01秒     all     10.44      0.00      0.50      1.92      0.00     87.13
20時00分05秒     all     10.13      0.00      0.60      2.29      0.00     86.97
20時10分01秒     all      9.83      0.00      0.44      2.12      0.00     87.60
20時20分02秒     all      7.12      0.00      0.42      1.34      0.00     91.11
20時30分01秒     all      0.34      0.00      0.22      0.09      0.00     99.35
20時40分01秒     all      0.34      0.00      0.22      0.09      0.00     99.35
20時50分01秒     all      0.32      0.00      0.21      0.09      0.00     99.38
21時00分01秒     all      0.32      0.00      0.21      0.08      0.00     99.39
つっこみ中のuptimeとvmstat

ロードが結構あがって、当たり前な感じですが、sarとvmstat見るとio系が。。って感じですね。

# uptime
 19:41:27 up 94 days,  6:20, 29 users,  load average: 3.16, 1.45, 1.01

# vmstat -n 1 10
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0 256556 213108  82904 9193408    0    0     2     4    0    0  0  0 99  0  0
 1  0 256556 222472  82904 9193304    0    0     0     0 2241 1332  8  0 91  0  0
 1  0 256556 187140  82904 9193304    0    0     0     0 2684 3102  8  0 91  0  0
 2  0 256556 135740  82912 9198740    0    0  5376  1964 2912 2633 11  1 88  1  0
 1  0 256556 148636  82908 9146200    0    0 13572  5824 20045 3357 13  1 86  1  0
 1  0 256556 157192  82908 9122432    0    0     0     0 2652 2884  8  0 91  0  0
 2  0 256556 276324  82912 9134684    0    0 12660  4152 3791 2927 13  1 83  3  0
 1  0 256556 269908  82912 9142032    0    0  7104  3424 1919  839 11  0 89  1  0
 1  0 256556 251108  82912 9142000    0    0     0     0 2552 2928  8  0 92  0  0
 2  0 256556 207404  82916 9143352    0    0  1088   148 2698 2981  9  0 90  0  0

ってことで、今後はサンプルデータでいろいろ試してみたのも気が向いたら載せてみようと思います。