2010/10/25

redisのサービスへの投入



こんにちわ、ミツバチワークス stoneです。

今回は、前回、ベンチマークをとったredisをサービスに投入した、その方法について、ご紹介します。

1 redisのセットアップ


1.1 redisをインストール

redisは、2.0.2を使用しました。
redisのインストールは、
# tar zxvf redis-2.0.2.tar.gz
# cd redis-2.0.2
# make install
ですんなり出来ました。
コンパイルされたバイナリは、/usr/local/bin/以下にコピーされています。

1.2 コンフィグ

DECOLOGでは、ApacheとMySQLを除いて、daemontoolsを利用して運用しています。
そのため、redisのコンフィグは、デフォルトのredis.confから、以下の項目を修正してあります。
(デフォルトのredis.confは、redis-2.0.2ディレクトリにあります。)
daemonize no
loglevel notice
dir /var/lib/redis/
maxmemory 8gb
これを、/etc/redis.confに保存しておきます。

1.3 ユーザーとディレクトリを設定

redis用のアカウント/グループとディレクトリを設定しておきます。
# groupadd redis
# useradd -g redis -d /var/lib/redis -s /sbin/nologin redis
アカウントとグループは、設定する必要はないのですが、なんか習慣的に作ってます。

# chmod 755 /var/lib/redis
# find /var/lib/redis/ -type f -exec rm {} \;
(useraddで作られるファイルを削除)

# mkdir -p /var/log/redis
# chmod 1777 /var/log/redis
(ログ用ディレクトリ)

1.4 daemontools用の設定

DECOLOGのサーバーでは、daemontoolsでプロセス管理する場合、/serviceに直接ディレクトリやファイルを作成しません。
/etc/superviseというディレクトリを用意して、その下にディレクトリ/ファイルの実体を作成します。
今回の場合なら、
/etc/supervise/redis/run
/etc/supervise/redis/log/run
です。
これらの確認が終わった後、
# ln -s /etc/supervise/redis /service/redis
として、daemontoolsのプロセス管理に制御を任せます。
以下では、話を簡単にするため、/serviceでのパス表記にしておきます。

file: /service/redis/run
#! /bin/sh
exec /usr/local/bin/redis-server /etc/redis.conf

file: /service/redis/log/run
#! /bin/sh
exec /usr/local/bin/setuidgid redis /usr/local/bin/multilog n20 s16777215 /var/log/redis
redisのログにもタイムスタンプが記述されるため、multilogのオプション"t"はつけませんでした。

2. redisの起動/シャットダウン


2.1 起動

daemontoolsが動いているので、/service/redis/runが作成された時点で、redisは起動されます。
手動オペレーションで、redisを落とした場合は、
# svc -u /service/redis
で、redisが起動されます。

2.2 シャットダウン

該当するドキュメントを見つけられなくて、結局、ソースコードを追っかけてわかったのですが、redisは、TERMシグナルを受け取ると、データのsnapshotを保存した後にプロセスを終了します。
なので、
# svc -t /service/redis
で、キレイにシャットダウンすることが出来ます。

2.3 再起動

単純に、
# svc -tu /service/redis
で、再起動をかけます。

再起動にかかる時間は、ほぼsnapshotを保存する時間です。
なので、事前にログを見て、所要時間を予測することが可能です。
いままでの実績で言うと、30Mbytes程度なら1秒以下、1〜2GBytesでは30秒程度かかります。

3. 監視項目


サービスに投入する前に、状態監視できるようにしておきます。
※DECOLOGでは監視にZABBIXを使っています→http://tech.dclog.jp/2010/09/decolog.html

数年前にZABBIXを導入してから、状態が監視できない状態で何かオペレーションするというのが、ものすごく怖く感じるようになりました。
なにか、目隠し状態で作業しているような感覚です。
何か新要素を投入を決めるときは、「稼働状態を取得できる」というのも大事な要素になります。

3.1 状態の取得

redisには、redis-cliという便利なクライアントツールが用意されています。
これを利用して、稼働中のredisの状態を監視します。

