Klustron 用户和权限指南
Klustron 用户和权限指南
注意:
如无特别说明,文中的版本号可以使用任何已发布版本的版本号代替。所有已发布版本详见:Release_notes
本文目标:
通过实例介绍Klustron表底层存储的实现,以及用户和权限相关的SQL语法。文中的例子是为某个业务测试创建测试用户、数据库和相应的模式(schema), 并给用户授予合适的权限。
Klustron 集群的计算节点部署在服务器 kunlun2(192.168.40.152)上。
01 创建用户
创建用户的语法如下:
CREATE USER name [ [ WITH ] option [ ... ] ]
where option can be:
SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| REPLICATION | NOREPLICATION
| BYPASSRLS | NOBYPASSRLS
| CONNECTION LIMIT connlimit
| [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
| VALID UNTIL 'timestamp'
| IN ROLE role_name [, ...]
| IN GROUP role_name [, ...]
| ROLE role_name [, ...]
| ADMIN role_name [, ...]
| USER role_name [, ...]
| SYSID uid
create user 命令等同于 create role,除了一点:create user 有隐含的 login 权限,可以登录数据库;而 create role 没有该权限。
Klustron默认的pg_hba.conf(/kunlun/server_datadir/47001) 文件的增加了配置内容如下(trust不验证密码,MD5表示需要验证密码)
host all all 192.168.40.152/32 trust
host all all 127.0.0.1/32 trust
host all agent 0.0.0.0/0 reject
host all all 0.0.0.0/0 md5
表明本地登录计算节点不需要验证密码,其他机器的客户端则需要验证密码。
pg_hba.conf文件格式如下:
# TYPE DATABASE USER ADDRESS METHOD
TYPE:指的是连接类型,一般有local和host两种(ssl类型的连接方式可以具体参考文档),local指的是本地Unix Socket连接,host指的是从远程主机连接或本地主机的localhost地址连接。
DATABASE:指的是要连接的数据库,all表示所有,还可以使用具体的数据库名,比如postgres。
USER:指的是用来连接的用户名,all表示所有用户,还可以使用具体的用户名,比如postgres。
ADDRESS:指的是连接数据库的客户端IP地址来源,127.0.0.1/32表示只允许来自己本机的连接,0.0.0.0/0表示允许来自所有ip的连接,192.168.40.0/24表示允许192.168.40.1-192.168.40.255这个地址段的ip地址连接。
METHOD:表示连接的时候使用的认证方式,常用的有trust,表示信任所有连接。md5,表示需要连接的客户端提供一个加密密码来登录。
首先在192.168.40.152上创建测试用户joe,由于配置了下面的规则
host all all 192.168.40.152/32 trust
所以允许在本机使用kunlun用户不输入密码登录
psql -h 192.168.40.152 -p 47001 postgres
create user joe with password 'joe123';
连接Type为”local”就表明允许使用Unix Socket连接
# "local" is for Unix domain socket connections only
local all all trust
测试使用Unix Socket方式无密码登录postgres库。
[kunlun@kunlun2 47001]$ psql -h /kunlun/server_datadir/47001 -p 47001 postgres
psql (Kunlun-1.1.1 on x86_64-pc-linux-gnu, 64-bit)
Type "help" for help.
postgres=#
举例定义一个新的连接规则,允许joe通过192.168.40.151的客户端登录数据库,但不允许其从192.168.40.153登录。在pg_hba.conf中增加下面几条规则。
# host all all 0.0.0.0/0 md5
host all joe 192.168.40.153/32 reject
host all joe 192.168.40.151/32 md5
注意:如果同时匹配了pg_hba.conf 中的多个规则,前面的规则会覆盖后面的规则。
修改pg_hba.conf文件后,还需要运行下面的命令使得配置文件改动生效:
[kunlun@kunlun2 47001]$ pg_ctl reload -D /kunlun/server_datadir/47001
server signaled
然后进行登录测试:
在151上可以joe可以正常登录
[kunlun@kunlun1 ~]$ psql -h 192.168.40.152 -p 47001 -U joe postgres
Password for user joe:
psql (Kunlun-1.1.1 on x86_64-pc-linux-gnu, 64-bit)
Type "help" for help.
postgres=> quit
而在153上发起登录,则被拒绝
[kunlun@kunlun3 ~]$ psql -h 192.168.40.152 -p 47001 -U joe postgres
psql: FATAL: pg_hba.conf rejects connection for host "192.168.40.153", user "joe", database "postgres", SSL off
在实际的业务中,建议用户在Klustron多个计算节点的pg_hba.conf定义相同的用户数据库连接规则,从而方便进行用户连接管理。
02 创建数据库
建立数据库的语法如下:
CREATE DATABASE name
[ [ WITH ] [ OWNER [=] user_name ]
[ TEMPLATE [=] template ]
[ ENCODING [=] encoding ]
[ LC_COLLATE [=] lc_collate ]
[ LC_CTYPE [=] lc_ctype ]
[ ALLOW_CONNECTIONS [=] allowconn ]
[ CONNECTION LIMIT [=] connlimit ]
[ IS_TEMPLATE [=] istemplate ] ]
执行 create database 命令的用户必须是 superuser 或者拥有 CREATEDB 的权限。默认情况下,将通过克隆标准系统数据库 template1 创建新数据库。可以通过写入 模版名称来指定不同的模板。另外指定template0,用户可以创建一个仅包含 PostgreSQL 版本预定义的标准对象的原始数据库。 如果用户希望避免复制任何可能已添加到 template1 的本地安装对象,则可以使用模版 template0 来创建数据库。
**注意:**由于 Klustron 的架构设计决定了其不支持 create tablepace 的语法。
postgres=# create tablespace test location '/kunlun/server_datadir/47001';
ERROR: Statement 'CREATE TABLESPACE' is not supported in Kunlun.
创建测试数据库 kunlun_testing
create database kunlun_testing with owner joe encoding utf8 template template0;
创建数据库的时候使用了模版 template0; 数据库的字符集是 utf8, 用户 joe 拥有新创建数据库 kunlun_testing 的所有权限。
03 创建模式(schema)
在 Klustron 中,数据的分布有 3 个层次:数据库(database),模式(schema) 和 用户数据(包含表索引存储过程等)。一个数据库中可以包含任意数量的模式。
模式可以看着是数据库对象的逻辑集合。每个数据库在创建后默认的模式是public,用户还可以随时按业务需求增加更多的模式。
一个模式可以包含视图、索引、数据类型、函数和操作符等。
相同的对象名称可以被用于不同的模式中而不会出现冲突,例如 schema1 和 schema2都可以包含名为kltest的表。
使用模式的优点有:
- 允许多个用户使用一个数据库并且不会互相干扰。
- 将数据库对象组织成逻辑组以便更容易管理。
- 第三方应用的对象可以放在独立的模式中,这样它们就不会与其他对象的名称发生冲突。
模式类似于操作系统层的目录,但是模式不能嵌套。
登录 kunlun_testing 数据库,创建一个名为 joe_testing 的模式,然后将用户 joe 的默认 search_path 设置为模式 joe_testing,这样在 joe 的用户 session 在操作 joe_testing 模式对象时,就不用显式加 ”joe_testing” 前缀了。
psql -h 192.168.40.153 -p 47001 -U joe kunlun_testing
create schema joe_testing;
alter user joe set search_path to joe_testing;
使用用户joe连接数据库kunlun_testing,然后在模式joe_testing下创建表kltest,并插入一些测试记录
\c - joe
create table kltest (id int);
insert into kltest select generate_series(1,100);
Klustron 数据库里面的模式都在后端存储集群都对应有一个 MySQL 的数据库来存储其中所有的表分片。
上面的例子中,在计算节点中名为 kunlun_testing 的数据库,并在数据库中建立模式 joe_testing,那么则在底层 MySQL 集群中创建的数据库名为 kunlun_testing_$$joe_testing。其命名规则为 {database_name}$$_
查看 kltest 表存放的存储节点相关的信息
psql -h 192.168.40.152 -p 47001 kunlun_testing
select relname table_name, name shard_name, hostaddr host from pg_class t1,pg_shard t2,pg_shard_node t3 where t1.relshardid = t2.id and t2.id = t3.id and t1.relname like '%test%';
登录shard2
mysql -h192.168.40.151 -P57005 -upgx -ppgx_pwd
show databases;
use kunlun_testing_$$_joe_testing;
show tables;
select count(*) from kltest;
用户在计算节点创建一个不分区的表 kunlun_testing.joe_testing.kltest,计算节点会自动分配某个存储 shard 来存储表 kltest,并在该 shard 的 MySQL 数据库 kunlun_testing_$$_joe_testing 中创建同名的表来存储数据, 并且 Klustron 会在计算节点的元数据表中记录下来 kltest 的数据存储在 shard2 上。
这样在计算节点读写数据时候,计算节点就可以自动找到 kltest 的存储节点 shard2,然后与 shard2 交互来读写 kunlun_testing.joe_testing.kltest 表的数据。
psql -h 192.168.40.152 -p 47001 kunlun_testing joe
select count(*) from kltest;
04 用户权限授予和回收
创建另外一个数据库用户tom, 并授权用户tom查询表kltest的权限
psql -h 192.168.40.152 -p 47001 -U kunlun_testing
grant usage on schema joe_testing to tom;
grant select on joe_testing.kltest to tom;
用户要访问模式下的对象,有下面的权限验证逻辑:
是否有模式的 ’USAGE’
No: 拒绝用户访问
Yes: 用户是否有相应的表的权限
No: 拒绝访问
Yes: 检查需要访问字段的权限
权限说明:
SELECT:允许从指定表,视图或序列的任何列或列出的特定列进行SELECT。也允许
用COPY TO。在UPDATE或DELETE中引用现有列值也需要此权限。对于序列,此权限还允许使用currval函数。对于大对象,此权限允许读取对象。
INSERT:允许将新行INSERT到指定的表中。如果列出了特定列,则只能在INSERT命令中为这些列分配(因此其他列将接收默认值)。也允许COPY FROM。
UPDATE:允许更新指定表的任何列或列出的特定列,需要SELECT权限。
DELETE:允许删除指定表中的行,需要SELECT权限。
TRUNCATE:TRUNCATE TABLE 与 DELETE 具有相同的效果,但是由于它实际上并不扫描表,所以速度更快。 此外TRUNCATE TABLE 可以立即释放表空间,而不需要后续 VACUUM 操作,这在大表上非常有用。
TRIGGER:允许在指定的表上创建触发器。 (1.2版本支持)
CREATE:对于数据库,允许在数据库中创建新的schema、table、index。
CONNECT:允许用户连接到指定的数据库。在连接启动时检查此权限。
EXECUTE:允许使用指定的函数或过程以及在函数。
USAGE:对于schema,允许访问指定模式中包含的对象;对于sequence,允许使用currval和nextval函数。对于类型和域,允许在创建表,函数和其他模式对象时使用类型或域。
ALL PRIVILEGES:一次授予所有可用权限。
可以使用下面的语句将joe_testing下面的操作所有表的权限授权给tom。
grant select, insert, update, delete on all tables in schema joe_testing to tom;
可以通过下面的语句查询tom用户当前拥有的对象权限。
\c - tom;
set search_path=joe_testing;
\dp
授予 tom 权限之后,通过 tom 登录就可以查询和更改表 kltest 了。
psql -h 192.168.40.152 -p 47001 -U tom kunlun_testing
search_path=joe_testing;
select * from kltest limit 10;
insert into kltest values(101);
delete from kltest where id=100;
授予权限的GRANT命令的具体使用方法请参考链接。
使用 REVOKE 语句回收用户的权限,通过下面语句回收 tom 在模式 joe_testing 下面的所有表的操作权限。回收权限之后,tom 就无法操作 joe_testing 的表中的记录了。
psql -h 192.168.40.152 -p 47001 kunlun_testing
revoke select, insert, update, delete on all tables in schema joe_testing from tom;
\c - tom
set search_path=joe_testing;
select * from kltest limit 10;
ERROR: permission denied for table kltest
收回权限的REVOKE命令的具体使用方法请参考链接。