Lectura del código fuente de Databend: gestión de configuración

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)

https://github.com/PsiACE

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-queryimporta 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 serfigpara 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_addressen este elemento de configuración.

  • Para las variables de entorno, debe usar QUERY_ADMIN_API_ADDRESSpara QUERYrepresentar el dominio donde se encuentra esta configuración, pero ADMIN_API_ADDRESSel 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 y admin_api_addresses 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-addresspara 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_addressconfigurar, 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_addresses pub query: QueryConfigun elemento de configuración en. Después de ser serfigprocesado, debe usar QUERYo [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 clapse harán cargo de la configuración:

  • admin_api_addressSe convirtió en --admin-api-address.
  • --storage-s3-access-key-idEn términos generales, el nivel de código real es Config-> StorageConfig-> S3StorageConfig-> access_key_idy hay anotaciones en los campos #[clap(long = "storage-s3-access-key-id", default_value_t)], por lo que debe usarlo --storage-s3-access-key-idpara la configuración.

Mapeo en Databend Meta

databend-metaEl archivo de configuración y la lógica de la línea de comando databend-queryson básicamente los mismos que los de . Sin embargo, las variables de entorno son relaciones de mapeo serfigintegradas serde-envy 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_direjemplo .

  • Para las variables de entorno, debe usar METASRV_LOG_DIRpara METASRVrepresentar el dominio donde se encuentra esta configuración, pero LOG_DIRel 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-dirPor 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 Configadministrados por la estructura y la lógica es databend-queryconsistente con, por lo que no entraré en detalles aquí.

Los elementos de configuración de las variables de entorno son ConfigViaEnvprocesados ​​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,
    ...
}

ConfigLa relación de mapeo entre y se encuentra en las dos partes de impl From<Config> for ConfigViaEnvy impl Into<Config> for ConfigViaEnv. Para metasrv_log_dir, se asigna al log_dircampo anterior.

Multado con 200 yuanes y confiscado más de 1 millón de yuanes You Yuxi: La importancia de los documentos chinos de alta calidad La migración de servidores de Musk El control de congestión de TCP salvó Internet Apache OpenOffice es un proyecto "sin mantenimiento" de facto Google celebra su 25 aniversario Microsoft controladores-rs de Windows de código abierto, use Rust para desarrollar controladores de Windows Raspberry Pi 5 se lanzará a fines de octubre, con un precio desde $ 60 Contenedores macOS: use Docker para ejecutar imágenes de macOS en macOS Lanzamiento de IntelliJ IDEA 2023.3 EAP
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/5489811/blog/10114765
Recomendado
Clasificación