Autor: Shang Zhuoran (PsiACE), estudiante de maestría en la Universidad de Ciencia y Tecnología de Macao, ingeniero en prácticas de I+D de Databend
Comprometido Apache OpenDAL (en incubación)
Para programas de servidor de bases de datos complejos como Databend, a menudo es necesario admitir una gran cantidad de opciones configurables para ayudar al personal de operación y mantenimiento a administrar y ajustar el sistema de acuerdo con las necesidades de uso reales.
Databend actualmente admite tres métodos de configuración: línea de comando, variables de entorno y archivos de configuración, con prioridad decreciente.
- En general, se recomienda utilizar archivos de configuración para registrar y administrar varias configuraciones.
- Para los clústeres K8S, para cambiar de manera flexible algunas configuraciones (como cambios de funciones), el uso de variables de entorno puede ser una forma más elegante.
- La línea de comando se utiliza para ajustar algunas configuraciones conflictivas en el entorno local.
Mapeo en consulta de Databend
No databend-query
importa qué forma de configuración sea, sus opciones de configuración casi pueden considerarse como un mapa de árbol plano del código, es decir, básicamente se ajusta a la lógica de "dominio de configuración" + "elemento de configuración" en el código.
- En variables de entorno y archivos de configuración, utilícelo
serfig
para anidar y expandir el código, y utilícelo_
como separador. - Hay ligeras diferencias en la línea de comando: por un lado, se usa el delimitador
-
; por otro lado, algunas opciones de la línea de comando no tienen campos de configuración vinculados en sus nombres.
Para comprender mejor la relación de mapeo aquí, podemos profundizar en una configuración específica, y lo siguiente se centrará admin_api_address
en este elemento de configuración.
- Para las variables de entorno, debe usar
QUERY_ADMIN_API_ADDRESS
paraQUERY
representar el dominio donde se encuentra esta configuración, peroADMIN_API_ADDRESS
el elemento de configuración específico. - En el archivo de configuración, generalmente se usa toml para la configuración.
[query]
Indica el dominio donde se encuentra la configuración yadmin_api_address
es un elemento de configuración específico.
[query]
...
# Databend Query http address.
# For admin RESET API.
admin_api_address = "0.0.0.0:8081"
...
- Debe usarlo en la línea de comando
--admin-api-address
para la configuración; este elemento no está vinculado al "dominio de configuración". Si es configuración--storage-s3-access-key-id
, entonces "almacenamiento" + "s3" constituyen el dominio de configuración y "acceso-clave-id" es el elemento de configuración específico.
Después de comprender cómo admin_api_address
configurar, ingresemos el código relacionado con la configuración para ver más a fondo el formato del código de la relación de mapeo (ubicado en 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,
...
}
Debido a que el código usa una estructura jerárquica anidada, el nivel superior es Config
, pero admin_api_address
es pub query: QueryConfig
un elemento de configuración en. Después de ser serfig
procesado, debe usar QUERY
o [query]
representar el dominio en el que se encuentra, y el elemento de configuración permanece admin_api_address
.
Se controlarán los nombres de los elementos de configuración específicos y los valores predeterminados en la línea de comando #[clap(long = "<long-name>", default_value = "<value>")]
) y clap
se harán cargo de la configuración:
admin_api_address
Se convirtió en--admin-api-address
.--storage-s3-access-key-id
En términos generales, el nivel de código real esConfig
->StorageConfig
->S3StorageConfig
->access_key_id
y hay anotaciones en los campos#[clap(long = "storage-s3-access-key-id", default_value_t)]
, por lo que debe usarlo--storage-s3-access-key-id
para la configuración.
Mapeo en Databend Meta
databend-meta
El archivo de configuración y la lógica de la línea de comando databend-query
son básicamente los mismos que los de . Sin embargo, las variables de entorno son relaciones de mapeo serfig
integradas serde-env
y autodefinidas (pero también puede intentar comprenderlas mediante "dominio de configuración" + "elemento de configuración").
Echemos también un vistazo a una configuración específica, aquí la tomamos como log_dir
ejemplo .
- Para las variables de entorno, debe usar
METASRV_LOG_DIR
paraMETASRV
representar el dominio donde se encuentra esta configuración, peroLOG_DIR
el elemento de configuración específico. - En el archivo de configuración, este elemento de configuración actúa globalmente y solo requiere:
log_dir = "./.databend/logs1"
--log-dir
Por supuesto, también puedes configurarlo directamente en la línea de comando .
Deconstruyamos su mapeo a través del código, ubicado en 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,
...
}
Los elementos de configuración relacionados con los archivos de configuración y los parámetros de la línea de comando son Config
administrados por la estructura y la lógica es databend-query
consistente con, por lo que no entraré en detalles aquí.
Los elementos de configuración de las variables de entorno son ConfigViaEnv
procesados por la estructura de la siguiente manera:
/// #[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
La relación de mapeo entre y se encuentra en las dos partes de impl From<Config> for ConfigViaEnv
y impl Into<Config> for ConfigViaEnv
. Para metasrv_log_dir
, se asigna al log_dir
campo anterior.