redisには、infoというコマンドが用意されていて、redis-serverの状態を出力してくれます。
$ /usr/local/bin/redis-cli info
redis_version:2.0.2
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
process_id:27077
uptime_in_seconds:786661
uptime_in_days:9
connected_clients:1
connected_slaves:0
blocked_clients:0
used_memory:34944584
used_memory_human:33.33M
changes_since_last_save:4903
bgsave_in_progress:0
last_save_time:1287647443
bgrewriteaof_in_progress:0
total_connections_received:12550855
total_commands_processed:37684666
expired_keys:6830
hash_max_zipmap_entries:64
hash_max_zipmap_value:512
pubsub_channels:0
pubsub_patterns:0
vm_enabled:0
role:master
db1:keys=59136,expires=59136

1分ごとにredisにinfoコマンドを発行して、状態を取得します。
file: /etc/cron.d/redisstat
* * * * * root /usr/local/bin/redis-cli info > /var/log/redisstat.log.new; mv /var/log/redisstat.log.new /var/log/redisstat.log
一度、redisstat.log.newに出力してから、redisstat.logにmvしているのは、
「redis-cli info」がredisサーバーからの応答を待ってる間に、ZABBIXが値を取りにきて、おかしな値が出力されるケースがある為です。
今のところ、redisでは、そういうケースはありませんが、ApacheやMySQLでは、そういう、いわば「滞空時間」にZABBIXが値を取得しにくるケースに遭遇したことがあります。


3.2 ZABBIXに項目を追加

infoから出力されるデータのうち、used_memoryとconnected_clientsを監視することにしました。
zabbixへの項目追加は、以下のようになります。
UserParameter=redis.connections,grep connected_clients /var/log/redisstat.log | cut -d':' -f2
UserParameter=redis.used_memory,grep 'used_memory:' /var/log/redisstat.log | cut -d':' -f2

これ、より汎用的に
UserParameter=redis.stat[*],grep $1: /var/log/redisstat.log | cut -d':' -f2
でも、いいかもしれませんね。
今、思いつきました(笑)

3.3 スクリーンを作成

ZABBIX上で、上記の2項目の他に、
・ロードアベレージ
・ネットワークのin/out
をまとめて、スクリーンを作って、監視体制の整備は、完成です。



新しい要素を加える場合、だいたい上記のような流れで、監視体制までを準備してから、サービスへ投入しています。
今回、redisをサービスに投入した後に出くわしたトラブルについても書こうと考えていたのですが、サービス投入までの記述が思った以上の分量だったので、トラブルについては、次回以降にしたいと思います。

では、また次回に♪

2010/10/20

NoSQL redisとMySQLのベンチマーク比較

こんにちは、ミツバチワークス stoneです。

「NoSQL」という言葉を、最近知りました。
確かに、データベースをテーブルごとに小分けして行くと、トランザクションとか、SQLのjoinとか使わなくなって、DECOLOGでも、MySQLを単純なKey-Valueストア的な使い方をしている箇所がいくつかあります。

Key-Valueストアと言えば、DECOLOGでもmemcachedを使用していますが、memcachedのスピード感でデータが揮発しないというのは非常に魅力的です。
DECOLOGのデータ群の中でも、簡単なKey-Valueストアで、話がすむデータがいくつかあり、
現状のMySQLよりも速い方法があるのなら、ぜひ、試してみたいところです。

そこで、今回、hiroshiが見つけてきたredisがよさそうなので、「そもそも本当に速いの?」というのを、簡単なベンチマークを取って、試してみました。

このベンチマークの環境は、DECOLOGで使用しているものがベースになっています。
そのため、ツッコミどころはたくさんあると思いますが、

「DECOLOGの環境では、こういう結果でした」


というご紹介だという前提で、読み進めてください。


1. ベンチマークの環境


サーバーは、4台用意しました。
サーバーのハードウェアは、すべて同じで、
CPUIntel Xeon L5410 × 2
Mem12GBytes
HDD685G(RAID1)
Net100Mbps
という構成です。

サーバーA

ベンチーマークを取るサーバー
このサーバー上で、abを走らせます

サーバーB

Apache + PHPのサーバー
DECOLOGで、実際にサービスしているWebサーバーと
同じセットアップをしてあります。
関係ありそうなソフトのバージョンを上げておくと。。。
Apache
2.2.x(MaxClients 200)
PHP
5.2.x(APC 3.0.x)
MySQLへの接続
PEAR::DB
Redisへの接続1
owlient-phpredis-2.0.4-5
Redisへの接続2
Rediska0.5.0
と、なっています。

サーバーC

