部署tiflash启动失败

【 TiDB 使用环境】生产环境 or 测试环境 or POC
【 TiDB 版本】V6.2.0
【遇到的问题】TiFlash 启动失败
【复现路径】做过哪些操作出现的问题
通过 tidb-operator 部署 tidb 集群后,再单独部署 tiflash
【问题现象及影响】
tiflash 启动失败。

【附件】 相关日志及监控(https://metricstool.pingcap.com/)

[2022/08/23 11:16:51.617 +00:00] [ERROR] [<unknown>] ["Application:DB::Exception: The configuration \"storage.raft.dir\" should be an array of strings. Please check your configuration file."] [thread_id=1]

对应源码

调用点
if (auto kvstore_paths = get_checked_qualified_array(table, "raft.dir"); kvstore_paths)
        kvstore_data_path = *kvstore_paths;

抛错点
auto get_checked_qualified_array = [log](const std::shared_ptr<cpptoml::table> table, const char * key) -> cpptoml::option<Strings> {
        auto throw_invalid_value = [log, key]() {
            String error_msg = fmt::format("The configuration \"storage.{}\" should be an array of strings. Please check your configuration file.", key);
            LOG_FMT_ERROR(log, "{}", error_msg);
            throw Exception(error_msg, ErrorCodes::INVALID_CONFIG_PARAMETER);
        };
        // not exist key
        if (!table->contains_qualified(key))
            return cpptoml::option<Strings>();

        // key exist, but not array
        auto qualified_ptr = table->get_qualified(key);
        if (!qualified_ptr->is_array())
        {
            throw_invalid_value();
        }
        // key exist, but can not convert to string array, maybe it is an int array
        auto string_array = table->get_qualified_array_of<String>(key);
        if (!string_array)
        {
            throw_invalid_value();
        }
        return string_array;
    };

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

https://docs.pingcap.com/zh/tidb-in-kubernetes/stable/deploy-tiflash#部署-tiflash
按照这里的部署参考,并未涉及 raft.dir 相关配置。

TiFlash的配置文件中,是没写这个配置项么?

参考:https://tidb.net/blog/8c069774
执行:

kubectl edit tc basic -n TiDB-cluster

修改 TiFlash 的配置如下:

  TiFlash:
    baseImage: uhub.service.ucloud.cn/pingcap/TiFlash
    config:
      config: |
        [storage]
          [storage.main]
            dir = ["/data0/db"]
          [storage.raft]
            dir = ["/data0/kvstore"]
    maxFailoverCount: 3
    replicas: 3
    storageClaims:
    - resources:
        requests:
          storage: 10Gi

增加 config,其中注意:

  1. 两次嵌套 config
  2. storage 下面如果有配置,需要全部在配置中指定,在实践中常常漏掉 storage.main 配置,要注意检查。

配置写的有点问题,改一下就好了

    config:
      config: |
        [storage]
          [storage.main]
            dir: ["/data0/db"]
        [storage]
          [storage.raft]
            dir: ["/data0/kvstore"]

这一套配置下来,tidb、 tikv、pd 都起不来了。
FYI:通过 tidb-cluster.yaml 部署

是执行上述命令修改的,还是修改的tidb-cluster.yaml 然后重新部署的?
命令的格式是 kubectl edit tc ${cluster_name} -n ${namespace}

基于 tidb-cluster.yaml修改的。

执行该修改后,我 edti tc 可以观察到新配置是同步过去的。

现在报错是啥,我感觉可能是格式有问题,介不介意用kubectl edit tc ${cluster_name} -n ${namespace}导一份配置,我用格式工具检查一下

可以的

tc.yaml (7.4 KB)

格式没啥问题,你现在报错是啥?

一套operator 理论上可以对接多个 tidb 集群的吧?

我在一套全新的 k8s 环境,从0部署 tidb-admin + tidb-cluster 就没有这个问题

没有报错,就是没有创建deployment、statefulset资源的动作,kubectl get 都是空的