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起動できなくなったので初期化したいというときにはお試しあれ。