MySQLサーバー
バージョン: 5.0.x
ストレージは、InnoDB、BlackHole、Archiveを使用しました。
InnoDBのパラメーターのうち、スピードに関係ありそうなモノのは、
こんな↓感じで設定しています。
innodb_buffer_pool_size=9216M
innodb_flush_log_at_trx_commit=2
innodb_file_per_table

サーバーD

Redisサーバー
バージョン: 2.0.1
パフォーマンスに関係しそうな設定は、こんな↓ところでしょうか?
save 900 1
save 300 10
save 60 10000
appendonly no
vm-enabled no

2.ベンチマークの方法


サーバーAから、abコマンドで、
$ ab -c 200 -n 100000 http://server-b/path/to/benchmark/script.php
として、abの出力のうち、
Requests per second
という項目に注目しました。

また、事前に、MySQL、Redisともに12万件程度の、id(int) => value(int)という形式の
データを事前にストアしてあります。

3. テスト項目

3.1 インクリメントのテスト

idをキーにして、valueをインクリメントする、というのをテストしました。

SQLにすると、こんな↓感じです。
update counter set count_value=count_value+1 where id=?
Redisなら、incrコマンドですね。

3.2 insertのテスト

現在、Archiveエンジンでロギング+バッチで集計、としている部分を、
redisのincrで置き換えられないか?というのも試してみたかったので、
一緒にベンチマークを取ってみました。

4. PHPのredisインターフェースについて


redisのプロジェクトホームへ行くと、
Predis、Rediska、redis.php、phpredisの順で、PHPのインターフェースが記載されています。
Rediskaは、PHPのみで記述されていること、phpredisは、PECLのmemcacheに使用感が似ていたこと、
からこの2つを取り上げました。

5. ベンチマークの結果


さて、前置きはコレぐらいにして、ベンチマークの結果です。
それぞれ、5回試行して、最大/最小値をカット、中間値の3つの値の平均を取っています。

で、結果は、こんな↓感じでした。
MySQL
コマンドストレージreq/sec
updateBlackHole3650.94
updateInnoDB3204.03
insertBlackHole3400.94
insertArchive3435.64

Redis
コマンドクライアントreq/sec
incrphpredis6553.42
incrRediska2955.51


ついでに、select/getも各々1パターンだけとってみました。
エンジンreq/sec
MySQL(InnoDB)3699.17
redis(phpredis)6317.66

それぞれをグラフにするとこんな感じです。
図.コマンド/ストレージ


図.コマンド/クライアント




図.エンジン

6.感想


このベンチマークの結果、DECOLOGの環境では(←ここ、大事です)、redis+phpredisが頭抜けて速いことがわかりました。

また、ベンチマークを取っていたときは、
「すげーっ!!redis、速ぇーーーっ!!」と興奮していたのですが、
少し間を置いてから、冷静になって考えてみると、
・phpredisとRediskaの結果の対比
・RediskaとMySQLがほぼ変わらない
を考えると、PHPのコードが多分に影響してるように思えます。
MySQLの接続は、DECOLOGの歴史的な要因で、PEAR::DBですし。。。

が、「現状のDECOLOGの環境」をベースに考えれば、
やっぱり、redis+phpredisが断然速いので、redisをサービスへの投入することを決めました。
新しい要素の投入は、結構、この程度のノリでやってます。
実際にサービス投入/運用してみて、初めて見えてくる問題とかありますし。。。

7. サービスに投入してみたけれど。。。


この記事を書いてる時点で、redisをサービスに投入して、
うまく行った事例が1つと、うまく行かなかった事例が1つあります。

うまく行かなかった事例では、問題が2つ発生しました。
1つはパラメーターの調整で解決できたのですが、
もう1つの問題は解決できずに、サイトへのアクセスに影響が出るトラブルになってしまったので、
MySQLに戻しました。

うまくいった事例では、本当にスムースに、期待通りに稼働してくれています。
サーバーのロードアベレージもMySQLに比べて低めで推移してますね。

redisのサービスへの投入方法や、うまくいかなかった事例については、
次回以降に、ご紹介しようと考えています。

では、また次回に♪

2010/10/13

HadoopによるApacheのログ解析の実際


こんにちは、ミツバチワークス stoneです。

今日は、DECOLOGで行われている、Apacheのログ解析について、
ご紹介してみようかと思います。

現在、DECOLOGでは、リバースプロキシが8台あって、
その8台の1日のApacheのログは、全部で、200Gバイト以上になっています。
これを、13台のHadoopのスレーブノードで解析を行っています。

