乐趣区

关于mysql:KunlunBase-功能体验范例

1. 数据库的容量测试

  • 相干性能测试举荐应用 sysbench,详情可参考:https://github.com/akopytov/s…

    • 相干的 sysbench 选项能够参考:https://github.com/akopytov/s…
  • 容量测试能够在装置 sysbench 后应用以下命令进行
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 脚本

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);

u1 是没有登录的权限, 不可能进行登录数据库

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

ALTER ROLE u1 WITH LOGIN;

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://[email protected]:8888/postgres

\c
SELECT session_user, current_user;
create database d1;

应用超级用户受权 u2 能够在数据库中创立 schema

alter user u2 createdb;

受权后切换到 u2 账户下再次进行创立

create database d1;

创立 schema

用户 u2 进入到不属于本人的数据库 进行创立 schema, 会失败
先用超级用户创立个数据库 d2, 用户 u2 在 d2 数据库中进行创立 schema(s1);

应用超级用户受权用户 u2 能够在数据库 d2 中创立 schema(s1);

grant create on database d2 to u2;

受权之后再次进行创立 s1;

单表 / 所有表受权

应用 u1 账户进行登录 psql postgres://[email protected]:8888/vito
因为没有表的权限, 进行的增删改查都会失败

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

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

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

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

列受权

应用超级用户创立 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);

非超级用户不能删除非本人 Owner 的 database,schema,table

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

应用 u1 用户删除表 t1, 须要更改表 t1 的 owner

ALTER table t1 OWNER TO u1; 

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

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

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

5.1.1. 元数据下查问存储节点的主:

依据 member_state 为 source,得悉 192.168.0.132 51401 即为主。

5.1.2. 在 132 机器上 ps 查看相干的过程信息:

5.1.3. 而后 kill 掉其过程:

5.1.4. 一分钟左右后,再 ps 查看其过程:

发现其被主动拉起。

5.1.5. 连贯 mysql,查看 mysql 的主备关系:

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

在 192.168.0.132 51403 备上,show slave status;

另一个备机 192.168.0.132 51405 上,show slave status;

主备关系失常。

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

5.2.1. 元数据下查问存储节点的主:

依据 member_state 为 source,得悉 192.168.0.132 51401 即为主。

5.2.2. 在 132 机器上 ps 查看相干的过程信息:

5.2.3. 而后 kill 掉其过程:

5.2.4. 一分钟左右后,再 ps 查看其过程:

发现其被主动拉起。

5.2.5. 间断 3 次反复步骤 3,kill 掉存储节点的主,触发了存储节点的主备切换

查看 clustermgr 的日志:

且在元数据表的 rbr_consfailover 中看到这样的信息:

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

5.3.1. 元数据下查问存储节点的主

依据 MEMBER_ROLE 为 PRIMARY,得悉 192.168.0.140 59301 即为主。

5.3.2. 在 140 机器上 ps 查看相干的过程信息:

5.3.3. 而后 kill 掉其过程:

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

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

查看 clustermgr 的日志,有如下信息:

5.3.5. 一分钟左右后,再到 192.168.0.140 上 ps 查看其过程

192.168.0.140 59301 被从新拉起

5.3.6. 再次到元数据表中查看元数据集群的信息:

192.168.0.140 59301 退出到元数据集群中,且降为 SECONDARY。

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

5.4.1. 元数据下查问计算节点的信息:

得悉 192.168.0.132 51701 即为计算节点。

5.4.2. 在 132 机器上 ps 查看相干的过程信息:

5.4.3. 而后 kill 掉其过程:

5.4.4. 一分钟左右后,再 ps 查看其过程:

发现其被主动拉起。

5.4.5. 连贯 pg,检查数据是否能失常读写:

pg 读写失常。

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

5.5.1. 元数据下查问 clustermgr 的主:

依据 member_state 为 source,得悉 192.168.0.140 59011 即为主。

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

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

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

5.5.5. 发现 clustermgr 的主由原来的 192.168.0.140 59011 切换到 192.168.0.129 59011 下来了。

5.5.6. 再到 192.168.0.140 59011 上启动 clustermgr,clustermgr 启动胜利:

然而 clustermgr 的主依然是 192.168.0.129 59011。

5.6 备份复原

5.6.1. 创立 rbr 集群:

此集群作为源集群;
集群创立胜利后,连贯计算节点,如:
psql postgres://abc:[email protected]:51701/postgres
建设 t1111 表并写入数据。

5.6.2. 发动备份操作:(需保障 hdfs server 已启动)

hdfs 下记录复原的工夫,如:2022-08-23 13:52

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

5.6.4. 发动复原操作:

5.6.5. 复原胜利后,链接步骤 3 中集群的计算节点,如:
psql postgres://abc:[email protected]:59701/postgres
t1111 表会同步到指标集群中。

点击浏览原文

 举荐浏览

KunlunBase 架构介绍
KunlunBase 技术劣势介绍
KunlunBase 技术特点介绍
PostgreSQL vs MySQL TPC-H 测试
Kunlun-Storage vs PostgreSQL OLTP 测试

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

退出移动版