绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
KunlunBase功能体验范例
2022-10-10 17:16:19

1.数据库的容量测试

sysbench oltp_point_select        \
      --tables=[共有几张数据表]                   \
      --table-size=[每张数据表要灌的数据量,推荐至少为 10000000]           \
      --db-driver=[pgsql/mysql]             \
      --pgsql-host=[host]        \
      --pgsql-port=[port]             \
      --pgsql-user=[userNmae]         \
      --pgsql-password=[userPwd] \
      --pgsql-db=[dbName]           \
      prepare

2.写入性能测试case

  • 当前sysbench关于写入性能相关的测试case有 read_write、update_index、update_non_index、write_only、insert
  • 命令可以参考
sysbench oltp_${case} \
--tables=${tables} \
--table-size=${tb_size} \
--db-ps-mode=disable \
--db-driver=[pgsql/mysql] \
--pgsql-host=${host} \
--report-interval=[间隔s报告一次结果] \
--pgsql-port=${port} \
--pgsql-user=${user} \
--pgsql-password=${pwd} \
--pgsql-db=${db} \
--threads=${threads} \
--time=${tim} \
--rand-type=uniform 
run 

3.查询性能 ,多表 join

  • 当前sysbench关于查询性能相关的测试case有 read_only、point_select

    • 相关命令可以参考第二步
  • 当前版本sysbench并不支持多表join,因此我们需要自定义lua测试脚本

    • 以下是简单范例,可以根据需求自行修改
    • vim oltp_mutli_join.lua
require("oltp_common")

function thread_init()
drv = sysbench.sql.driver()
con = drv:connect()
end

function thread_done()
con:disconnect()
end

function event()
local tableNum1
local tableNum2
local rs

tableNum1 = math.random(1,sysbench.opt.tables)
tableNum2 = math.random(1,sysbench.opt.tables)

local table1 = "sbtest" .. tableNum1
local table2 = "sbtest" .. tableNum2

local id = math.random(1,sysbench.opt.table_size)

-- db_query("begin")
rs = db_query("SELECT a.k FROM " .. table1 .. " a left join " .. table2 .. " b ON a.id = b.id WHERE a.id= " .. id)
-- db_query("commit")

end
  • 在自定义脚本中,必须要提供thread_init() thread_done() event()这三个函数

    • event()就是要运行的测试函数
    • sysbench.opt.tables 则是在运行脚本时传入的--tables 参数,sysbench.opt.table_size是--table_size参数。其它传入的参数都可以通过sysbench.opt来获取
    • db_query就是要运行的sql语句,在event()方法中,有一个db_query,则运行中TPS=QPS/1。有n个db_query,则运行中TPS=QPS/n
    • 不可以在自定义的lua脚本里面使用print(),否则不会产生结果
  • 使用sysbench运行自定义lua脚本
    image.png

4.数据库的安全性

4.1 create user 和create role的区别

使用超级用户先创建

create role u1;
create user u2;
\du
create database vito;
\c vito
create table t1(a int, b int);
create table t2(a int, b int);
create table t3(a int, b int);

image.png

u1是没有登录的权限,不能够进行登录数据库
image.png

在超级用户中修改用户u1登录权限

ALTER ROLE u1 WITH LOGIN;

image.png

4.2 创建用户和角色语法

CREATE USER/ROLE name [ [ WITH ] option [ ... ] ]  : 关键词 USER,ROLE; name 用户或角色名; 