全体の流れとしては、
1) リバースプロキシからHDFSにログを転送
2) 解析用のサーバーで、HDFSにログの転送が終わるのを監視
3) ログの転送が終わったら、Hadoopを起動、解析
4) Hadoopの解析結果をデータベースに保存

以下では、各々のステップを個別に見て行くことにしますね。

1. リバースプロキシからHDFSにログを転送


当初、Hadoopのプロセスが立ち上がっていないと、HDFSにはアクセスできない、
と思い込んでいたので、解析用のサーバーが、
1) 各リバースプロキシからのログをscpで収集
2) 収集したログをHDFSへ
というステップを踏んでいたのですが、
このステップだけで、昼過ぎまでかかるようになったため、
現在では、リバースプロキシから直接HDFSへ展開するように変更しました。

Apacheのログは、cron.dailyで起動されるlogroateでローテーションがかかるので、
そのcron.dailyの最後にHDFSへの展開するスクリプトが起動するようになっています。

/etc/cron.daily/zz_log_to_hdfs.sh
#! /bin/sh

HOST=`hostname -s`
TODAY=`date +%Y%m%d`

HADOOP='/path/to/hadoop/bin/hadoop dfs'

HDFS_BASE='hdfs://hadoop-master:9000/accesslog'
LOG_FILE="$HDFS_BASE/$TODAY/$HOST"
SIGNUP_FILE="$HDFS_BASE/signup/$HOST"

LOCAL_SRC="/path/to/log/access_log.1"

$HADOOP -copyFromLocal $LOCAL_SRC $LOG_FILE
$HADOOP -chmod 777 $LOG_FILE
$HADOOP -touchz $SIGNUP_FILE
$HADOOP -chmod 777 $SIGNUP_FILE


2. 解析用サーバーで、HDFSにログの転送が終わるのを監視


各リバースプロキシから直接HDFSへ展開することで、時間は大幅に短縮できたのですが、
1点、問題がありました。
それは、
リバースプロキシからのログの転送がいつ終わったのか、わからない
という問題です。

そのため、ちょっと、工夫をして、HDFS上にsignupディレクトリというモノを作りました。
各リバースプロキシは、ログの転送が終わったタイミングで、
このsignupディレクトリにホスト名のファイルをtouchします。
前出のスクリプトの下から2行目でそのtouchをしています。
$HADOOP -touchz $SIGNUP_FILE
解析用のサーバーは、適当な時間に起動した後、このsignupディレクトリを監視して、
すべてのサーバーが出そろった段階で、次のHadoopでの解析のステップに進みます。
(signupディレクトリは、転送が始まる前に事前に空にしています。)


3. Hadoopでの解析


3.1 Key-Valueのマッピング


ご存知のように、Hadoopでは、mapのステップで、
あるデータを「key => value」の形にマッピングして、
reduceのステップで、同一のkeyの値を取りまとめてくれます。

DECOLOGでは、以下のような切り口でログ解析をしています
・1時間ごとのHit数、PV数
・ページグループ毎のPV数
・携帯キャリアごとのHit数

具体的なキーは、こんな感じです。
YYMMDD-hourly_hit-HH (時間ごとのヒット数)
YYMMDD-hourly_page-HH (時間ごとのPV数)
YYMMDD-page_group-PAGE (ページグループごとのHit数)
YYMMDD-page_group_pv-PAGE (ページグループごとのPV数)
YYMMDD-user_agent-CARRIER (携帯キャリアごとのHit数)

アクセスされたURLから、
・ページビューなのか画像なのか?
・ページビューの場合、HTTPステータスが200か?
・どのページグループに属するURLか?
を判別しています。

なので、例えば、記事ページへのアクセスがあった場合、
aaa.bbb.ccc.ddd - - [13/Oct/2010:11:05:09 +0900] "GET /en/00000/00000 HTTP/1.1" 200 999 "-" "DoCoMo/2.0 D905i(c100;TB;W24H17)" "-"
という感じのログになるのですが、これをmapperに通すと、
20101013-hourly_hit-11    1
20101013-hourly_page-11    1
20101013-page_group-Entry    1
20101013-page_group_pv-Entry    1
20101013-user_agent-docomo    1
という結果が出力されることになります。

3.2 mapper/reducerの記述


