一、前言
在前面的章节里,我们已经次用ckman 安装部署了两套ClickHouse集群。本节我们将在其中一套集群上演示创建用户角色、创建数据库和用户,并为用户赋予不同权限。以便为后面导入数据验证测试以及为chproxy调整配置文件做准备。
二、创建用户角色
为更好管理不同用户角色,建议为不同的角色先创建对应的配置文件。
1)创建配置文件
-- 执行如下SQL CREATE PROFILE IF NOT EXISTS 'database_admin' ON CLUSTER prod_cd_cluster;
2)创建角色
CREATE ROLE IF NOT EXISTS read_write ON CLUSTER prod_cd_cluster SETTINGS PROFILE 'database_admin';
也可以通过ClickHouse自带的客户端工具进行上述命令操作。
ClickHouse 客户端自带工具登录方式为: IP:8123/play,使用浏览器登录。
如下演示创建一个管理只读用户的配置文件,并在该配置文件下创建一个只读用户,演示操作如下:
创建配置文件:
CREATE PROFILE IF NOT EXISTS 'database_user' ON CLUSTER prod_cd_cluster;
- 选择default账号,密码为创建CK集群时设置的密码
- 命令后跟 on cluster cluster_name (如果不添加cluster_name,数据不会创建在整个集群而只是某个节点)
- 点击Run执行命令
创建只读用户:
CREATE ROLE IF NOT EXISTS read_only ON CLUSTER ck_replica1 SETTINGS PROFILE 'database_user' ON CLUSTER prod_cd_cluster;
三、创建数据库
CREATE DATABASE IF NOT EXISTS ckdb ON CLUSTER prod_cd_cluster;
可以通过show databases SQL命令来查看当前集群所有数据库信息,如下所示:
-- 查询数据库信息 show databases
也可以通过show create database xxx 命令来查看某个数据库的具体信息,如下所示:
-- 查询某个数据库信息 SHOW CREATE DATABASE ckdb;
通过以上SQL可以查看数据库创建语句及库引擎默认为Atomic。
**补充信息:**如果希望创建一个非Atomic库引擎数据库,可以通过如下SQL语句创建,并且要确认该引擎是否被当前CK版本所支持。
CREATE DATABASE IF NOT EXISTS cktestdb ON CLUSTER prod_cd_cluster ENGINE = Ordinary;
如果使用的库引擎不被当前数据库默认支持,会报如下错误:
“10.110.5.136”, 9000, “336”, “Code: 336. DB::Exception: Ordinary database engine is deprecated (see also allow_deprecated_database_ordinary setting). (UNKNOWN_DATABASE_ENGINE) (version 22.8.5.29 (official build))”, “0”, “0”]Code: 336. DB::Exception: There was an error on [10.110.5.135:9000]: Code: 336. DB::Exception: Ordinary database engine is deprecated (see also allow_deprecated_database_ordinary setting). (UNKNOWN_DATABASE_ENGINE) (version 22.8.5.29 (official build)). (UNKNOWN_DATABASE_ENGINE) (version 22.8.5.29 (official build))
四、创建用户及授权
为更好的管理数据库权限,建议为用户创建不同的角色用户,比如读写和只读权限用户。
CK可以有多种方式创建用户,生产环境建议使用更安全的密码认证方式,具体操作如下。
1)生成用户SHA256_HASH密码
## 选择CK集群任一台服务器,参照如下命令生成SHA256_HASH密码 PASSWORD=$(base64 < /dev/urandom | head -c8); echo "{用户密码}"; echo -n "{用户密码}" | sha256sum | tr -d '-' --如示例如下 PASSWORD=$(base64 < /dev/urandom | head -c8); echo 'Ckman123456!'; echo -n 'Ckman123456!' | sha256sum | tr -d '-'
2)创建用户
-- 创建用户SQL语法 CREATE USER IF NOT EXISTS {用户名称} ON CLUSTER {集群名称} IDENTIFIED WITH SHA256_HASH BY {用户密码} DEFAULT ROLE {角色} DEFAULT DATABASE {默认数据库}; -- 创建读写用户 CREATE USER IF NOT EXISTS ck_writer ON CLUSTER 'prod_cd_cluster' IDENTIFIED WITH SHA256_HASH BY 'bd9734cd2335507ead689b8a61f75757bd00331f349d3296c96fc69cd562c89a' DEFAULT ROLE read_write DEFAULT DATABASE ckdb; -- 创建只读用户 CREATE USER IF NOT EXISTS ck_reader ON CLUSTER 'prod_cd_cluster' IDENTIFIED WITH SHA256_HASH BY 'bd9734cd2335507ead689b8a61f75757bd00331f349d3296c96fc69cd562c89a' DEFAULT ROLE read_only DEFAULT DATABASE ckdb;
操作过程及结果如下图:
补充信息:
可以采用如下方法创建一个可以允许从任何节点访问CK数据库的用户,如下所示:
CREATE USER test IDENTIFIED WITH plaintext_password BY 'test' HOST ANY ON CLUSTER prod_cd_cluster; -- `IDENTIFIED WITH plaintext_password`表明使用明文密码进行认证
可以通过如下方式来查看创建的用户信息,如下所示:
- 方式一:
show create user test;
- 方式二
select * from system.users where name = 'test';
3)分配用户权限
-- 分配权限语法如下 GRANT ON CLUSTER {集群名称} {权限,多个权限用逗号分隔} ON {数据库名称}.* TO {用户名称}; -- 分配读写用户权限 GRANT ON CLUSTER 'prod_cd_cluster' SHOW, SELECT, INSERT, ALTER, CREATE TABLE, CREATE VIEW, CREATE DICTIONARY, DROP DICTIONARY, DROP TABLE, DROP VIEW, TRUNCATE, OPTIMIZE, dictGet ON ckdb.* TO ck_writer;
-- 分配只读用户权限 GRANT ON CLUSTER 'prod_cd_cluster' SHOW, SELECT, OPTIMIZE, dictGet ON ckdb.* TO ck_reader;
4)查询用户权限
-- 查询用户权限语法如下 SHOW GRANTS FOR {用户名称} SHOW GRANTS FOR ck_writer,ck_reader;
5)修改用户权限
因为ClickHouse不同版本语法不同,亦或是某些SQL特性未在某个ClickHouse版本中支持。
对于ClickHouse修改用户权限,可以采用先对权限进行回收,然后执行grant授权。
比如当前使用的ClickHouse 22.8.5.29不支持使用 WITH REPLACE OPTION来修改权限,如下示例所示。
GRANT SELECT, INSERT, UPDATE, DELETE ON CLUSTER 'prod_cd_cluster' ON db1.* TO ck_reader WITH REPLACE OPTION;
欢迎您关注我的公众号【尚雷的驿站】
公众号:尚雷的驿站
CSDN :https://blog.csdn.net/shlei5580
墨天轮:https://www.modb.pro/u/2436
PGFans:https://www.pgfans.cn/user/home?userId=4159