2015-05-28 21:47:47 +00:00
|
|
|
package tsdb
|
|
|
|
|
2015-05-29 19:50:05 +00:00
|
|
|
import (
|
2015-10-27 18:57:21 +00:00
|
|
|
"errors"
|
|
|
|
"fmt"
|
2015-10-23 19:34:24 +00:00
|
|
|
"log"
|
|
|
|
"os"
|
2015-05-29 19:50:05 +00:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/influxdb/influxdb/toml"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2015-09-17 02:05:20 +00:00
|
|
|
// DefaultEngine is the default engine for new shards
|
2015-10-06 22:30:11 +00:00
|
|
|
DefaultEngine = "bz1"
|
2015-09-17 02:05:20 +00:00
|
|
|
|
2015-06-18 15:07:51 +00:00
|
|
|
// DefaultMaxWALSize is the default size of the WAL before it is flushed.
|
|
|
|
DefaultMaxWALSize = 100 * 1024 * 1024 // 100MB
|
|
|
|
|
|
|
|
// DefaultWALFlushInterval is the frequency the WAL will get flushed if
|
|
|
|
// it doesn't reach its size threshold.
|
|
|
|
DefaultWALFlushInterval = 10 * time.Minute
|
2015-07-02 14:05:29 +00:00
|
|
|
|
|
|
|
// DefaultWALPartitionFlushDelay is the sleep time between WAL partition flushes.
|
|
|
|
DefaultWALPartitionFlushDelay = 2 * time.Second
|
2015-08-18 20:59:54 +00:00
|
|
|
|
|
|
|
// tsdb/engine/wal configuration options
|
|
|
|
|
|
|
|
// DefaultReadySeriesSize of 32KB specifies when a series is eligible to be flushed
|
|
|
|
DefaultReadySeriesSize = 30 * 1024
|
|
|
|
|
|
|
|
// DefaultCompactionThreshold flush and compact a partition once this ratio of keys are over the flush size
|
|
|
|
DefaultCompactionThreshold = 0.5
|
|
|
|
|
|
|
|
// DefaultMaxSeriesSize specifies the size at which a series will be forced to flush
|
|
|
|
DefaultMaxSeriesSize = 1024 * 1024
|
|
|
|
|
|
|
|
// DefaultFlushColdInterval specifies how long after a partition has been cold
|
|
|
|
// for writes that a full flush and compaction are forced
|
2015-09-05 01:54:37 +00:00
|
|
|
DefaultFlushColdInterval = 5 * time.Second
|
2015-08-18 20:59:54 +00:00
|
|
|
|
|
|
|
// DefaultParititionSizeThreshold specifies when a partition gets to this size in
|
|
|
|
// memory, we should slow down writes until it gets a chance to compact.
|
|
|
|
// This will force clients to get backpressure if they're writing too fast. We need
|
|
|
|
// this because the WAL can take writes much faster than the index. So eventually
|
|
|
|
// we'll need to create backpressure, otherwise we'll fill up the memory and die.
|
|
|
|
// This number multiplied by the parition count is roughly the max possible memory
|
|
|
|
// size for the in-memory WAL cache.
|
2015-09-09 18:29:50 +00:00
|
|
|
DefaultPartitionSizeThreshold = 50 * 1024 * 1024 // 50MB
|
2015-09-17 19:46:53 +00:00
|
|
|
|
2015-12-06 23:50:39 +00:00
|
|
|
// Default settings for TSM
|
2015-12-02 18:01:13 +00:00
|
|
|
|
2015-12-06 23:50:39 +00:00
|
|
|
// DefaultCacheMaxMemorySize is the maximum size a shard's cache can
|
|
|
|
// reach before it starts rejecting writes.
|
|
|
|
DefaultCacheMaxMemorySize = 500 * 1024 * 1024 // 500MB
|
2015-12-02 18:01:13 +00:00
|
|
|
|
2015-12-06 23:50:39 +00:00
|
|
|
// DefaultCacheSnapshotMemorySize is the size at which the engine will
|
|
|
|
// snapshot the cache and write it to a TSM file, freeing up memory
|
|
|
|
DefaultCacheSnapshotMemorySize = 25 * 1024 * 1024 // 25MB
|
|
|
|
|
|
|
|
// DefaultCacheSnapshotWriteColdDuration is the length of time at which
|
|
|
|
// the engine will snapshot the cache and write it to a new TSM file if
|
|
|
|
// the shard hasn't receieved writes or deletes
|
|
|
|
DefaultCacheSnapshotWriteColdDuration = time.Duration(time.Hour)
|
|
|
|
|
|
|
|
// DefaultMinCompactionFileCount is the minimum number of TSM files
|
|
|
|
// that need to exist before a compaction cycle will run
|
2015-12-07 13:26:30 +00:00
|
|
|
DefaultCompactMinFileCount = 3
|
2015-12-06 23:50:39 +00:00
|
|
|
|
|
|
|
// DefaultCompactFullWriteColdDuration is the duration at which the engine
|
|
|
|
// will compact all TSM files in a shard if it hasn't received a write or delete
|
|
|
|
DefaultCompactFullWriteColdDuration = time.Duration(24 * time.Hour)
|
|
|
|
|
|
|
|
// DefaultMaxPointsPerBlock is the maximum number of points in an encoded
|
|
|
|
// block in a TSM file
|
|
|
|
DefaultMaxPointsPerBlock = 1000
|
2015-05-29 19:50:05 +00:00
|
|
|
)
|
2015-05-29 15:53:33 +00:00
|
|
|
|
2015-05-28 21:47:47 +00:00
|
|
|
type Config struct {
|
2015-09-17 02:05:20 +00:00
|
|
|
Dir string `toml:"dir"`
|
|
|
|
Engine string `toml:"engine"`
|
2015-08-18 20:59:54 +00:00
|
|
|
|
|
|
|
// WAL config options for b1 (introduced in 0.9.2)
|
2015-07-02 14:05:29 +00:00
|
|
|
MaxWALSize int `toml:"max-wal-size"`
|
|
|
|
WALFlushInterval toml.Duration `toml:"wal-flush-interval"`
|
|
|
|
WALPartitionFlushDelay toml.Duration `toml:"wal-partition-flush-delay"`
|
2015-08-18 20:59:54 +00:00
|
|
|
|
|
|
|
// WAL configuration options for bz1 (introduced in 0.9.3)
|
|
|
|
WALDir string `toml:"wal-dir"`
|
2015-09-03 21:56:07 +00:00
|
|
|
WALLoggingEnabled bool `toml:"wal-logging-enabled"`
|
2015-08-18 20:59:54 +00:00
|
|
|
WALReadySeriesSize int `toml:"wal-ready-series-size"`
|
|
|
|
WALCompactionThreshold float64 `toml:"wal-compaction-threshold"`
|
|
|
|
WALMaxSeriesSize int `toml:"wal-max-series-size"`
|
|
|
|
WALFlushColdInterval toml.Duration `toml:"wal-flush-cold-interval"`
|
|
|
|
WALPartitionSizeThreshold uint64 `toml:"wal-partition-size-threshold"`
|
2015-09-17 02:26:23 +00:00
|
|
|
|
|
|
|
// Query logging
|
|
|
|
QueryLogEnabled bool `toml:"query-log-enabled"`
|
2015-12-02 18:01:13 +00:00
|
|
|
|
2015-12-06 23:50:39 +00:00
|
|
|
// Compaction options for tsm1 (descriptions above with defaults)
|
|
|
|
CacheMaxMemorySize uint64 `toml:"cache-max-memory-size"`
|
|
|
|
CacheSnapshotMemorySize uint64 `toml:"cache-snapshot-memory-size"`
|
|
|
|
CacheSnapshotWriteColdDuration toml.Duration `toml:"cache-snapshot-write-cold-duration"`
|
|
|
|
CompactMinFileCount int `toml:"compact-min-file-count"`
|
|
|
|
CompactFullWriteColdDuration toml.Duration `toml:"compact-full-write-cold-duration"`
|
|
|
|
MaxPointsPerBlock int `toml:"max-points-per-block"`
|
2015-05-28 21:47:47 +00:00
|
|
|
}
|
2015-05-29 19:50:05 +00:00
|
|
|
|
|
|
|
func NewConfig() Config {
|
2015-10-23 19:34:24 +00:00
|
|
|
defaultEngine := DefaultEngine
|
|
|
|
if engine := os.Getenv("INFLUXDB_DATA_ENGINE"); engine != "" {
|
|
|
|
log.Println("TSDB engine selected via environment variable:", engine)
|
|
|
|
defaultEngine = engine
|
|
|
|
}
|
|
|
|
|
2015-05-29 19:50:05 +00:00
|
|
|
return Config{
|
2015-10-23 19:34:24 +00:00
|
|
|
Engine: defaultEngine,
|
2015-07-02 14:05:29 +00:00
|
|
|
MaxWALSize: DefaultMaxWALSize,
|
|
|
|
WALFlushInterval: toml.Duration(DefaultWALFlushInterval),
|
|
|
|
WALPartitionFlushDelay: toml.Duration(DefaultWALPartitionFlushDelay),
|
2015-08-18 20:59:54 +00:00
|
|
|
|
2015-12-06 23:50:39 +00:00
|
|
|
WALLoggingEnabled: true,
|
|
|
|
WALReadySeriesSize: DefaultReadySeriesSize,
|
|
|
|
WALCompactionThreshold: DefaultCompactionThreshold,
|
|
|
|
WALMaxSeriesSize: DefaultMaxSeriesSize,
|
|
|
|
WALFlushColdInterval: toml.Duration(DefaultFlushColdInterval),
|
|
|
|
WALPartitionSizeThreshold: DefaultPartitionSizeThreshold,
|
2015-09-17 02:26:23 +00:00
|
|
|
|
|
|
|
QueryLogEnabled: true,
|
2015-12-02 18:01:13 +00:00
|
|
|
|
2015-12-06 23:50:39 +00:00
|
|
|
CacheMaxMemorySize: DefaultCacheMaxMemorySize,
|
|
|
|
CacheSnapshotMemorySize: DefaultCacheSnapshotMemorySize,
|
|
|
|
CacheSnapshotWriteColdDuration: toml.Duration(DefaultCacheSnapshotWriteColdDuration),
|
|
|
|
CompactMinFileCount: DefaultCompactMinFileCount,
|
|
|
|
CompactFullWriteColdDuration: toml.Duration(DefaultCompactFullWriteColdDuration),
|
2015-05-29 19:50:05 +00:00
|
|
|
}
|
|
|
|
}
|
2015-10-27 18:57:21 +00:00
|
|
|
|
|
|
|
func (c *Config) Validate() error {
|
|
|
|
if c.Dir == "" {
|
|
|
|
return errors.New("Data.Dir must be specified")
|
|
|
|
} else if c.WALDir == "" {
|
|
|
|
return errors.New("Data.WALDir must be specified")
|
|
|
|
}
|
|
|
|
|
|
|
|
valid := false
|
|
|
|
for _, e := range RegisteredEngines() {
|
|
|
|
if e == c.Engine {
|
|
|
|
valid = true
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if !valid {
|
|
|
|
return fmt.Errorf("unrecognized engine %s", c.Engine)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|