influxdbが起動できなくなった時に内部のleveldbを初期化する方法

最近巷でチラチラ見かけるinfluxdbが気になっていて、試しに触ってみていて、本当はインストールと設定してサンプルで遊んでみるエントリを書こうと思ったのだけど、そっちは色々いじってるうちにまとまりがないかんじになってきたので、とりあえずいじってるうちに見つけたバッドノウハウでも公開しておこうかと。

先に断りを入れておくと、これは正しい対処法とかではなくて、やってみたらうまくいったというレベルの話なので正しい方法がわかる人は教えて下さい。(エライ人)

事象としてはinfluxdbのサンプルとして以下のQiitaの記事を参考に
InfluxDBとGrafanaとfluentdで、twitterデータのリアルタイム集計・可視化 - Qiita
twitterからデータ拾ってきてinfluxdbに突っ込むというのをやっていたのだけど、なんか高速にデータを突っ込むからか(?)influxdbがパニックで落ちて、再度起動しようとしてもrecoveryで整合性が合わずに起動できない状態になった。(keywordをhaskellとかで絞ったりすると流量減って落ちなくなるんだが)
試していたバージョンはinfluxdb v0.6.2で環境はMac OSX 10.9。

以下、パニックで落ちた時のinfluxdbの標準出力。

panic: runtime error: index out of range

goroutine 21 [running]:
runtime.panic(0x4447300, 0x49cf3b7)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/runtime/panic.c:266 +0xb6
datastore.(*LevelDbShard).Write(0xc2101761c0, 0xc2101c3730, 0x9, 0xc2101c6190, 0x0, ...)
	/private/tmp/influxdb-UzZW/influxdb/src/datastore/leveldb_shard.go:86 +0x86a
datastore.(*LevelDbShardDatastore).Write(0xc210079a80, 0xc21009a000, 0x0, 0x0)
	/private/tmp/influxdb-UzZW/influxdb/src/datastore/leveldb_shard_datastore.go:167 +0x116
cluster.func·006(0xc21009a000, 0xc200000001, 0x4fb5cb8, 0x1)
	/private/tmp/influxdb-UzZW/influxdb/src/cluster/cluster_configuration.go:1029 +0x239
wal.(*WAL).RecoverServerFromRequestNumber(0xc210077d80, 0xc200000001, 0xc210000098, 0x1, 0x1, ...)
	/private/tmp/influxdb-UzZW/influxdb/src/wal/wal.go:206 +0xa09
wal.(*WAL).RecoverServerFromLastCommit(0xc210077d80, 0xc200000001, 0xc210000098, 0x1, 0x1, ...)
	/private/tmp/influxdb-UzZW/influxdb/src/wal/wal.go:132 +0x1be
cluster.(*ClusterConfiguration).recover(0xc210071c40, 0x1, 0x4bc3698, 0xc210079a80, 0xc210079a80, ...)
	/private/tmp/influxdb-UzZW/influxdb/src/cluster/cluster_configuration.go:1035 +0x370
cluster.func·004(0x1)
	/private/tmp/influxdb-UzZW/influxdb/src/cluster/cluster_configuration.go:992 +0xce
created by cluster.(*ClusterConfiguration).RecoverFromWAL
	/private/tmp/influxdb-UzZW/influxdb/src/cluster/cluster_configuration.go:995 +0x323

goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc210161190)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/runtime/sema.goc:199 +0x30
sync.(*WaitGroup).Wait(0xc21015aa40)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/sync/waitgroup.go:127 +0x14b
cluster.(*ClusterConfiguration).RecoverFromWAL(0xc210071c40, 0xc21016b210, 0x0)
	/private/tmp/influxdb-UzZW/influxdb/src/cluster/cluster_configuration.go:1010 +0x39b
server.(*Server).ListenAndServe(0xc210079bd0, 0xc210079bd0, 0x0)
	/private/tmp/influxdb-UzZW/influxdb/src/server/server.go:119 +0x279
main.main()
	/private/tmp/influxdb-UzZW/influxdb/src/daemon/influxd.go:155 +0xb97

goroutine 3 [syscall]:
os/signal.loop()
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/os/signal/signal_unix.go:21 +0x1e
created by os/signal.init·1
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/os/signal/signal_unix.go:27 +0x31

goroutine 4 [chan receive]:
code.google.com/p/log4go.ConsoleLogWriter.run(0xc21006f000, 0x4bbb0e8, 0xc210000008)
	/private/tmp/influxdb-UzZW/influxdb/src/code.google.com/p/log4go/termlog.go:27 +0x60
