版本: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”))