版本:v7.1.0
复线步骤:
1、拷贝官网的tikv/etc/config-template.toml到本地,并修改storage.data-dir为“/data/0/tidb/tikv”
2、使用tiup playground --kv.config ./tikv_config.toml启动
3、tikv数据依然存储在$HOME/.tiup/中
但是,查看此时tikv-0目录下的tikv.toml,发现storage.data-dir确实是“/data/0/tidb/tikv”。
这是为什么,没有生效吗?如果配置方式不对,如何修改tikv数据的默认存储路径?
官网上cluster部署命令是:tiup cluster deploy tidb-test v7.1.0 ./topology.yaml --user root [-p] [-i /home/root/.ssh/gcp_rsa]
我将–user改成普通用户或者直接不加–user都会部署失败
playground 的限制吧,你启动 playground 集群之后可以看下 tikv-server 的进程,大概是这样的
$TIUP_HOME/components/tikv/v7.1.0/tikv-server \
--addr=127.0.0.1:20160 \
--advertise-addr=127.0.0.1:20160 \
--status-addr=127.0.0.1:20180 \
--pd-endpoints=http://127.0.0.1:2379 \
--config=$TIUP_HOME/data/ThnhZLC/tikv-0/tikv.toml \
--data-dir=$TIUP_HOME/data/ThnhZLC/tikv-0/data \
--log-file=$TIUP_HOME/data/ThnhZLC/tikv-0/tikv.log
它加上了 --data-dir
参数,参数的值比你配置文件里的值 优先级更高,所以你配置的就不生效了
看着像是bug
func (inst *TiKVInstance) Start(ctx context.Context, version utils.Version) error {
configPath := filepath.Join(inst.Dir, "tikv.toml")
if err := prepareConfig(
configPath,
inst.ConfigPath,
inst.getConfig(),
); err != nil {
return err
endpoints := pdEndpoints(inst.pds, true)
args := []string{
fmt.Sprintf("--addr=%s", utils.JoinHostPort(inst.Host, inst.Port)),
fmt.Sprintf("--advertise-addr=%s", utils.JoinHostPort(AdvertiseHost(inst.Host), inst.Port)),
fmt.Sprintf("--status-addr=%s", utils.JoinHostPort(inst.Host, inst.StatusPort)),
fmt.Sprintf("--pd-endpoints=%s", strings.Join(endpoints, ",")),
fmt.Sprintf("--config=%s", configPath),
fmt.Sprintf("--data-dir=%s", filepath.Join(inst.Dir, "data")),
fmt.Sprintf("--log-file=%s", inst.LogFile()),
在prepareConfig这个函数中接收inst.ConfigPath但是没有使用
func prepareConfig(outputConfigPath string, userConfigPath string, preDefinedConfig map[string]any) error {
dir := filepath.Dir(outputConfigPath)
if err := utils.MkdirAll(dir, 0755); err != nil {
return err
userConfig, err := unmarshalConfig(userConfigPath)
if err != nil {
return errors.Trace(err)
if userConfig == nil {
userConfig = make(map[string]any)
cf, err := os.Create(outputConfigPath)
if err != nil {
return errors.Trace(err)
enc := toml.NewEncoder(cf)
enc.Indent = ""
return enc.Encode(spec.MergeConfig(preDefinedConfig, userConfig))
只是对userConfigPath进行了合并,然后写到了tikv.toml,而真正启动时使用的是args中的fmt.Sprintf(“–data-dir=%s”, filepath.Join(inst.Dir, “data”))