created by code.google.com/p/log4go.NewConsoleLogWriter
	/private/tmp/influxdb-UzZW/influxdb/src/code.google.com/p/log4go/termlog.go:19 +0x67

goroutine 5 [select]:
code.google.com/p/log4go.func·002()
	/private/tmp/influxdb-UzZW/influxdb/src/code.google.com/p/log4go/filelog.go:84 +0x84c
created by code.google.com/p/log4go.NewFileLogWriter
	/private/tmp/influxdb-UzZW/influxdb/src/code.google.com/p/log4go/filelog.go:116 +0x2d1

goroutine 6 [syscall]:
runtime.goexit()
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/runtime/proc.c:1394

goroutine 7 [chan receive]:
wal.(*WAL).processEntries(0xc210077d80)
	/private/tmp/influxdb-UzZW/influxdb/src/wal/wal.go:252 +0x3f
created by wal.NewWAL
	/private/tmp/influxdb-UzZW/influxdb/src/wal/wal.go:103 +0x9f3

goroutine 8 [sleep]:
time.Sleep(0x8bb2c97000)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/runtime/time.goc:31 +0x31
cluster.func·001()
	/private/tmp/influxdb-UzZW/influxdb/src/cluster/cluster_configuration.go:133 +0x35
created by cluster.(*ClusterConfiguration).CreateFutureShardsAutomaticallyBeforeTimeComes
	/private/tmp/influxdb-UzZW/influxdb/src/cluster/cluster_configuration.go:138 +0x63

goroutine 10 [chan receive]:
main.waitForSignals(0x4bbc158, 0xc210079bd0)
	/private/tmp/influxdb-UzZW/influxdb/src/daemon/null_profiler.go:23 +0x126
created by main.startProfiler
	/private/tmp/influxdb-UzZW/influxdb/src/daemon/null_profiler.go:15 +0x38

goroutine 11 [finalizer wait]:
runtime.park(0x4013860, 0x49d2da0, 0x49d1228)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/runtime/proc.c:1342 +0x66
runfinq()
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/runtime/mgc0.c:2279 +0x84
runtime.goexit()
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/runtime/proc.c:1394

goroutine 12 [IO wait]:
net.runtime_pollWait(0x4bbe178, 0x72, 0x0)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc21004f5a0, 0x72, 0x4bbaf60, 0x23)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc21004f5a0, 0x23, 0x4bbaf60)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).accept(0xc21004f540, 0x45b7e60, 0x0, 0x4bbaf60, 0x23)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/net/fd_unix.go:382 +0x2c2
net.(*TCPListener).AcceptTCP(0xc2100ae390, 0x18, 0xc2100cf010, 0x418c8d3)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/net/tcpsock_posix.go:233 +0x47
net.(*TCPListener).Accept(0xc2100ae390, 0x0, 0x0, 0x0, 0x0)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/net/tcpsock_posix.go:243 +0x27
net/http.(*Server).Serve(0xc2100aad70, 0x4bbc1d8, 0xc2100ae390, 0x0, 0x0)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/net/http/server.go:1622 +0x91
coordinator.func·007()
	/private/tmp/influxdb-UzZW/influxdb/src/coordinator/raft_server.go:530 +0x3a
created by coordinator.(*RaftServer).Serve
	/private/tmp/influxdb-UzZW/influxdb/src/coordinator/raft_server.go:534 +0x4d9

goroutine 14 [select]:
github.com/goraft/raft.(*server).leaderLoop(0xc2100bed80)
	/private/tmp/influxdb-UzZW/influxdb/src/github.com/goraft/raft/server.go:765 +0x5fe
github.com/goraft/raft.(*server).loop(0xc2100bed80)
	/private/tmp/influxdb-UzZW/influxdb/src/github.com/goraft/raft/server.go:568 +0x33f
created by github.com/goraft/raft.(*server).Start
	/private/tmp/influxdb-UzZW/influxdb/src/github.com/goraft/raft/server.go:472 +0x7af

goroutine 15 [select]:
coordinator.(*RaftServer).CompactLog(0xc2100706e0)
	/private/tmp/influxdb-UzZW/influxdb/src/coordinator/raft_server.go:320 +0x2ef
created by coordinator.(*RaftServer).startRaft
	/private/tmp/influxdb-UzZW/influxdb/src/coordinator/raft_server.go:374 +0x375

goroutine 17 [select]:
coordinator.(*RaftServer).raftLeaderLoop(0xc2100706e0, 0xc21016adc0)
	/private/tmp/influxdb-UzZW/influxdb/src/coordinator/raft_server.go:430 +0x29c
