Databend 源碼閱讀:配置管理
作者:尚卓燃(PsiACE)澳門科技大學(xué)在讀碩士,Databend 研發(fā)工程師實習(xí)生
Apache OpenDAL(Incubating) Committer
https://github.com/PsiACE
對于 Databend 這樣復(fù)雜的數(shù)據(jù)庫服務(wù)端程序,往往需要支持大量的可配置選項,以幫助運維人員根據(jù)實際使用需要管理和調(diào)優(yōu)系統(tǒng)。
Databend 目前支持三種配置方式:命令行、環(huán)境變量和配置文件,優(yōu)先級依次遞減。
一般情況下,推薦使用配置文件來記錄和管理各種配置。
對于 K8S 集群,為了靈活變更部分配置(比如,特性開關(guān)),使用環(huán)境變量可能是更優(yōu)雅的形式。
命令行則用于調(diào)整本地環(huán)境下的少數(shù)沖突配置。
Databend Query 中的映射
對于 "databend-query"
,不管是什么形式的配置,其配置選項幾乎可以看作是代碼的扁平化樹形映射,即基本符合代碼中「配置域」+「配置項」的邏輯。
環(huán)境變量和配置文件中,利用 "
serfig"
將代碼嵌套展開,使用 "_
?" 做為分隔符。命令行中稍有不同:一方面,分隔符使用 "
-"
;另一方面,部分命令行選項的名稱中沒有綁定配置域。
為了更好理解這里的映射關(guān)系,我們可以深入到具體一項配置,下面將圍繞 "admin_api_address"
這個配置項展開。
在環(huán)境變量上,需要使用 "
QUERY_ADMIN_API_ADDRESS"
,"QUERY"
表征這個配置所處的域,而 "ADMIN_API_ADDRESS"
是具體的配置項。在配置文件中,通常是使用 toml 來進(jìn)行配置。 "
[query]"
表征配置所處的域,"admin_api_address"
為具體的配置項。
命令行中需要使用 "
--admin-api-address"
進(jìn)行配置,這一項沒有綁定「配置域」。如果是配置 "--storage-s3-access-key-id"
,那么「storage」+ 「s3」構(gòu)成配置域,「access-key-id」是具體的配置項。
在了解如何對 "admin_api_address"
進(jìn)行配置后,讓我們進(jìn)入到配置相關(guān)的代碼,進(jìn)一步查看映射關(guān)系的代碼形式(位于 "src/query/config/src/config.rs"
)。
因為代碼中使用了嵌套的層級結(jié)構(gòu),最上層是 "Config"
,而 "admin_api_address"
是 "pub query: QueryConfig"
中的一個配置項,經(jīng)過 "serfig"
處理后,需要使用 "QUERY"
或者 "[query]"
表征其所處的域,配置項就還是 "admin_api_address"
。
而命令行中具體的配置項名稱和默認(rèn)值會受到 "#[clap(long = "<long-name>","?"default_value = "<value>")]"
控制),"clap"
會接管配置:
"admin_api_address"
就變成了 "--admin-api-address"
。"--storage-s3-access-key-id"
而言,其實際的代碼層級是 "Config
->StorageConfig
->S3StorageConfig
->access_key_id"
,字段之上有標(biāo)注 "#[clap(long = "storage-s3-access-key-id", default_value_t)]"
,所以需要使用 "--storage-s3-access-key-id"
進(jìn)行配置。
Databend Meta 中的映射
"databend-meta"
的配置文件和命令行邏輯與 "databend-query"
是基本一致的。但是環(huán)境變量是通過 "serfig"
內(nèi)置的 "serde-env"
自行定義的映射關(guān)系(但同樣可以嘗試按「配置域」+「配置項」進(jìn)行理解)。
同樣具體到單獨的某項配置來看一下,這里以 "log_dir"
為例。
在環(huán)境變量上,需要使用 "
METASRV_LOG_DIR"
,"METASRV"
表征這個配置所處的域,而 "LOG_DIR"
是具體的配置項。而在配置文件中,這一配置項作用于全局,只需要:
在命令行中當(dāng)然也直接 "
--log-dir"
進(jìn)行配置。
讓我們通過代碼來解構(gòu)其映射,代碼位于 "src/meta/service/src/configs/outer_v0.rs"
。
配置文件和命令行參數(shù)相關(guān)的配置項是由?"Config"
結(jié)構(gòu)體管理的,邏輯與 "databend-query"
一致,就不再贅述。
而環(huán)境變量的配置項是由 "ConfigViaEnv"
結(jié)構(gòu)體進(jìn)行處理的,如下:
與 "Config"
之間的映射關(guān)系位于 "impl From<Config> for ConfigViaEnv
?" 和?"impl Into<Config> for ConfigViaEnv"
這兩個部分。對于 "metasrv_log_dir"
而言,就是映射到前面的 "log_dir"
字段。