著者: Shang Zhuoran (PsiACE)、マカオ科学技術大学修士課程学生、Databend R&D エンジニアインターン
Apache OpenDAL(インキュベーション) コミッター
Databend のような複雑なデータベース サーバー プログラムの場合、多くの場合、運用および保守担当者が実際の使用ニーズに応じてシステムを管理および調整できるように、多数の構成可能なオプションをサポートする必要があります。
Databend は現在、コマンド ライン、環境変数、構成ファイルの 3 つの構成方法をサポートしており、優先順位が低くなります。
- 一般に、構成ファイルを使用してさまざまな構成を記録および管理することをお勧めします。
- K8S クラスターの場合、一部の構成 (機能スイッチなど) を柔軟に変更するには、環境変数を使用する方がより洗練された形式になる可能性があります。
- コマンド ラインは、ローカル環境でいくつかの競合する構成を調整するために使用されます。
データベンドクエリでのマッピング
どのdatabend-query
ような構成形式であっても、その構成オプションはほぼコードのフラット ツリー マップとみなすことができ、基本的にはコード内の「構成ドメイン」+「構成項目」のロジックに準拠します。
- 環境変数および設定ファイルで、
serfig
コードをネストおよび展開するために使用し、_
区切り文字として使用します。 - コマンド ラインには若干の違いがあります。一方では区切り文字が使用されますが
-
、他方では、一部のコマンド ライン オプションの名前にはバインドされた構成フィールドがありません。
ここでのマッピング関係をよりよく理解するために、特定の構成を詳しく調べることができます。以下では、admin_api_address
この構成項目に焦点を当てます。
- 環境変数の場合、この構成が配置されているドメインを表す
QUERY_ADMIN_API_ADDRESS
ために使用する必要がありますが、特定の構成項目を表す必要があります。QUERY
ADMIN_API_ADDRESS
- 設定ファイルでは、通常は toml を使用して設定します。
[query]
構成が配置されているドメインを示し、admin_api_address
特定の構成アイテムです。
[query]
...
# Databend Query http address.
# For admin RESET API.
admin_api_address = "0.0.0.0:8081"
...
- 構成にはコマンドラインで使用する必要があります
--admin-api-address
。この項目は「構成ドメイン」にバインドされません。configuration の場合--storage-s3-access-key-id
、「storage」+「s3」が構成ドメインを構成し、「access-key-id」が特定の構成項目になります。
設定方法を理解したらadmin_api_address
、設定関連のコードを入力して、マッピング関係のコード形式をさらに表示します ( にありますsrc/query/config/src/config.rs
)。
pub struct Config {
...
// Query engine config.
#[clap(flatten)]
pub query: QueryConfig,
...
}
/// Query config group.
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Args)]
#[serde(default, deny_unknown_fields)]
pub struct QueryConfig {
...
#[clap(long, default_value = "127.0.0.1:8080")]
pub admin_api_address: String,
...
}
このコードはネストされた階層構造を使用しているため、最上位は ですConfig
が、の構成項目です。処理後admin_api_address
、またはを使用してコードが配置されているドメインを表す必要があり、構成項目は のままになります。pub query: QueryConfig
serfig
QUERY
[query]
admin_api_address
コマンドラインの特定の構成項目名とデフォルト値が制御され#[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
、フィールドにアノテーションがあるため、設定に#[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
。
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Parser)]
#[clap(about, version = &**METASRV_COMMIT_VERSION, author)]
#[serde(default)]
pub struct Config {
...
/// Log file dir
#[clap(long = "log-dir", default_value = "./.databend/logs")]
pub log_dir: String,
...
}
設定ファイルやコマンドラインパラメータに関する設定項目はConfig
構造体で管理されており、ロジックはdatabend-query
と一貫しているため、ここでは詳細は説明しません。
環境変数の設定項目はConfigViaEnv
以下のような構造で処理されます。
/// #[serde(flatten)] doesn't work correctly for env.
/// We should work around it by flatten them manually.
/// We are seeking for better solutions.
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
pub struct ConfigViaEnv {
...
pub metasrv_log_dir: String,
...
}
Config
と の間のマッピング関係は、impl From<Config> for ConfigViaEnv
と の2 つの部分にありますimpl Into<Config> for ConfigViaEnv
。の場合metasrv_log_dir
、前のフィールドにマッピングされますlog_dir
。