跳至主要内容
跳至主要内容
编辑此页

配置文件

注意

ClickHouse Cloud 不支持基于 XML 的设置配置文件。因此,在 ClickHouse Cloud 中,您将找不到 config.xml 文件。相反,您应该使用 SQL 命令通过设置配置文件管理设置。

有关更多详细信息,请参阅 “配置设置”

ClickHouse 服务器可以使用 XML 或 YAML 语法的配置文件进行配置。在大多数安装类型中,ClickHouse 服务器以 /etc/clickhouse-server/config.xml 作为默认配置文件运行,但也可以在服务器启动时使用命令行选项 --config-file-C 手动指定配置文件的位置。 额外的配置文件可以放置在相对于主配置文件的 config.d/ 目录中,例如 /etc/clickhouse-server/config.d/ 目录。 此目录中的文件和主配置文件在 ClickHouse 服务器应用配置之前,会在预处理步骤中合并。配置文件按字母顺序合并。为了简化更新并提高模块化程度,最好保持默认的 config.xml 文件不变,并将额外的自定义设置放置在 config.d/ 中。 ClickHouse keeper 配置位于 /etc/clickhouse-keeper/keeper_config.xml。 同样,Keeper 的额外配置文件需要放置在 /etc/clickhouse-keeper/keeper_config.d/ 中。

可以混合使用 XML 和 YAML 配置文件,例如,您可以拥有一个主配置文件 config.xml 和额外的配置文件 config.d/network.xmlconfig.d/timezone.yamlconfig.d/keeper.yaml。 不支持在单个配置文件中混合使用 XML 和 YAML。 XML 配置文件应使用 <clickhouse>...</clickhouse> 作为顶级标签。 在 YAML 配置文件中,clickhouse: 是可选的,如果不存在,解析器会自动插入它。

合并配置

两个配置文件(通常是主配置文件和来自 config.d/ 的另一个配置文件)的合并方式如下

  • 如果一个节点(即指向元素的路径)同时存在于两个文件中,并且没有 replaceremove 属性,则将其包含在合并后的配置文件中,并递归地包含来自两个节点的子节点。
  • 如果两个节点中的一个包含 replace 属性,则将其包含在合并后的配置文件中,但仅包含带有 replace 属性的节点的子节点。
  • 如果两个节点中的一个包含 remove 属性,则该节点不包含在合并后的配置文件中(如果已存在,则将其删除)。

例如,给定两个配置文件

<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>

<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>

生成的合并配置文件将是

<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>

通过环境变量和 ZooKeeper 节点进行替换

要指定元素的某个值应替换为环境变量的值,可以使用 from_env 属性。

例如,环境变量 $MAX_QUERY_SIZE = 150000

<clickhouse>
    <profiles>
        <default>
            <max_query_size from_env="MAX_QUERY_SIZE"/>
        </default>
    </profiles>
</clickhouse>

生成的配置将是

<clickhouse>
    <profiles>
        <default>
            <max_query_size>150000</max_query_size>
        </default>
    </profiles>
</clickhouse>

