配置tikv.toml修改tikv数据默认存储路径不生效

版本: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数据的默认存储路径?

这个命令修改集群配置文件 tiup cluster edit-config xxx ,
改完reload下 tiup cluster reload xxx

我直接用tiup playground部署的本地测试环境,没有用cluster :joy:
tiup cluster启动时,好像必须要root用户权限,我这可能不太行,只能用tiup playground

cluster安装的时候需要root权限 启动服务是用的普通帐号

官网上cluster部署命令是:tiup cluster deploy tidb-test v7.1.0 ./topology.yaml --user root [-p] [-i /home/root/.ssh/gcp_rsa]
我将–user改成普通用户或者直接不加–user都会部署失败

不应该啊,报什么错?

我每次部署都用的是tidb用户。没出过什么问题。后面加–user tidb -p,没做免密,但tidb是同一个密码。这样。

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 参数,参数的值比你配置文件里的值 优先级更高,所以你配置的就不生效了

1 个赞

tiup 需要一个服务端的 SSH 用户 sudo as root

看着像是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”))

1 个赞

瞎搞 部署的方案和方法广网都没有

tiup playground 是用来体验测试环境的

配置文件它是用了的,--config 指定了。只是它固定生成了一个 --data-dir 的值,这个优先级比配置文件里的高。

1 个赞

人家通过 playground 快速上手一下 tidb 怎么是瞎搞了。用的命令行参数也都是官方支持的

这个不是优先不优先的问题,生成的配置文件是用户指定的路径,实际上却不是用户指定的路径

实际上使用的配置文件,会把用户指定的文件内容都包含进去的。所以配置文件的生成和使用都是没问题的。但是它还管理了几个命令行参数,如果配置文件和命令行参数都指定了 data-dir ,那命令行的会生效

1 个赞

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。