redis-shake工具
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

124 lines
2.8 KiB

package config
import (
"bytes"
"fmt"
"github.com/pelletier/go-toml/v2"
"io/ioutil"
"os"
"runtime"
)
type tomlSource struct {
Type string `toml:"type"`
Address string `toml:"address"`
Username string `toml:"username"`
Password string `toml:"password"`
IsTLS bool `toml:"tls"`
ElastiCachePSync string `toml:"elasticache_psync"`
RDBFilePath string `toml:"rdb_file_path"`
}
type tomlTarget struct {
Type string `toml:"type"`
Username string `toml:"username"`
Address string `toml:"address"`
Password string `toml:"password"`
IsTLS bool `toml:"tls"`
}
type tomlAdvanced struct {
Dir string `toml:"dir"`
Ncpu int `toml:"ncpu"`
PprofPort int `toml:"pprof_port"`
// log
LogFile string `toml:"log_file"`
LogLevel string `toml:"log_level"`
LogInterval int `toml:"log_interval"`
// rdb restore
RDBRestoreCommandBehavior string `toml:"rdb_restore_command_behavior"`
// for writer
PipelineCountLimit uint64 `toml:"pipeline_count_limit"`
TargetRedisClientMaxQuerybufLen uint64 `toml:"target_redis_client_max_querybuf_len"`
TargetRedisProtoMaxBulkLen uint64 `toml:"target_redis_proto_max_bulk_len"`
}
type tomlShakeConfig struct {
Source tomlSource
Target tomlTarget
Advanced tomlAdvanced
}
var Config tomlShakeConfig
func init() {
// source
Config.Source.Type = "sync"
Config.Source.Address = ""
Config.Source.Username = ""
Config.Source.Password = ""
Config.Source.IsTLS = false
Config.Source.ElastiCachePSync = ""
// target
Config.Target.Type = "standalone"
Config.Target.Address = ""
Config.Target.Username = ""
Config.Target.Password = ""
Config.Target.IsTLS = false
// advanced
Config.Advanced.Dir = "data"
Config.Advanced.Ncpu = 4
Config.Advanced.PprofPort = 0
Config.Advanced.LogFile = "redis-shake.log"
Config.Advanced.LogLevel = "info"
Config.Advanced.LogInterval = 5
Config.Advanced.RDBRestoreCommandBehavior = "rewrite"
Config.Advanced.PipelineCountLimit = 1024
Config.Advanced.TargetRedisClientMaxQuerybufLen = 1024 * 1000 * 1000
Config.Advanced.TargetRedisProtoMaxBulkLen = 512 * 1000 * 1000
}
func LoadFromFile(filename string) {
buf, err := ioutil.ReadFile(filename)
if err != nil {
panic(err.Error())
}
decoder := toml.NewDecoder(bytes.NewReader(buf))
decoder.SetStrict(true)
err = decoder.Decode(&Config)
if err != nil {
missingError, ok := err.(*toml.StrictMissingError)
if ok {
panic(fmt.Sprintf("decode config error:\n%s", missingError.String()))
}
panic(err.Error())
}
// dir
err = os.MkdirAll(Config.Advanced.Dir, os.ModePerm)
if err != nil {
panic(err.Error())
}
err = os.Chdir(Config.Advanced.Dir)
if err != nil {
panic(err.Error())
}
// cpu core
var ncpu int
if Config.Advanced.Ncpu == 0 {
ncpu = runtime.NumCPU()
} else {
ncpu = Config.Advanced.Ncpu
}
runtime.GOMAXPROCS(ncpu)
}