GaussDB集群的优势分析 一
GaussDB集群的优势分析
随着企业数字化转型的加速,数据库作为信息系统的核心组件,其性能、可靠性和可扩展性直接影响着企业的业务效率和发展。GaussDB是华为推出的一款分布式数据库,以其卓越的性能和高可用性在行业内备受瞩目。尤其是其集群模式,为企业提供了强大的数据处理能力与灵活的扩展性。以下将从多个方面详细探讨GaussDB集群的优势。
1. 高性能的数据处理能力
GaussDB集群采用分布式架构,能够充分利用多节点并行计算的能力来提升数据处理效率。在面对大规模数据分析任务时,GaussDB通过分片技术将数据分散到不同节点上,每个节点独立处理部分数据,并通过高效的通信机制实现结果的汇总和协同运算。这种设计使得GaussDB在复杂查询、事务管理和高并发场景下表现出色。
- 全并行架构:GaussDB支持计算与存储分离,结合多线程并行执行引擎,极大提升了复杂SQL操作的响应速度。
- 混合负载优化:集群模式下的GaussDB可以同时支持在线交易(OLTP)和分析型负载(OLAP),为用户提供一站式解决方案,无需额外部署其他类型的数据库。
2. 高可用性保障业务连续性
对于关键型业务系统而言,任何停机或数据丢失都可能带来严重后果。GaussDB集群通过多层次的高可用设计,确保系统的稳定运行:
- 多副本冗余机制:GaussDB默认使用三副本策略,数据分布在不同的物理节点上,即使某个节点发生故障,其他副本仍然可以继续提供服务。
- 智能故障切换:集群内的主节点和备节点之间会实时同步数据。当主节点出现故障时,系统能够在毫秒级内自动完成故障转移,保证业务不中断。
- 数据一致性保护:基于Paxos协议的分布式共识算法,GaussDB确保所有节点间的元数据强一致性,从根本上避免了因网络分区导致的数据冲突问题。
3. 弹性扩展满足多样化需求
在实际应用中,企业对数据库的需求会随着业务规模的变化而增长。传统单体数据库往往面临扩容困难的问题,而GaussDB集群则具备天然的弹性扩展能力:
- 横向扩展:用户可以通过增加新的计算节点或存储节点轻松扩展整个集群的容量和性能,无需修改现有应用程序。
- 平滑升级:GaussDB支持在线扩容和缩容操作,且扩容过程中不影响业务正常运行。这一特性特别适合对灵活性要求较高的互联网行业。
- 动态资源调配:根据实际负载情况,GaussDB能够智能调整各节点上的资源分配,最大限度地提高硬件利用率。
1. 数据库对象管理及SQL应用
当前有两张表分别是学生表和班级表,请基于两张表完成以下实验要求。
--创建表
create table student(sno int,sname varchar(50),score int,cno int);
create table classes(cno int,cname varchar(50));
--导入数据
insert into student values(123,'a',456,1);
insert into student values(124,'b',546,1);
insert into student values(125,'c',548,1);
insert into student values(126,'d',569,1);
insert into student values(127,'e',540,1);
insert into student values(128,'f',536,2);
insert into student values(129,'g',512,2);
insert into student values(130,'h',546,2);
insert into student values(131,'i',508,2);
insert into student values(132,'j',456,2);
insert into classes values(1,'1 班');
insert into classes values(2,'2 班');
1、 查询学号为130的学生名字、总成绩以及所在班级
select sname,score,c.cname from student s ,classes c where s.cno=c.cno and sno=130;
select s.sname,s.score, c.cname from student s join classes c on s.cno = c.cno where s.sno = 130;
select s.sname, s.score, c.cname from student s join classes c on s.cno = c.cno where sno = 130;
2、 查看每个班级(cno)月考总分(score)前三名,其中要求分设相同的人具有相同的编号
select * from (select *,dense_rank() over (partition by cno order by score desc) as ranking from student) where ranking <=3;
select * from (select cno, dense_rank() over (partition by cno order by score desc) as ranking from student)
where ranking <=3;
2. 常用系统表查询
1、 表创建
请按要求创建p_table(a int,b int,c int,d int)表,指定以b字段作为分区键,按10以下、10-20,20-30,30-40分,以a字段作为分布键的列存表。
create table p_table(a int,b int,c int,d int) with(ORIENTATION = column) distribute by hash(a)
partition by range(b)(
partition p1 values less than(10),
partition p2 values less than(20),
partition p3 values less than(30),
partition p4 values less than(40));
2、 查询表的模式名和表名
--第一种解法:基于系统表pg_class、pg_namespace查询
select c.relname,n.nspname from pg_class c join pg_namespace n on c.relnamespace=n.oid where c.relname='p_table';
--第二种解法:基于系统视图pg_tables查询
select tablename,schemaname from pg_tables where tablename='p_table';
3、 查询表的所在节点nodeoids信息
--schema过滤是为了避免不同schema下表同名的问题,指定查询本题的表
select t1.relname,t2.nodeoids from pg_class t1,pgxc_class t2,pg_namespace t3 where t1.oid=t2.pcrelid and t1.relnamespace=t3.oid and t1.relname = 'p_table' and t3.nspname='root';
--pg_class pgxc_class
select nodeoids from pg_class c join pgxc_class pc on c.oid=pc.pcrelid where c.relname='p_table';
4、 查询表所在的节点实例信息
select t4.* from pg_class t1,pgxc_class t2,pg_namespace t3,pgxc_node t4 where t1.oid=t2.pcrelid and t1.relnamespace=t3.oid and cast(t2.nodeoids as varchar(20))=cast(t4.oid as varchar(20)) and t1.relname='p_table' and t3.nspname='root';
select * from pgxc_node where oid in (16673,16678,16680);
3. 用户及权限管理
当前有一张表sjh_test(a int,b int),和角色sjh112,请给予当前环境完成以下用户及权限相关管理操作。
--创建表
create table sjh_test(a int,b int);
--创建角色
create role sjh112 password 'Huawei@123';
1、 创建用户sjh111
create user sjh111 password 'Huawei@123';
2、 将表sjh_test表的读取,删除权限授权给sjh111用户
--普通用户只有public模式的权限,需要将当前schema使用权赋予给用
grant usage on schema root to sjh111;
--赋权
grant select,delete on sjh_test to sjh111;
3、 为用户sjh111授权在sjh_test表的a、b列上的查询、添加和更新权限
grant select(a,b),insert(a,b),update(a,b) on sjh_test to sjh_111;
grant select,update,insert on sjh_test(a, b) to sjh111; error
4、 将用户sjh111授权在sjh_test表的a列上的查询、添加和更新权限收回
revoke select(a),insert(a),update(a) on sjh_test from sjh111;
5、 创建角色sjh_audit,此角色拥有审计权限
create user sjh_audit with aduditadmin password 'Huawei@123';
6、 将sjh112角色权限授予给用户sjh111
grant sjh112 to sjh111;
7、 创建新用户sjh113,设置使用有效期”2023-01-28”至”2026-01-01”
create user sjh113 password 'Huawei@123' valid begin '2023-01-28' valid until '2026-01-01';
4. 行级访问控制
当前有all_data表,字段如下,请给予此表实现行级访问控制
--创建表
create table all_data(role varchar(50),name varchar(50),age int);
--导入数据
insert into all_data values('root','zhangsan',18),('sjh111','lisi',43),('sjh113','wangwu',35);
1、 打开all_data表的行访问控制策略开关
alter table all_data enable row level security;
2、 创建行级访问控制策略,当前用户只能查看用户自身的数据
create row level security policy all_data_rls on all_data using(role = current_user);
create row level security police pls on all_data(using )
3、 删除策略
drop row level security policy all_data_rls on all_data;
4、 关闭行级访问策略
alter table all_data disable row level security;
5. 触发器
1、 创建视图SELECT_SD,查看学生成绩信息,查看学生姓名,课程名称,课程成绩。
create view SELECT_SD as select sname,cname,grade from student s,course c,elective e where e.sno=s.sno and e.cno=c.cno;
2、 编写函数FUNC_SUM,返回某个学生的分数总和。
create or replace function FUNC_SUN(stuid int) returns integer as
$$
declare result integer;
begin
select sum(grafe) into result from elective where sno=stuid;
return result;
end;
$$ language plpgsql;
create or replace function f1(in int) as
$$
declare
i int;
begin
return i
end;
$$ pgplsql
少了 returns interge
3、 创建触发器DELETE_ELE,在STUDENT表上绑定触发器DELETE_ELE,在删除表中某个学生时,将ELECTIVE表中该学生的选课记录一并删除。
--删除elective表记录的函数
create or replace function func_delete_ele() returns trigger as
$$
begin
delete from elective where sno=old.sno;
return old;
end;
$$ language plpgsql;
--绑定到student表的触发器
create trigger delete_ele before delete on student for each row execute procedure func_delete_ele();
6. 游标
以下为表创建SQL语句(此题无数据)
create table TEACHER(
ID INTEGER NOT NULL,
NAME VARCHAR(50) NOT NULL,
DEPTNO INTEGER NOT NULL,
SALARY FLOAT NOT NULL,
TITLE VARCHAR(100) NOT NULL --职称:讲师、副教授、教授);
create table DEPARTMENT(
ID INTEGER NOT NULL,
NAME VARCHAR(50) NOT NULL);
1、 创建存储过程pro_curs_1,使用游标打印各部门总人数,按人数降序排序,打印格式如下:
部门名称 1---人数
部门名称 2---人数
打印操作可以使用DBE_OUTPUT.PRINT_LINE(outputstr)接口
create or replace procedure pro_curs_1()
as
declare cursor cur1 is select d.name as dname,count(*) as perscount from teacher t,department where t.deptno=d.id group by d.name order by perscount desc;
dname varchar(50);
perscount integer;
begin
open cur1;
loop
fetch next from cur1 into dname,perscount;
DBE_OUTPUT.PRINT_LINE(concat(dname,'---',cast(perscount as varchar(10))));
if cur1 % notfound then exit;
close cur1;
end if;
end loop;
END;
call pro_curs_1();
-- 创建 DEPARTMENT 表
CREATE TABLE DEPARTMENT (
ID INTEGER NOT NULL,
NAME VARCHAR(50) NOT NULL,
PRIMARY KEY (ID) -- 假设每个部门的 ID 是唯一的
);
-- 创建 TEACHER 表
CREATE TABLE TEACHER2 (
ID INTEGER NOT NULL,
NAME VARCHAR(50) NOT NULL,
DEPTNO INTEGER NOT NULL,
SALARY FLOAT NOT NULL,
TITLE VARCHAR(100) NOT NULL, -- 职称:讲师、副教授、教授
PRIMARY KEY (ID), -- 假设每个教师的 ID 是唯一的
FOREIGN KEY (DEPTNO) REFERENCES DEPARTMENT(ID) -- 外键约束,DEPTNO 引用 DEPARTMENT 表的 ID
);
INSERT INTO DEPARTMENT (ID, NAME) VALUES
(1, '计算机科学系'),
(2, '数学系');
INSERT INTO TEACHER2 (ID, NAME, DEPTNO, SALARY, TITLE) VALUES
(1, '张三', 1, 8000, '讲师'),
(2, '李四', 1, 12000, '副教授'),
(3, '王五', 2, 15000, '教授');
创建存储过程pro_curs_1,使用游标打印各部门总人数,按人数降序排序,打印格式如下:
部门名称 1---人数
部门名称 2---人数
打印操作可以使用DBE_OUTPUT.PRINT_LINE(outputstr)接口
select d.name, count(*) from teacher2 t, DEPARTMENT d where d.id = t.DEPTNO group by d.name order by 2 desc;
select * from pg_database;
create or replace procedure teacherd as
$$
declare
depname varchar;
pcnt int;
cursor c1 as select d.name, count(*) from teacher2 t, DEPARTMENT d where d.id = t.DEPTNO group by d.name order by 2 desc;
begin
open c1;
loop
exit when c1%notfound;
fetch c1 into depname, pcnt;
DBE_OUTPUT.PRINT_LINE(depname, pcnt);
end loop;
end;
$$ pgplsql;
CREATE OR REPLACE PROCEDURE teacherd()
LANGUAGE plpgsql
AS $$
DECLARE
depname VARCHAR;
pcnt INT;
-- 定义游标
CURSOR c1 IS
SELECT d.name, COUNT(*)
FROM teacher2 t
JOIN DEPARTMENT d ON d.id = t.DEPTNO
GROUP BY d.name
ORDER BY 2 DESC;
BEGIN
-- 打开游标
OPEN c1;
-- 循环遍历游标
LOOP
-- 获取游标中的数据
FETCH c1 INTO depname, pcnt;
-- 判断是否还有数据
EXIT WHEN NOT FOUND;
-- 输出结果
RAISE NOTICE 'Department: %, Teacher Count: %', depname, pcnt;
END LOOP;
-- 关闭游标
CLOSE c1;
END;
$$;
call teacherd();
2、 创建存储过程pro_curs_2,使用游标读取薪水降序排序的前三位老师和后三位老师的信息,分别获取ID,姓名,部门名称,薪水和职称,请按以下格式打印。
ID-姓名-部门名称-薪水-职称
create or replace procedure pro_curs_2()
as
declare cursor cur2 is select t.id as sid,t.name as sname, d.name as dname,salary,title from ((select * from teacher order by salary desc limit 3) union all (select * from teacher order by salary limit 3)) t join department d on t.deptno=d.id;
sid integer;
sname varchar(50);
dname varchar(50);
salary float;
title varchar(50);
begin
open cur2;
loop
fetch next from cur2 into sid,sname,dname,salary,title;
DBE_OUTPUT.PRINT_LINE(concat(cast(sid as varchar(20),'-',sname,'-',dname,'-',cast(salary as varchar(20)),'-',title)));
if cur2 % notfound then exit;
close cur2;
end if;
end loop;
END;
7. 数据库优化
通常的SQL优化会通过参数调优的方式进行调整,例如如下参数
set enable_fast_query_shipping = off;
set enable_stream_operator = on;
请根据以下表完成数据库优化
--建表
create table tb_user(stu_no int,stu_name varchar(32),age int,hobby_type int) distribute hash(age);
--插入数据
insert into tb_user select id,'xiaoming'||(random()*60+10)::int,
(random()*60+10)::int,
(random()*5+1)::int
from (select generate_series(1,100000)id)tb_user;
1、 收集tb_user的统计信息
analyze tb_user;
2、 为下面两个查询语句创建索引,让执行计划和索引最合理
SQL1:explain analyze select * from tb_user where age=29 and stu_name='xiaoming';
SQL2:explain analyze select * from tb_user where stu_no=100 and age=29;
--SQL1
select gs_index_advise('select * from tb_user where age=29 and stu_name='’xiaoming'’');
create index age_name on tb_user(stu_name,age);
--SQL2
select gs_index_advise('select * from tb_user where stu_no=100 and age=29');
create index age_no on tb_user(stu_no,age);
3、 在上题操作的基础上,用3种不同方式使如下SQL不走索引
explain analyze select * from tb_user where stu_no=100 and age=29;
--1.通过hint干预优化不走索引
explain analyze select /*+tablescn(tb_user) */ * from tb_user where stu_no=100 and age=29;
--2.调大index开销
set cpu_index_tuple_cost = 100000;
--3.直接禁用索引
alter index age_no,age_name unusable;
--4.禁止优化器使用indexscan:
set enable_indexscan=off
8. 论述
1、 权限管理模型RBAC和ABAC区别
RBAC:基于角色的访问控制,角色通常是指具有某些共同特征的一组人,例如:部门、地点、资历、级别、工作职责等。在系统初始时Admin根据业务需要创建多个拥有不同权限组合的不同角色,当需要赋予某个用户权限的时候,把用户归到相应角色里即可赋予符合需要的权限。
不同于常见的将用户通过某种方式关联到权限的方式,ABAC则是通过动态计算一个或一组属性来是否满足某种条件来进行授权判断(可以编写简单的逻辑)。属性通常来说分为四类:用户属性(如用户年龄),环境属性(如当期时间),操作属性(如读取)和对象属性(如一篇文章,又称资源属性),所以理论上能实现非常灵活的权限控制,几乎能满足所有类型的需求。权限判断需要实时执行,规则过多会导致性能问题
两者区别:RBAC和ABAC之间的主要区别在于RBAC基于用户角色提供对资源或信息的访问,而ABAC提供基于用户、环境或资源属性的访问权限
2、 数据库数据加密方式有哪些,至少3种
函数加密:字段级,通过调用函数,如md5()等函数对传入参数进行加密,业务感知加密,不支持密文条件安全,数据在会话中临时解密,数据库无法自动解密,防止高权限账户窃取数;
透明加密:表级,数据在文件落盘时加密,对用户及上层使用SQL的应用不感知,对于需要加密的表创建时通过TDE参数指定加密算法,数据库无感知,内存明文处理,防止基于物理磁盘的数据窃取,TDE秘钥管理分为三层,分别是根秘钥,主秘钥,数据加密秘钥。
全密态:字段级,支持密态等值查询,数据库无法解密,防止运维、管理、高权限账户窃取隐私数据,在业务中仅在DDL层做了扩展,在create table或者alter table新增列时可以将列设置为加密列,给需要的列绑定列加密密钥即可,如果DML操作于其他表一致,但需要以密态方式(-C)创建客户端连接才可以,如果是非密态模式,那么查看到的数据是密文,未指定加密的列数据均已明文处理,密钥管理分为三层,分别根密钥,主密钥,列加密密钥,密钥均存储于GaussDB client,减少攻击面;
总结来说,函数加密,是用客户把密钥给到数据库,数据库在执行函数时做一个加密动作,是在数据库里加密。透明加密是在数据库自己找一个密钥,在磁盘落盘时做加密。全密态等值是客户找到密钥之后先把数据加密,再交给数据库,全生命周期都是密文的。
客户端和服务端SSL通信加密,SSL加密支持对称加密、非对称加密,对称加密算法指的是加密和解密使用相同的秘钥,特点是算法公开,加解密速度快、效率高;非对称加密算法包含两个秘钥:公钥和私钥,公钥和私钥是一对,加密和解密使用不同的秘钥,特点是算法复杂度高、安全性更强、性能较对称加密差。
常见算法为AES、DES、MD5、SM4
4. 全面的安全防护
数据安全是现代信息系统建设的重要环节,尤其是在金融、电信等行业,法律法规对企业提出了严格的要求。GaussDB集群提供了多层次的安全机制,帮助企业构建一个可信的运行环境:
- 数据加密:无论是存储中的静态数据还是传输中的动态数据,GaussDB均支持端到端的加密功能,防止敏感信息泄露。
- 访问控制:基于角色的权限管理体系(RBAC)确保只有授权用户才能访问相应的资源,同时支持细粒度的操作审计。
- 备份与恢复:通过定期的增量备份与冷热分离策略,GaussDB可以在灾难发生时快速恢复数据,最大限度降低业务损失。
5. 开放生态与兼容性
为了更好地融入企业现有的IT架构,GaussDB集群注重开放标准和技术兼容性:
- 跨平台支持:GaussDB支持多种操作系统(如Linux、Windows等)和主流虚拟化环境,便于企业在不同基础设施上部署。
- 丰富的接口:除了原生的SQL语言外,还提供了JDBC、ODBC等多种驱动程序,方便开发者与其进行集成开发。
- 开源社区合作:作为一款开放数据库产品,GaussDB积极参与开源生态建设,不断吸收外部创新成果以提升自身能力。
6. 成本优化助力企业可持续发展
相较于一些专有云数据库或商业闭源数据库产品,GaussDB在性价比方面具有显著优势:
- 本地化部署选项:企业可以选择将GaussDB部署在自有服务器上,从而减少长期订阅公有云服务所带来的费用开支。
- 按需计费模式:针对云环境中的使用场景,GaussDB提供灵活的付费方案,仅需支付当前所使用的资源量,有效降低总体拥有成本(TCO)。
- 简化运维工作:集群自动化管理工具大幅减少了人工维护的工作量,进一步帮助团队聚焦于核心业务创新。
总结
综上所述,GaussDB集群凭借其高性能、高可用性、弹性扩展、安全性、开放性以及经济性等多方面的综合优势,已经成为众多大型企业和机构的理想选择。无论是在电商订单处理、银行核心账务系统,还是物联网设备监控等领域,GaussDB都能够为企业提供稳定高效的数据支撑。未来,随着人工智能、大数据等技术的不断发展,GaussDB有望继续引领数据库领域的创新方向,为数字化时代注入更多活力。
- 点赞
- 收藏
- 关注作者
评论(0)