• Databend 源码阅读:配置管理


    作者:尚卓燃(PsiACE)澳门科技大学在读硕士,Databend 研发工程师实习生

    Apache OpenDAL(Incubating) Committer

    https://github.com/PsiACE

    图片

    对于 Databend 这样复杂的数据库服务端程序,往往需要支持大量的可配置选项,以帮助运维人员根据实际使用需要管理和调优系统。

    Databend 目前支持三种配置方式:命令行、环境变量和配置文件,优先级依次递减。

    • 一般情况下,推荐使用配置文件来记录和管理各种配置。
    • 对于 K8S 集群,为了灵活变更部分配置(比如,特性开关),使用环境变量可能是更优雅的形式。
    • 命令行则用于调整本地环境下的少数冲突配置。

    Databend Query 中的映射

    对于 databend-query ,不管是什么形式的配置,其配置选项几乎可以看作是代码的扁平化树形映射,即基本符合代码中「配置域」+「配置项」的逻辑。

    • 环境变量和配置文件中,利用 serfig 将代码嵌套展开,使用 _ 做为分隔符。
    • 命令行中稍有不同:一方面,分隔符使用 -;另一方面,部分命令行选项的名称中没有绑定配置域。

    为了更好理解这里的映射关系,我们可以深入到具体一项配置,下面将围绕 admin_api_address 这个配置项展开。

    • 在环境变量上,需要使用 QUERY_ADMIN_API_ADDRESS ,QUERY 表征这个配置所处的域,而 ADMIN_API_ADDRESS 是具体的配置项。
    • 在配置文件中,通常是使用 toml 来进行配置。 [query] 表征配置所处的域,admin_api_address 为具体的配置项。
    1. [query]
    2. ...
    3. # Databend Query http address.
    4. # For admin RESET API.
    5. admin_api_address = "0.0.0.0:8081"
    6. ...
    • 命令行中需要使用 --admin-api-address 进行配置,这一项没有绑定「配置域」。如果是配置 --storage-s3-access-key-id ,那么「storage」+ 「s3」构成配置域,「access-key-id」是具体的配置项。

    在了解如何对 admin_api_address 进行配置后,让我们进入到配置相关的代码,进一步查看映射关系的代码形式(位于 src/query/config/src/config.rs)。

    1. pub struct Config {
    2. ...
    3. // Query engine config.
    4. #[clap(flatten)]
    5. pub query: QueryConfig,
    6. ...
    7. }
    8. /// Query config group.
    9. #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Args)]
    10. #[serde(default, deny_unknown_fields)]
    11. pub struct QueryConfig {
    12. ...
    13. #[clap(long, default_value = "127.0.0.1:8080")]
    14. pub admin_api_address: String,
    15. ...
    16. }

    因为代码中使用了嵌套的层级结构,最上层是 Config,而 admin_api_address 是 pub query: QueryConfig 中的一个配置项,经过 serfig 处理后,需要使用 QUERY 或者 [query] 表征其所处的域,配置项就还是 admin_api_address 。

    而命令行中具体的配置项名称和默认值会受到 #[clap(long = "", default_value = "")] 控制),clap 会接管配置:

    • admin_api_address 就变成了 --admin-api-address
    • --storage-s3-access-key-id 而言,其实际的代码层级是 Config -> StorageConfig -> S3StorageConfig -> access_key_id,字段之上有标注 #[clap(long = "storage-s3-access-key-id", default_value_t)] ,所以需要使用 --storage-s3-access-key-id 进行配置。

    Databend Meta 中的映射

    databend-meta 的配置文件和命令行逻辑与 databend-query 是基本一致的。但是环境变量是通过 serfig 内置的 serde-env 自行定义的映射关系(但同样可以尝试按「配置域」+「配置项」进行理解)。

    同样具体到单独的某项配置来看一下,这里以 log_dir 为例。

    • 在环境变量上,需要使用 METASRV_LOG_DIR ,METASRV 表征这个配置所处的域,而 LOG_DIR 是具体的配置项。
    • 而在配置文件中,这一配置项作用于全局,只需要:
    log_dir                 = "./.databend/logs1"
    • 在命令行中当然也直接 --log-dir 进行配置。

    让我们通过代码来解构其映射,代码位于 src/meta/service/src/configs/outer_v0.rs

    1. #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Parser)]
    2. #[clap(about, version = &**METASRV_COMMIT_VERSION, author)]
    3. #[serde(default)]
    4. pub struct Config {
    5. ...
    6. /// Log file dir
    7. #[clap(long = "log-dir", default_value = "./.databend/logs")]
    8. pub log_dir: String,
    9. ...
    10. }

    配置文件和命令行参数相关的配置项是由 Config 结构体管理的,逻辑与 databend-query 一致,就不再赘述。

    而环境变量的配置项是由 ConfigViaEnv 结构体进行处理的,如下:

    1. /// #[serde(flatten)] doesn't work correctly for env.
    2. /// We should work around it by flatten them manually.
    3. /// We are seeking for better solutions.
    4. #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
    5. #[serde(default)]
    6. pub struct ConfigViaEnv {
    7. ...
    8. pub metasrv_log_dir: String,
    9. ...
    10. }

    与 Config 之间的映射关系位于 impl From for ConfigViaEnv 和 impl Into for ConfigViaEnv这两个部分。对于 metasrv_log_dir 而言,就是映射到前面的 log_dir 字段。

  • 相关阅读:
    flutter多版本管理fvm使用
    二肽二氨基丁酰苄基酰胺二乙酸盐/Dipeptide Diaminobutyroyl Benzylamide Diacetate/SYN-AKE
    六、决策树算法(DT,DecisionTreeClassifier)(有监督学习)
    现货黄金技术培训:减少无谓
    MongoDB归并连续号段-(待验证)
    在全志V853开发板试编译QT测试
    【Python 实战基础】Python 中 PyQt6 颜色讲解
    Hugging News #0331: Hugging Papers 来啦,快来认领你的论文!
    Vue2 零基础入门 Vue2 零基础入门第五天 5.3 自定义指令
    MindSponge分子动力学模拟——Constraint约束(2023.09)
  • 原文地址:https://blog.csdn.net/Databend/article/details/133376545