90.【数据库】ClickHouse从入门到放弃-用户配置

577 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第26天,点击查看活动详情 

文档参考:《ClickHouse原理解析与应用实践(数据库技术丛书)(朱凯)》

本回书讲解一下clickhouse的用户配置。

1.1 用户profile

用户profile的作用类似于用户角色。可以预先在user.xml中为ClickHouse定义多组profile,并为每组profile定义不同的配置项,以实现配置的复用。以下面的配置为例:

<yandex>
    <profiles><!-- 配置profile -->
 
        <default> <!-- 自定义名称,默认角色-->
            <max_memory_usage>10000000000</max_memory_usage>
            <use_uncompressed_cache>0</use_uncompressed_cache>
        </default>
 
        <test1> <!-- 自定义名称,默认角色-->
            <allow_experimental_live_view>1</allow_experimental_live_view>
            <distributed_product_mode>allow</distributed_product_mode>
        </test1>
    </profiles>
……

在这组配置中,预先定义了default和test1两组profile。引用相应的profile名称,便会获得相应的配置。我们可以在CLI中直接切换到想要的profile:

SET profile = test1

或是在定义用户的时候直接引用。

在所有的profile配置中,名称为default的profile将作为默认的配置被加载,所以它必须存在。如果缺失了名为default的profile,在登录时将会出现如下错误提示:

DB::Exception: There is no profile 'default' in configuration file..

profile配置支持继承,实现继承的方式是在定义中引用其他的profile名称,例如下面的例子所示:

<normal_inherit> <!-- 只有read查询权限-->
    <profile>test1</profile>
    <profile>test2</profile>
    <distributed_product_mode>deny</distributed_product_mode>
</normal_inherit>

这个名为normal_inherit的profile继承了test1和test2的所有配置项,并且使用新的参数值覆盖了test1中原有的distributed_product_mode配置项。

1.2 配置约束

constraints标签可以设置一组约束条件,以保障profile内的参数值不会被随意修改。约束条件有如下三种规则:

·Min:最小值约束,在设置相应参数的时候,取值不能小于该阈值。

·Max:最大值约束,在设置相应参数的时候,取值不能大于该阈值。

·Readonly:只读约束,该参数值不允许被修改。

现在举例说明:

<profiles><!-- 配置profiles -->
 
    <default> <!-- 自定义名称,默认角色-->
        <max_memory_usage>10000000000</max_memory_usage>
        <distributed_product_mode>allow</distributed_product_mode>
 
        <constraints><!-- 配置约束-->
            <max_memory_usage>
                <min>5000000000</min>
                <max>20000000000</max>
            </max_memory_usage>
            <distributed_product_mode>
                <readonly/>
            </distributed_product_mode>
        </constraints>
 
    </default>

从上面的配置定义中可以看出,在default默认的profile内,给两组参数设置了约束。其中,为max_memory_usage设置了min和max阈值;而为distributed_product_mode设置了只读约束。现在尝试修改max_memory_usage参数,将它改为50:

SET max_memory_usage = 50
DB::Exception: Setting max_memory_usage shouldn't be less than 5000000000.

可以看到,最小值约束阻止了这次修改。

接着继续修改distributed_product_mode参数的取值:

SET distributed_product_mode = 'deny'
DB::Exception: Setting distributed_product_mode should not be changed.

同样,配置约束成功阻止了预期外的修改。

还有一点需要特别明确,在default中默认定义的constraints约束,将作为默认的全局约束,自动被其他profile继承。

1.3 用户定义

使用users标签可以配置自定义用户。如果打开user.xml配置文件,会发现已经默认配置了default用户,在此之前的所有示例中,一直使用的正是这个用户。定义一个新用户,必须包含以下几项属性。

1.username

username用于指定登录用户名,这是全局唯一属性。该属性比较简单,这里就不展开介绍了。

2.password

password用于设置登录密码,支持明文、SHA256加密和double_sha1加密三种形式,可以任选其中一种进行设置。现在分别介绍它们的使用方法。

(1)明文密码:在使用明文密码的时候,直接通过password标签定义,例如下面的代码。

<password>123</password>

如果password为空,则表示免密码登录:

<password></password>

(2)SHA256加密:在使用SHA256加密算法的时候,需要通过password_sha256_hex标签定义密码,例如下面的代码。

<password_sha256_hex>a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3</password_sha256_hex>

可以执行下面的命令获得密码的加密串,例如对明文密码123进行加密:

# echo -n 123 | openssl dgst -sha256
(stdin)= a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3

(3)double_sha1加密:在使用double_sha1加密算法的时候,则需要通过password_double_sha1_hex标签定义密码,例如下面的代码。

<password_double_sha1_hex>23ae809ddacaf96af0fd78ed04b6a265e05aa257</password_double_sha1_hex>

可以执行下面的命令获得密码的加密串,例如对明文密码123进行加密:

# echo -n 123 | openssl dgst -sha1 -binary | openssl dgst -sha1
(stdin)= 23ae809ddacaf96af0fd78ed04b6a265e05aa257
3. networks

networks表示被允许登录的网络地址,用于限制用户登录的客户端地址,关于这方面的介绍将会在11.2节展开。

4.profile

用户所使用的profile配置,直接引用相应的名称即可,例如:

<default>
    <profile>default</profile>
</default>

该配置的语义表示,用户default使用了名为default的profile。

5.quota

quota用于设置该用户能够使用的资源限额,可以理解成一种熔断机制。关于这方面的介绍将会在11.3节展开。

现在用一个完整的示例说明用户的定义方法。首先创建一个使用明文密码的用户user_plaintext:

<yandex>
    <profiles>
        ……
    </profiles>
    <users>
            <default><!—默认用户 -->
            ……
            </default>
        <user_plaintext>
                <password>123</password>
                <networks>
                    <ip>::/0</ip>
                </networks>
                <profile>normal_1</profile>
                <quota>default</quota>
        </user_plaintext>

由于配置了密码,所以在登录的时候需要附带密码参数:

# clickhouse-client -h 10.37.129.10 -u user_plaintext --password 123
Connecting to 10.37.129.10:9000 as user user_plaintext.

接下来是两组使用了加密算法的用户,首先是用户user_sha256:

<user_sha256>
    <!-- echo -n 123 | openssl dgst -sha256 !-->
    <password_sha256_hex>a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3</password_sha256_hex>
        <networks>
            <ip>::/0</ip>
        </networks>
        <profile>default</profile>
        <quota>default</quota>
</user_sha256>

然后是用户user_double_sha1:

<user_double_sha1>
    <!-- echo -n 123 | openssl dgst -sha1 -binary | openssl dgst -sha1 !-->
    <password_double_sha1_hex>23ae809ddacaf96af0fd78ed04b6a265e05aa257</pass-word_double_sha1_hex>
        <networks>
            <ip>::/0</ip>
        </networks>
        <profile>default</profile>
        <quota>limit_1</quota>
</user_double_sha1>

这些用户在登录时同样需要附带加密前的密码,例如:

# clickhouse-client -h 10.37.129.10 -u user_sha256 --password 123
Connecting to 10.37.129.10:9000 as user user_sha256.