where option can be:

      SUPERUSER | NOSUPERUSER      :超级权限,拥有所有权限,默认nosuperuser。
    | CREATEDB | NOCREATEDB        :建库权限,默认nocreatedb。
    | CREATEROLE | NOCREATEROLE    :建角色权限,拥有创建、修改、删除角色,默认nocreaterole。
    | LOGIN | NOLOGIN              :登录权限,作为连接的用户,默认nologin,除非是create user(默认登录)。
    | REPLICATION | NOREPLICATION  :复制权限,用于物理或则逻辑复制(复制和删除slots),默认是noreplication。
    | BYPASSRLS | NOBYPASSRLS      :安全策略RLS权限,默认nobypassrls。
    | CONNECTION LIMIT connlimit   :限制用户并发数,默认-1,不限制。正常连接会受限制,后台连接和prepared事务不受限制。
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL :设置密码,密码仅用于有login属性的用户,不使用密码身份验证,则可以省略此选项。可以选择将空密码显式写为PASSWORD NULL。
    加密方法由配置参数password_encryption确定,密码始终以加密方式存储在系统目录中。
    | VALID UNTIL 'timestamp'      :密码有效期时间,不设置则用不失效。
    | IN ROLE role_name [, ...]    :新角色将立即添加为新成员。
    | IN GROUP role_name [, ...]   :同上
    | ROLE role_name [, ...]       :ROLE子句列出一个或多个现有角色,这些角色自动添加为新角色的成员。 (这实际上使新角色成为“组”)。
    | ADMIN role_name [, ...]      :与ROLE类似,但命名角色将添加到新角色WITH ADMIN OPTION,使他们有权将此角色的成员资格授予其他人。
    | USER role_name [, ...]       :同上
    | SYSID uid                    :被忽略,但是为向后兼容性而存在。
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
    [, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    ON [ TABLE ] table_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { SEQUENCE sequence_name [, ...]
         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON DOMAIN domain_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { { FUNCTION | PROCEDURE | ROUTINE } routine_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
         | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    ON LARGE OBJECT loid [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { CREATE | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPE type_name [, ...]
    TO role_specification [, ...] [ WITH GRANT OPTION ]

其中role_specification可以是:

    [ GROUP ] role_name
  | PUBLIC
  | CURRENT_USER
  | SESSION_USER

GRANT role_name [, ...] TO role_name [, ...] [ WITH ADMIN OPTION ]

4.3 权限示例

创建database

登录u2进行创建数据库d1,目前用户u2没有创建的权限会失败
psql postgres://u2@192.168.0.126:8888/postgres

\c
SELECT session_user, current_user;
create database d1;

image.png

使用超级用户授权u2可以在数据库中创建schema

alter user u2 createdb;

授权后切换到u2账户下再次进行创建

create database d1;

image.png

创建schema

用户u2进入到不属于自己的数据库 进行创建schema,会失败
先用超级用户创建个数据库d2,用户u2在d2数据库中进行创建schema(s1);
image.png

使用超级用户授权用户u2可以在数据库d2中创建schema(s1);

grant create on database d2 to u2;

授权之后再次进行创建s1;
image.png

单表/所有表授权

使用u1账户进行登录psql postgres://u1@192.168.0.126:8888/vito
由于没有表的权限,进行的增删改查都会失败
image.png

超级用户进行赋予权限,因为只为t1表的权限赋予u1,所以表t2,t3依然失败

grant select,insert,update,delete on t1 to u1;
#GRANT

image.png

向所有表赋予权限,表t2,t3都获得了权限

grant select,insert,update,delete on all tables in schema public to u1;

image.png

列授权

使用超级用户创建t4表,并且回收t4表中的insert权限,为t4表中的id与name赋予权限,age字段是没有权限的

create table t4(id int, name varchar(10), age int);
insert into t4 values (1,'zhangsan',18),(2,'lisi',13),(3,'wangwu',16);


# 收回t4表中的insert权限
REVOKE insert on public.t4 from u1;

# 赋予t4列id和name的insert权限
grant insert (id,name) on public.t4 to u1;
insert into t4 values (4,'liuliu');

#没有给插入的age列赋予权限,失败
insert into t4 values (5,'shibai',19);

image.png
非超级用户不能删除非自己Owner的database,schema,table

用户u1在数据库vito中删除属于用户abc的表t1,这是失败的
image.png

使用u1用户删除表t1,需要更改表t1的owner

ALTER table t1 OWNER TO u1; 

image.png

5.数据库高可靠性、备份恢复

预置条件:创建一个rbr集群

5.1 kill 掉存储节点的主,其被自动拉起。

5.1.1. 元数据下查询存储节点的主:
image.png
根据member_state为source,得知 192.168.0.132 51401 即为主。

5.1.2. 在132机器上ps 查看相关的进程信息:
image.png

5.1.3. 然后kill掉其进程:
image.png

5.1.4. 一分钟左右后,再ps检查其进程:
image.png
发现其被自动拉起。

5.1.5. 连接mysql,检查mysql的主备关系:
image.png

5.1.6. 在 192.168.0.132 51401 主上, show slave hosts;
image.png

在 192.168.0.132 51403 备上, show slave status;
image.png

另一个备机192.168.0.132 51405 上, show slave status;
image.png
主备关系正常。

5.2 连续3次kill 掉存储节点的主,触发其主备切换。

5.2.1. 元数据下查询存储节点的主:
image.png
根据member_state为source,得知 192.168.0.132 51401 即为主。

5.2.2. 在132机器上ps 查看相关的进程信息:
image.png

5.2.3. 然后kill掉其进程:
image.png

5.2.4. 一分钟左右后,再ps检查其进程:
image.png
发现其被自动拉起。

5.2.5. 连续3次重复步骤3,kill掉存储节点的主,触发了存储节点的主备切换

检查clustermgr的日志:
image.png
且在元数据表的rbr_consfailover中看到这样的信息:
image.png

5.3 kill 掉元数据集群的主,其重新选举主,且原主会被自动拉起

5.3.1. 元数据下查询存储节点的主
image.png
根据MEMBER_ROLE为PRIMARY,得知 192.168.0.140 59301 即为主。

5.3.2. 在140机器上ps 查看相关的进程信息:
image.png

5.3.3. 然后kill掉其进程:
image.png

5.3.4. 此时在元数据表中检查元数据集群的信息:
image.png

发现 192.168.0.132 59301成为新的元数据集群的主,且 192.168.0.140 59301不在表中。

检查clustermgr的日志,有如下信息:
image.png

5.3.5. 一分钟左右后,再到192.168.0.140上ps检查其进程
image.png
192.168.0.140 59301被重新拉起

5.3.6. 再次到元数据表中检查元数据集群的信息:
image.png
192.168.0.140 59301加入到元数据集群中,且降为SECONDARY。

5.4 kill 掉计算节点,其被自动拉起。

5.4.1. 元数据下查询计算节点的信息:
image.png
得知 192.168.0.132 51701 即为计算节点。

5.4.2. 在132机器上ps 查看相关的进程信息:
image.png

5.4.3. 然后kill掉其进程:
image.png

5.4.4. 一分钟左右后,再ps检查其进程:
image.png
发现其被自动拉起。

5.4.5. 连接pg,检查数据是否能正常读写:
image.png
pg读写正常。

5.5 kill 掉clustermgr的主,其会进行主备切换。

5.5.1. 元数据下查询clustermgr的主:
image.png
根据member_state为source,得知 192.168.0.140 59011 即为主。

5.5.2. 在140机器上ps查看clustermgr的进程信息:
image.png

5.5.3. 进入~kunlun-cluster-manager-1.0.1/bin下,停掉clustermgr:
image.png

5.5.4. 再到元数据表中检查clustermgr的主备信息:
image.png

5.5.5. 发现clustermgr的主由原来的 192.168.0.140 59011切换到 192.168.0.129 59011上去了。
image.png

5.5.6. 再到 192.168.0.140 59011上启动clustermgr,clustermgr启动成功:
image.png
但是clustermgr的主仍然是 192.168.0.129 59011。

5.6 备份恢复

5.6.1. 创建rbr集群:
image.png

此集群作为源集群;
集群创建成功后,连接计算节点,如:
psql postgres://abc:abc@192.168.0.129:51701/postgres
建立t1111表并写入数据。
image.png

5.6.2. 发起备份操作:(需保证hdfs server已启动)
image.png

hdfs下记录恢复的时间,如:2022-08-23 13:52
image.png

5.6.3. 创建另一个集群:
规格需与步骤1中的集群一致,参考步骤1,作为目标集群。

5.6.4. 发起恢复操作:
image.png

5.6.5. 恢复成功后,链接步骤3中集群的计算节点,如:
psql postgres://abc:abc@192.168.0.129:59701/postgres
t1111表会同步到目标集群中。

点击阅读原文

推荐阅读

KunlunBase架构介绍
KunlunBase技术优势介绍
KunlunBase技术特点介绍
KunlunBase集群基本概念介绍

END

昆仑数据库是一个HTAP NewSQL分布式数据库管理系统,可以满足用户对海量关系数据的存储管理和利用的全方位需求。
应用开发者和DBA的使用昆仑数据库的体验与单机MySQL和单机PostgreSQL几乎完全相同,因为首先昆仑数据库支持PostgreSQL和MySQL双协议,支持标准SQL:2011的 DML 语法和功能以及PostgreSQL和MySQL对标准 SQL的扩展。同时,昆仑数据库集群支持水平弹性扩容,数据自动拆分,分布式事务处理和分布式查询处理,健壮的容错容灾能力,完善直观的监测分析告警能力,集群数据备份和恢复等 常用的DBA 数据管理和操作。所有这些功能无需任何应用系统侧的编码工作,也无需DBA人工介入,不停服不影响业务正常运行。
昆仑数据库具备全面的OLAP 数据分析能力,通过了TPC-H和TPC-DS标准测试集,可以实时分析新的业务数据,帮助用户发掘出数据的价值。昆仑数据库支持公有云和私有云环境的部署,可以与docker,k8s等云基础设施无缝协作,可以轻松搭建云数据库服务。
请访问 http://www.kunlunbase.com/ 获取更多信息并且下载昆仑数据库软件、文档和资料。
KunlunBase项目已开源
【GitHub:】
https://github.com/zettadb
【Gitee:】
https://gitee.com/zettadb


分享好友

分享这个小栈给你的朋友们,一起进步吧。

KunlunDB交流栈
创建时间:2021-12-21 09:43:35
KunlunBase技术Blog & meetup内容分享,以及MySQL+PG等相关技术分享,以方便大家更深层次的了解KunlunBase,欢迎大家提问交流~
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • KunlunBase 昆仑数据库
    栈主

小栈成员

查看更多
  • miemieMIA
  • abin
  • AI中国
戳我,来吐槽~