実際のmapperとreducerは、Javaではなく、Perlで記述しています。
Perlで記述したスクリプトをhadoop-streamingを利用して、
mapper/reducerとして、稼働させています。

hadoop-streamingは、データの入出力に標準入力/標準出力を使用するため、
動作の検証は、実際のログデータをmapperに標準入力から流し込んだときに、
想定通りの出力が得られるか?で、行うことが出来ます。
(reducerは、そのmapperの出力を流しこめばOKです。)


4.解析結果をDBに保存


Hadoopの解析結果は、「part-0001」みたいなファイル名でHDFS上に出力されているのですが、
これをうまい具合に取り出す方法がよくわかっていなくて、
現状、以下のようにして、ローカルに取り出しています。
$HADOOP dfs -cat "$OUTPUT_DIR/part-*" | grep $YESTERDAY > $TMP_FILE

保存するデータベースは、以下のようなテーブル定義になってます。
(データベースは、MySQLです)
カラム名データタイプ
log_datechar(8)
sectionenum("hourly_hit", "houly_page" ...)
section_keyvarchar(255)
log_countint unsigned

解析結果は、上記のmapperの出力に準じた形になっているので、
20101013-hourly_hit-11    999
と出力されていて、これを、
log_date: 20101013
section: houry_hit
section_key: 11
log_count: 999
と保存しています。


ごく初期の段階では、webalizerを使って、サーバー1台で解析をしていたですが、
解析が夜までかかるようになったため、Hadoopによる解析に切り替えました。
当時(2009年4月ごろ)は、サーバーの負荷対策で、ほぼ毎日のようにサーバーの増設や、役割の変更、
それに伴うプログラムの修正を行っていました。
その際、その対策の根拠となるのが、前日のZABBIXのグラフとアクセス解析の結果でした。
なので、アクセス解析が夜までかかると、負荷対策の立案にとても困った記憶があります。
参考までに、切り替えを行ったタイミングでは、1日あたり、だいたい4700万PV/2億6000万Hitでした。
(ログのサイズは、データが残っていませんでした。)
現在は、1日あたり、だいたい2億PV/15億Hitなのですが、お昼までには解析が終了しています。


蛇足ですが。。。。。。。。。。。。。
ウチでは、このシステムを「HAL」と読んでます。
「Hadoop for Apache Log」の頭文字をとって「HAL」としていますが、
本当は、HAL9000からパクって、「Hadoop for なんちゃら」は、
後からこじつけました。
が、他の年下のエンジニアからは、「何スか?HAL9000って?」と言われ、
ジェネレーションギャップを感じました。
(え?知らない方が多数派ですかね、これって?)

では、また次回に♪

2010/10/06

LogWatchが多すぎる!!

こんにちは。
ミツバチワークスで技術責任者をしています、stoneと申します。
先駆けてブログを開設・投稿してくれていたhiroshiが、
ハンドルネームで名乗っているので、自分もハンドルネームで名乗ってみることにしました。
なかなかに気恥ずかしいですね、これ。(笑)



さて、とても幸運なことに、ここ数年というもの、DECOLOGというサービスは、
ユーザー数/トラフィックともに順調に伸びて行っている状態で、
その要求に応える為に、サーバーの増設も毎月のようにおこなっています。

当初、DECOLOGは、たった1台のサーバーで運営されていました。
現在では、300台以上のサーバーで構成されています。
もちろん、それ以前に、その規模のサーバー群を扱ったこともないですし、
まさか、自分が100台以上のサーバーで構成されるサービスに関わるなんて、
夢にも思ってませんでした。

台数が増えるにつれ、数台での運用していた頃には想像できなかったことが、
いろいろ出てくるのですが、今回は、そんな「想像できなかったこと」のうちの
1つを紹介したいと思います。



現在、DECOLOGを構成するサーバー群のログの監視には、LogWatchを利用しています。
ご存知のようにLogWatchは、dailyでレポートメールを送ってきてくれるのですが、
10数台ぐらいまでは、毎朝、異常がないか、目視でレポートメールを確認をしていました。

が、これが、台数がふえるにつれ、LogWatchのチェックだけで、
かなりの時間が必要になってきてしまうんですね。
そして、ついには、もう、目視では、チェックしきれないほどの量になってしまいました。
連休明けや、夏休み/冬休み明けともなると、LogWatchだけで、
1000通を超えることもありました。
問題に直面してみれば、至極当然の結果なのですが、自分には、想像の範囲外の問題でした。

