O servidor ClickHouse pode ser configurado com arquivos de configuração em sintaxe XML ou YAML.
Na maioria dos tipos de instalação, o servidor ClickHouse usa /etc/clickhouse-server/config.xml como arquivo de configuração padrão, mas também é possível especificar manualmente o local do arquivo de configuração na inicialização do servidor usando a opção de linha de comando --config-file ou -C.
Arquivos de configuração adicionais podem ser colocados no diretório config.d/, relativo ao arquivo de configuração principal, por exemplo no diretório /etc/clickhouse-server/config.d/.
Os arquivos desse diretório e a configuração principal são mesclados em uma etapa de pré-processamento antes de a configuração ser aplicada no servidor ClickHouse.
Os fragmentos de configuração são mesclados em ordem lexicográfica por seus caminhos completos. Para arquivos no diretório padrão config.d/, isso equivale a ordená-los pelo nome do arquivo. O diretório legado conf.d/ também é mesclado; como conf.d é ordenado antes de config.d, todos os seus fragmentos são processados primeiro quando ambos os diretórios existem.
Para simplificar atualizações e melhorar a modularização, é uma prática recomendada manter o arquivo padrão config.xml sem alterações e colocar personalizações adicionais em config.d/.
A configuração do ClickHouse Keeper fica em /etc/clickhouse-keeper/keeper_config.xml.
Da mesma forma, arquivos de configuração adicionais do Keeper precisam ser colocados em /etc/clickhouse-keeper/keeper_config.d/.
É possível misturar arquivos de configuração XML e YAML; por exemplo, você pode ter um arquivo de configuração principal config.xml e arquivos de configuração adicionais config.d/network.xml, config.d/timezone.yaml e config.d/keeper.yaml.
Não há suporte para misturar XML e YAML em um único arquivo de configuração.
Arquivos de configuração XML devem usar <clickhouse>...</clickhouse> como tag de nível superior.
Em arquivos de configuração YAML, clickhouse: é opcional; se estiver ausente, o parser o insere automaticamente.
Mesclagem de configuração
Dois arquivos de configuração (geralmente o arquivo de configuração principal e outro arquivo de configuração em config.d/) são mesclados da seguinte forma:
- Se um nó (ou seja, um caminho que leva a um elemento) estiver presente em ambos os arquivos e não tiver os atributos
replaceouremove, ele será incluído no arquivo de configuração mesclado, e os filhos de ambos os nós serão incluídos e mesclados recursivamente. - Se um dos dois nós contiver o atributo
replace, ele será incluído no arquivo de configuração mesclado, mas apenas os filhos do nó com o atributoreplaceserão incluídos. - Se um dos dois nós contiver o atributo
remove, o nó não será incluído no arquivo de configuração mesclado (se já existir, será removido).
Por exemplo, considerando dois arquivos de configuração:
<clickhouse>
<config_a>
<setting_1>1</setting_1>
</config_a>
<config_b>
<setting_2>2</setting_2>
</config_b>
<config_c>
<setting_3>3</setting_3>
</config_c>
</clickhouse>e
<clickhouse>
<config_a>
<setting_4>4</setting_4>
</config_a>
<config_b replace="replace">
<setting_5>5</setting_5>
</config_b>
<config_c remove="remove">
<setting_6>6</setting_6>
</config_c>
</clickhouse>O arquivo de configuração mesclado resultante será:
<clickhouse>
<config_a>
<setting_1>1</setting_1>
<setting_4>4</setting_4>
</config_a>
<config_b>
<setting_5>5</setting_5>
</config_b>
</clickhouse>Substituição por variáveis de ambiente e nós do ZooKeeper
Para especificar que o valor de um elemento deve ser substituído pelo valor de uma variável de ambiente, você pode usar o atributo from_env.
Por exemplo, com a variável de ambiente $MAX_QUERY_SIZE = 150000:
<clickhouse>
<profiles>
<default>
<max_query_size from_env="MAX_QUERY_SIZE"/>
</default>
</profiles>
</clickhouse>A configuração resultante será:
<clickhouse>
<profiles>
<default>
<max_query_size>150000</max_query_size>
</default>
</profiles>
</clickhouse>Também é possível usar from_zk (nó do ZooKeeper):
<clickhouse>
<postgresql_port from_zk="/zk_configs/postgresql_port"/>
</clickhouse># clickhouse-keeper-client
/ :) touch /zk_configs
/ :) create /zk_configs/postgresql_port "9005"
/ :) get /zk_configs/postgresql_port
9005Resultando na configuração a seguir:
<clickhouse>
<postgresql_port>9005</postgresql_port>
</clickhouse>Valores padrão
Um elemento com os atributos from_env ou from_zk também pode ter o atributo replace="1" (este último deve aparecer antes de from_env/from_zk).
Nesse caso, o elemento pode definir um valor padrão.
O elemento assume o valor da variável de ambiente ou do nó do ZooKeeper, se estiver definido; caso contrário, assume o valor padrão.
O exemplo anterior é repetido, mas supondo que MAX_QUERY_SIZE não esteja definido:
<clickhouse>
<profiles>
<default>
<max_query_size replace="1" from_env="MAX_QUERY_SIZE">150000</max_query_size>
</default>
</profiles>
</clickhouse>O resultado é a configuração:
<clickhouse>
<profiles>
<default>
<max_query_size>150000</max_query_size>
</default>
</profiles>
</clickhouse>Substituição com conteúdo de arquivo
Também é possível substituir partes da configuração pelo conteúdo de arquivos. Isso pode ser feito de duas formas:
- Substituição de valores: se um elemento tiver o atributo
incl, seu valor será substituído pelo conteúdo do arquivo referenciado. O caminho para o arquivo com substituições é definido pelo elementoinclude_fromda configuração do servidor; não há um caminho padrão, portanto as substituições são lidas somente quando ele é especificado. Os valores de substituição são especificados em elementos/clickhouse/substitution_namenesse arquivo. Se uma substituição especificada eminclnão existir, isso será registrado no log. Para impedir que o ClickHouse registre substituições ausentes, especifique o atributooptional="true"(por exemplo, para configurações de macros). - Substituição de elementos: se você quiser substituir o elemento inteiro por uma substituição, use
includecomo nome do elemento. O nome de elementoincludepode ser combinado com o atributofrom_zk = "/path/to/node". Nesse caso, o valor do elemento é substituído pelo conteúdo do nó do ZooKeeper em/path/to/node. Isso também funciona quando você armazena uma subárvore XML inteira como um nó do ZooKeeper; ela será inserida por completo no elemento de origem.
Um exemplo disso é mostrado abaixo:
<clickhouse>
<!-- Appends XML subtree found at `/profiles-in-zookeeper` ZK path to `<profiles>` element. -->
<profiles from_zk="/profiles-in-zookeeper" />
<users>
<!-- Replaces `include` element with the subtree found at `/users-in-zookeeper` ZK path. -->
<include from_zk="/users-in-zookeeper" />
<include from_zk="/other-users-in-zookeeper" />
</users>
</clickhouse>Se você quiser mesclar o conteúdo da substituição com a configuração existente, em vez de apenas anexá-lo, pode usar o atributo merge="true". Por exemplo: <include from_zk="/some_path" merge="true">. Nesse caso, a configuração existente será mesclada com o conteúdo da substituição, e as configurações existentes serão substituídas pelos valores da substituição.
Criptografando e ocultando a configuração
Você pode usar criptografia simétrica para criptografar um elemento de configuração, por exemplo, uma senha em texto simples ou uma chave privada.
Para isso, primeiro configure o codec de criptografia e, em seguida, adicione o atributo encrypted_by, com o nome do codec de criptografia como valor, ao elemento que será criptografado.
Diferentemente dos atributos from_zk, from_env e incl, ou do elemento include, nenhuma substituição (ou seja, a descriptografia do valor criptografado) é realizada no arquivo pré-processado.
A descriptografia ocorre apenas em tempo de execução, no processo do servidor.
Por exemplo:
<clickhouse>
<encryption_codecs>
<aes_128_gcm_siv>
<key_hex>00112233445566778899aabbccddeeff</key_hex>
</aes_128_gcm_siv>
</encryption_codecs>
<interserver_http_credentials>
<user>admin</user>
<password encrypted_by="AES_128_GCM_SIV">961F000000040000000000EEDDEF4F453CFE6457C4234BD7C09258BD651D85</password>
</interserver_http_credentials>
</clickhouse>Os atributos from_env e from_zk também podem ser aplicados a encryption_codecs:
<clickhouse>
<encryption_codecs>
<aes_128_gcm_siv>
<key_hex from_env="CLICKHOUSE_KEY_HEX"/>
</aes_128_gcm_siv>
</encryption_codecs>
<interserver_http_credentials>
<user>admin</user>
<password encrypted_by="AES_128_GCM_SIV">961F000000040000000000EEDDEF4F453CFE6457C4234BD7C09258BD651D85</password>
</interserver_http_credentials>
</clickhouse><clickhouse>
<encryption_codecs>
<aes_128_gcm_siv>
<key_hex from_zk="/clickhouse/aes128_key_hex"/>
</aes_128_gcm_siv>
</encryption_codecs>
<interserver_http_credentials>
<user>admin</user>
<password encrypted_by="AES_128_GCM_SIV">961F000000040000000000EEDDEF4F453CFE6457C4234BD7C09258BD651D85</password>
</interserver_http_credentials>
</clickhouse>Chaves de criptografia e valores criptografados podem ser definidos em qualquer um dos arquivos de configuração.
Um exemplo de config.xml é o seguinte:
<clickhouse>
<encryption_codecs>
<aes_128_gcm_siv>
<key_hex from_zk="/clickhouse/aes128_key_hex"/>
</aes_128_gcm_siv>
</encryption_codecs>
</clickhouse>Um exemplo de users.xml é o seguinte:
<clickhouse>
<users>
<test_user>
<password encrypted_by="AES_128_GCM_SIV">96280000000D000000000030D4632962295D46C6FA4ABF007CCEC9C1D0E19DA5AF719C1D9A46C446</password>
<profile>default</profile>
</test_user>
</users>
</clickhouse>Para criptografar um valor, você pode usar o programa de exemplo encrypt_decrypt:
./encrypt_decrypt /etc/clickhouse-server/config.xml -e AES_128_GCM_SIV abcd961F000000040000000000EEDDEF4F453CFE6457C4234BD7C09258BD651D85Mesmo com elementos de configuração criptografados, eles ainda aparecem no arquivo de configuração pré-processado.
Se isso for um problema para a sua implantação do ClickHouse, há duas alternativas: definir as permissões do arquivo pré-processado como 600 ou usar o atributo hide_in_preprocessed.
Por exemplo:
<clickhouse>
<interserver_http_credentials hide_in_preprocessed="true">
<user>admin</user>
<password>secret</password>
</interserver_http_credentials>
</clickhouse>Configurações de usuário
O arquivo config.xml pode especificar uma configuração separada com configurações de usuário, perfis e cotas. O caminho relativo para essa configuração é definido no elemento users_config. Por padrão, ele é users.xml. Se users_config for omitido, as configurações de usuário, os perfis e as cotas serão especificados diretamente em config.xml.
A configuração de usuário pode ser dividida em arquivos separados, assim como em config.xml e config.d/.
O nome do diretório é definido pela configuração users_config, sem o sufixo .xml, concatenado com .d.
O diretório users.d é usado por padrão, já que users_config tem como padrão users.xml.
Os fragmentos de configuração de usuário são mesclados em ordem lexicográfica por seus caminhos completos. Para arquivos no diretório padrão users.d/, isso equivale a ordená-los pelo nome do arquivo. O diretório legado conf.d/ também é mesclado; como conf.d é ordenado antes de users.d, todos os seus fragmentos são processados primeiro quando ambos os diretórios existem.
Observe que os arquivos de configuração primeiro são mesclados, levando em conta as configurações, e as inclusões são processadas depois disso.
Exemplo em XML
Por exemplo, você pode ter um arquivo de configuração separado para cada usuário, assim:
$ cat /etc/clickhouse-server/users.d/alice.xml<clickhouse>
<users>
<alice>
<profile>analytics</profile>
<networks>
<ip>::/0</ip>
</networks>
<password_sha256_hex>...</password_sha256_hex>
<quota>analytics</quota>
</alice>
</users>
</clickhouse>Exemplos de YAML
Aqui você pode ver a configuração padrão escrita em YAML: config.yaml.example.
Há algumas diferenças entre os formatos YAML e XML no que diz respeito às configurações do ClickHouse. As dicas para escrever configurações no formato YAML são apresentadas abaixo.
Uma tag XML com um valor de texto é representada por um par chave-valor em YAML
key: valueXML correspondente:
<key>value</key>Um nó XML aninhado é representado como um mapa YAML:
map_key:
key1: val1
key2: val2
key3: val3XML correspondente:
<map_key>
<key1>val1</key1>
<key2>val2</key2>
<key3>val3</key3>
</map_key>Para criar a mesma tag XML várias vezes, use uma sequência YAML:
seq_key:
- val1
- val2
- key1: val3
- map:
key2: val4
key3: val5XML correspondente:
<seq_key>val1</seq_key>
<seq_key>val2</seq_key>
<seq_key>
<key1>val3</key1>
</seq_key>
<seq_key>
<map>
<key2>val4</key2>
<key3>val5</key3>
</map>
</seq_key>Para fornecer um atributo XML, você pode usar uma chave de atributo com o prefixo @. Observe que @ é reservado pelo padrão YAML e, por isso, deve ser colocado entre aspas duplas:
map:
"@attr1": value1
"@attr2": value2
key: 123XML correspondente:
<map attr1="value1" attr2="value2">
<key>123</key>
</map>Também é possível usar atributos em uma sequência YAML:
seq:
- "@attr1": value1
- "@attr2": value2
- 123
- abcXML correspondente:
<seq attr1="value1" attr2="value2">123</seq>
<seq attr1="value1" attr2="value2">abc</seq>A sintaxe mencionada anteriormente não permite representar, em YAML, nós de texto XML com atributos XML. Esse caso especial pode ser tratado usando uma
chave de atributo #text:
map_key:
"@attr1": value1
"#text": value2XML correspondente:
<map_key attr1="value1">value2</map>Detalhes de implementação
Para cada arquivo de configuração, o servidor também gera arquivos file-preprocessed.xml ao iniciar. Esses arquivos contêm todas as substituições e sobrescritas já resolvidas e se destinam apenas à consulta. Se substituições do ZooKeeper tiverem sido usadas nos arquivos de configuração, mas o ZooKeeper não estiver disponível na inicialização do servidor, o servidor carregará a configuração a partir do arquivo pré-processado.
O servidor monitora alterações nos arquivos de configuração, bem como nos arquivos e nós do ZooKeeper usados para realizar substituições e sobrescritas, e recarrega dinamicamente as configurações de usuários e clusters. Isso significa que você pode modificar o cluster, os usuários e suas configurações sem reiniciar o servidor.