created by coordinator.(*RaftServer).raftEventHandler
	/private/tmp/influxdb-UzZW/influxdb/src/coordinator/raft_server.go:419 +0x1d0

goroutine 19 [IO wait]:
net.runtime_pollWait(0x4bbe0d0, 0x72, 0x0)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/runtime/netpoll.goc:116 +0x6a
net.(*pollDesc).Wait(0xc2100760d0, 0x72, 0x4bbaf60, 0x23)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/net/fd_poll_runtime.go:81 +0x34
net.(*pollDesc).WaitRead(0xc2100760d0, 0x23, 0x4bbaf60)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/net/fd_poll_runtime.go:86 +0x30
net.(*netFD).accept(0xc210076070, 0x45b7e60, 0x0, 0x4bbaf60, 0x23)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/net/fd_unix.go:382 +0x2c2
net.(*TCPListener).AcceptTCP(0xc2100ae590, 0xc2101751d0, 0x0, 0x4bbc1a8)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/net/tcpsock_posix.go:233 +0x47
net.(*TCPListener).Accept(0xc2100ae590, 0xc2101751d0, 0x4fdff38, 0x1, 0x1)
	/usr/local/Cellar/go/1.2.1/libexec/src/pkg/net/tcpsock_posix.go:243 +0x27
coordinator.(*ProtobufServer).ListenAndServe(0xc2100ab980)
	/private/tmp/influxdb-UzZW/influxdb/src/coordinator/protobuf_server.go:64 +0x1c7
created by server.(*Server).ListenAndServe
	/private/tmp/influxdb-UzZW/influxdb/src/server/server.go:116 +0x218

goroutine 20 [select]:
cluster.(*WriteBuffer).handleWrites(0xc21012b5b0)
	/private/tmp/influxdb-UzZW/influxdb/src/cluster/write_buffer.go:74 +0xca
created by cluster.NewWriteBuffer
	/private/tmp/influxdb-UzZW/influxdb/src/cluster/write_buffer.go:43 +0x24f

その時のinfluxdbのログ(influxdbのログはパスはデフォルトではinfluxdbを起動した時のカレントディレクトリにinfluxdb.logというファイルで生成されているようです。)

[2014/05/12 17:33:27 JST] [INFO] (cluster.(*ClusterConfiguration).GetShardToWriteToBySeriesAndTime:672) No matching shards for write at time 1399883607000000u, creating...
[2014/05/12 17:33:27 JST] [INFO] (cluster.(*ClusterConfiguration).createShards:714) createShards: start: Thu May 8 09:00:00 +0900 JST 2014. end: Thu May 15 09:00:00 +0900 JST 2014
[2014/05/12 17:33:27 JST] [INFO] (datastore.(*LevelDbShardDatastore).GetOrCreateShard:123) DATASTORE: opening or creating shard /usr/local/var/influxdb/data/shard_db/00001
[2014/05/12 17:33:28 JST] [INFO] (cluster.(*ClusterConfiguration).AddShards:922) Adding short term shard: 1 - start: Thu May 8 09:00:00 +0900 JST 2014 (1399507200). end: Thu May 15 09:00:00 +0900 JST 2014 (1400112000). isLocal: %!d(bool=true). servers: [%!s(uint32=1)]
[2014/05/12 17:33:28 JST] [INFO] (wal.(*WAL).openLog:370) Opening log file /usr/local/var/influxdb/wal/log.1
[2014/05/12 17:33:28 JST] [INFO] (wal.(*WAL).openLog:384) Opening index file /usr/local/var/influxdb/wal/index.1

ログを見た限り見つからないデータがあるのでinfluxdbが内部で使用しているleveldbのリカバリをしようとして失敗して整合性が取れなくなったのか(?)

見た感じDBの実体は/usr/local/var/influxdb配下にあるようなので、お試しでバックアップ取得してから/usr/local/var/influxdb/*削除して再起動してみたら、あっさり初期化して起動できたw

$ tar zcvf /usr/local/var/influxdb_YYYYMMDD.tar.gz /usr/local/var/influxdb/*
$ rm -rf /usr/local/var/influxdb/*
$ influxdb -config=/usr/local/etc/influxdb.conf

思っきり勘で正しい対処方法なのかわからんですが、シンプルな作りってすばらしい。
中のデータはもちろん全損ですが、とりあえずinfluxdb起動できなくなったので初期化したいというときにはお試しあれ。