もう、チェックし切れないなら、レポートを切ってしまえばいいのですが、
「もし何か見落としがあったら。。。」と思うと、バチンと切ってしまう勇気も持てませんでした。

そこで、考えたのが、今、ウチで使っている「LogWatch Watch」(笑)です。
だいたい、こんな↓流れで動いてます。
  • LogWatchのレポートメールをLogWatch Watchが動いているサーバーにも送信
  • メールを受けると、フィルタリングプログラムが起動
  • フィルタリングプログラムには、あらかじめ、無視していい記述を登録しておき、
    それから漏れた記述をデータベースに保存
  • Webインターフェースを用意して、登録外の記述をチェック
実際のフィルタリングは。。。。
  • Cron: run-parts /etc/cron.(hourly|weekly|daily)を無視
  • Diskspace: 90%以上になったら、データベースに登録
  • sshd: "SFTP subsystem requests"を無視
とった感じで、登録する/無視するの判断をしています。

これを作って、実際に使ってみると、思った以上に便利でした。
1日数百行のチェックから、1日50項目以下のチェックですみます。

実際の画面は、こんな↓感じです。


現在は、時間の合間を見つけて、改良を進めて、キーボードショートカットで動くようになっています。
j: 下へ
k: 上へ
x: 項目を削除
m: 項目を保護(削除できないように)
とviライクな操作感で、サクサクとチェック・削除をしています。

DECOLOG本体での機能追加や修正のプログラミングは、
バグを仕込んでしまうと影響がとても大きいから、
一定以上の緊張感をもって臨んでいるのですが、
こういう「まかない」的なプログラムを書いてるときは、
その緊張感から解放されて、本当にプログラミングが楽しく感じられます。
自分勝手にイメージして、自分勝手に実装できますしね。(笑)


他にも、問題に直面するまで想像できなかったことに、
  • クラスCのIPアドレスが足りなくなる
  • L2/L3のスイッチの限界値に行き当たる
などあるのですが、これらは、また、機会があったら、 後日、ご紹介することにしますね。 

では、また次回に

仲間募集のお知らせ

2011/03/02 追記)募集要項を公開しました。
2012/02/15 追記)本ページの最後に「募集しているのってエンジニアだけなの?」を追加しました。

こんにちは!hiroshiです。

先に、今週はZABBIXの続きじゃなくなりました。すみません。。。

今回は仲間本格募集のお知らせです。

本格募集といっても「募集要項はこれです。気に入った方は面接に応募してください。」というノリではないです。

「まずはお話してみませんか?」というノリです。

「もっと違うことやりたいなー」とか「ああいうことやりたいんだよなー。でも今の会社じゃ難しいよなー」という人はたくさんいると思うんです。

でも、どこか興味のある会社を見つけたとしても、本当にその会社ことを知ることができるのは面接の場か、もしかしたら就業してから、ということもめずらしくないと思うんです。

興味を持った会社に自分の知り合いの人でもいれば、その人からいろいろ聞けたりするかもしれません。でも、うちのような小さな会社ではそういうこともないでしょう。特にぼくたちは「中の人」ですから(笑)。

なので、まずぼくたちと知り合って、外側からは見えない「どういう会社なの?どういうことができるの?どういう人たちが働いているの?」といった情報をみなさんが収集できる機会があったらいいかな、と思ったんです。

だから、最初は履歴書も職務経歴書も要りません。

現在就業中の方は、転職の意思が明確じゃなくても全然OKです。「ちょっと気になるなー」と思ったらお話してみましょう。

まずはTwitterからDMをいただければと思います。※メールアドレスも下に追記しました。
単発質問ならDMでやりとりをしてもいいですし、Twitterでおさまらないことならメールでやりとりしてもいいですし、ご希望者の数にもよりますが直接お会いすることもアリだと思っています。
お会いするときはさすがにプロフィールのご提示をお願いするかもですが。。

期限は決めてないので、この記事を見たかたはいつでも待ってますので遠慮なくお声掛けください。


2011/01/27の追記)
Twitterを使ってない方やDMに抵抗がある方など、メール連絡をご希望の方向けに連絡先メールアドレスを用意しました。こちらからお願いいたします
→→
tech-recruit[ AT ]328w.co.jp
※[AT]はアットマークに変えてください。


2011/02/02の追記)
お問い合わせいただく内容で多いものをFAQとして以下にまとめます。

