开启掘金成长之旅!这是我参与「掘金日新计划 · 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.