同样可以使用 from_zk(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
9005

生成以下配置

<clickhouse>
    <postgresql_port>9005</postgresql_port>
</clickhouse>

默认值

具有 from_envfrom_zk 属性的元素还可以具有 replace="1" 属性(后者必须出现在 from_env/from_zk 之前)。在这种情况下,该元素可以定义默认值。如果设置了环境变量或 ZooKeeper 节点,则该元素采用该值,否则采用默认值。

前面的示例重复一遍,但假设 MAX_QUERY_SIZE 未设置

<clickhouse>
    <profiles>
        <default>
            <max_query_size replace="1" from_env="MAX_QUERY_SIZE">150000</max_query_size>
        </default>
    </profiles>
</clickhouse>

生成的配置是

<clickhouse>
    <profiles>
        <default>
            <max_query_size>150000</max_query_size>
        </default>
    </profiles>
</clickhouse>

使用文件内容进行替换

也可以通过文件内容替换配置的某些部分。 这可以通过两种方式完成

  • 替换值:如果一个元素具有 incl 属性,其值将被替换为引用文件的内容。 默认情况下,包含替换的文件路径是 /etc/metrika.xml。 这可以在服务器配置中的 include_from 元素中更改。 替换值在文件的 /clickhouse/substitution_name 元素中指定。 如果在 incl 中指定的替换不存在,则会在日志中记录。 为了防止 ClickHouse 记录缺失的替换,请指定属性 optional="true"(例如,用于 的设置)。
  • 替换元素:如果您想用替换替换整个元素,请使用 include 作为元素名称。 元素名称 include 可以与属性 from_zk = "/path/to/node" 结合使用。在这种情况下,元素值将被替换为 ZooKeeper 节点 /path/to/node 中的内容。 这也适用于您将整个 XML 子树存储为 Zookeeper 节点,它将完全插入到源元素中。

以下是一个示例

<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>

如果您想将替换内容与现有配置合并而不是附加,可以使用属性 merge="true"。 例如:<include from_zk="/some_path" merge="true">。在这种情况下,现有配置将与替换内容合并,并且现有配置设置将被替换为替换中的值。

加密和隐藏配置

您可以使用对称加密来加密配置元素,例如,明文密码或私钥。 为此,首先配置 加密编解码器,然后将加密编解码器的名称作为值添加到要加密的元素的 encrypted_by 属性中。

from_zkfrom_envincl 属性或 include 元素不同,在预处理文件中不执行任何替换(即,加密值的解密)。 解密仅在服务器进程运行时发生。

例如

<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>

属性 from_envfrom_zk 也可以应用于 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>

加密密钥和加密值可以定义在任何配置文件中。

一个示例 config.xml 如下

<clickhouse>

    <encryption_codecs>
        <aes_128_gcm_siv>
            <key_hex from_zk="/clickhouse/aes128_key_hex"/>
        </aes_128_gcm_siv>
    </encryption_codecs>

</clickhouse>

一个示例 users.xml 如下

<clickhouse>

    <users>
        <test_user>
            <password encrypted_by="AES_128_GCM_SIV">96280000000D000000000030D4632962295D46C6FA4ABF007CCEC9C1D0E19DA5AF719C1D9A46C446</password>
            <profile>default</profile>
        </test_user>
    </users>

</clickhouse>

要加密值,可以使用(示例)程序 encrypt_decrypt

./encrypt_decrypt /etc/clickhouse-server/config.xml -e AES_128_GCM_SIV abcd
961F000000040000000000EEDDEF4F453CFE6457C4234BD7C09258BD651D85

即使使用加密的配置元素,加密的元素仍然出现在预处理的配置文件中。 如果这对于您的 ClickHouse 部署来说是一个问题,则有两种替代方案:要么将预处理文件的文件权限设置为 600,要么使用属性 hide_in_preprocessed

例如

<clickhouse>

    <interserver_http_credentials hide_in_preprocessed="true">
        <user>admin</user>
        <password>secret</password>
    </interserver_http_credentials>

</clickhouse>

用户设置

config.xml 文件可以指定包含用户设置、配置文件和配额的单独配置。 此配置的相对路径在 users_config 元素中设置。 默认情况下,它是 users.xml。 如果省略 users_config,则用户设置、配置文件和配额直接在 config.xml 中指定。

用户配置可以拆分为单独的文件,类似于 config.xmlconfig.d/。 目录名称定义为 users_config 设置,不带 .xml 后缀,然后连接 .d。 默认情况下,使用目录 users.d,因为 users_config 默认为 users.xml

请注意,配置文件首先 合并,并考虑到设置,然后处理 include。

XML 示例

例如,您可以为每个用户拥有一个单独的配置文件,如下所示

$ 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>

YAML 示例

您可以在此处看到用 YAML 编写的默认配置:config.yaml.example

在 ClickHouse 配置方面,YAML 和 XML 格式之间存在一些差异。 以下是编写 YAML 格式配置的技巧。

具有文本值的 XML 标签由 YAML 键值对表示

key: value

相应的 XML

<key>value</key>

嵌套的 XML 节点由 YAML 映射表示

map_key:
  key1: val1
  key2: val2
  key3: val3

相应的 XML

<map_key>
    <key1>val1</key1>
    <key2>val2</key2>
    <key3>val3</key3>
</map_key>

要创建相同的 XML 标签多次,请使用 YAML 序列

seq_key:
  - val1
  - val2
  - key1: val3
  - map:
      key2: val4
      key3: val5

相应的 XML

<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>

要提供 XML 属性,可以使用带有 @ 前缀的属性键。 请注意,@ 被 YAML 标准保留,因此必须用双引号括起来

map:
  "@attr1": value1
  "@attr2": value2
  key: 123

相应的 XML

<map attr1="value1" attr2="value2">
    <key>123</key>
</map>

也可以在 YAML 序列中使用属性

seq:
  - "@attr1": value1
  - "@attr2": value2
  - 123
  - abc

相应的 XML

<seq attr1="value1" attr2="value2">123</seq>
<seq attr1="value1" attr2="value2">abc</seq>

上述语法不允许表达带有 XML 属性的 XML 文本节点为 YAML。 这种特殊情况可以使用 #text 属性键来实现

map_key:
  "@attr1": value1
  "#text": value2

相应的 XML

<map_key attr1="value1">value2</map>

实现细节

对于每个配置文件,服务器在启动时还会生成 file-preprocessed.xml 文件。 这些文件包含所有完成的替换和覆盖,并且旨在用于信息目的。 如果在配置文件中使用 ZooKeeper 替换,但 ZooKeeper 在服务器启动时不可用,则服务器从预处理的文件加载配置。

服务器跟踪配置文件的更改,以及在执行替换和覆盖时使用的文件和 ZooKeeper 节点,并动态地重新加载用户和集群的设置。 这意味着您可以修改集群、用户及其设置而无需重新启动服务器。

    © . This site is unofficial and not affiliated with ClickHouse, Inc.