FAQ

求める人材像は?


  • 「技術がスキ!」という人。
  • 「DECOLOGというサービスをスキになれそう」と自分で思えそうな人
  • 「DECOLOGを使ってくれているユーザーの立場でモノゴトを考えられそう」と自分で思えそうな人
です。


求めるスキルは?

一言でいうなら、どんな小さいサービス(ただの掲示板とか)でもよいので、一人でwebサービスを公開できるような知識があることが望ましいです。

プラスして、プログラミングだとかインフラとか、1つ深く興味を持っているモノがある、というのが良いイメージでしょうか。

特に

  • スマートフォンアプリケーションエンジニア
  • サーバサイドアプリケーションエンジニア
  • フロントエンドエンジニア

を絶賛募集してます。
AWSもかなりの高確率で触れることになります。



毎日どんなことやってんの?

・新規機能開発
・パフォーマンスチェック/改善対応
・不具合対応
など、60億PVのサービスを支えるために必要になるさまざまなタスクに取り組んでいます。

非常に多岐にわたり、かつ、優先順位がめまぐるしく変化するところが、特色だと思います。

特に恒常的に時間的に遅くまで働くことはないのですが、それ相応の知識がつくまでは、アサインされるタスクの範囲やレベルが上がっていかないので、未知のことを吸収する意欲=「技術がスキ」でないと、つまんなくてキツイと感じるかもしれません。

追記@2012-01-21)
昨年から新サービスの開発が始まっています。エンジニア担当は当時入社したばかりのtakaを中心として進行中しています。DECOLOGの運用開発のみでなく、新しいサービスの開発に関わる、というケースもあります。


社風ってどんな感じ?

わきあいあいとやっています。
ベンチャーではありますが、「とにかく気合で勝負!」みたいな体育会系的なノリはなく、どちらかというとフワっとした感じかもしれません。
ただ、これは個々人によって感じ方は違うと思うので、あまり参考にせず、ご自身の目で確認されたほうがよいです。

他チームとの交流的な話をすると、たとえばディレクター陣とかの他チームとかとも普通に飲みに行ったりする感じです。



あと、「社風」というより「TECHチーム風」になりますが、マンパワー使ったら負けだと思っています。
TECHチームが担う業務において、マンパワーで解決する話ってあまりないと思うんです。もし「けっこうマンパワーで解決してるよ!」ということがあったとすると、たぶんそれは、
・「サーバセットアップ手順はワードにまとめてあるからそれに従えば誰でもできるよ。いっぱいセットアップしなきゃいけないからマンパワーで解決だね!」

とか

・「こんな不具合起きたけど、この2つのコマンド打てばとりあえずしのげるからそれでいいか」みたいなものの積み重ねで、それが大きなものになり「2つのコマンド打つ要員が足りなくなったから増員!」

とか、そんな感じのコトが多いようなきがします。

このへんのことは
・「誰でもできることはシステムにやらせる」こと心がける
・一度起きた不具合や問題は二度起きないように、必ず一定の結果がでるまで優先的に原因追及/対応を行う
ことでカバーできることだと思います。

ワードにまとまるセットアップ手順だったら、それはプログラムになると思います。
「大きな障害」というのはあまり単体で存在はせず、小さな不具合が積み重なって起こるものだと思います。

なので、僕らはこの2点のことをいつも心がけています。
これが数百台のサーバを管理し、数十億PVを5人で支えられている大きな要員だと思っています。

マンパワー使ったら負けだから絶対に使いません!というわけじゃないんです。時にはそうすることがベストなこともあります。でも、負けは負けなので、それは後で必ずリベンジすべくゴニョゴニョやってます。

募集してるのってエンジニアだけなの? 

いえいえ、デザイナーやディレクターなど、ほぼ全職種に渡ってます。
とりわけ、以下の職種については超ウルトラ絶賛大募集中です。

1.ディレクター兼マークアップエンジニア
2.フロントエンドエンジニア

それぞれ必要な能力をステレオタイプに切り分けると

1.ディレクター兼マークアップエンジニア
ディレクション・デザイン > HTML/CSS/JSの知識があり、できればある程度構築できること

2.フロントエンドエンジニア
昔で言えばコーダーと呼ばれてた人たちですが、HTMLだけでなく、CSS・JSの高度な知識を必要とします。
※HTML/CSS/JSの知識があり構築できること


こちらもぜひご応募ください!