gbase 8c
为解决传统的集中式数据库对高并发、高吞吐量的需求支持能力不足,满足金融核心系统对数据库的性能、稳定性和安全性的严苛要求,南大通用集十多年分布式开发经验积累,于2022年全新发布了一款适合oltp领域应用的多模多态的分布式数据库gbase 8c。
gbase 8c是基于opengauss 3.0.0构建的一款多模多态的分布式数据库,支持行存、列存、内存等多种存储模式和单机、主备与分布式等多种部署形态。gbase 8c具备高性能、高可用、弹性伸缩、高安全性等特性,支持强一致性的分布式事务,支持主流的rc和rr的事务隔离级别。可以部署在物理机、虚拟机、容器、私有云和公有云,为关键行业核心系统、互联网业务系统和政企业务系统提供安全、稳定、可靠的数据存储和管理服务。
gbase 8c 扩展插件列表
在 cn 节点连接 gbase 8c 数据库,可以查看到 gbase 8c 共提供了 25 个可用插件,并且默认已安装 10 个。
下面将逐一分析这10个预装扩展。
[gbase@gbase8c_1 ~]$ gsql
gsql ((multiple_nodes gbase8cv5 3.0.0b76 build 47948f99) compiled at 2023-02-27 16:04:20 commit 0 last mr 1232 )
non-ssl connection (ssl connection is recommended when requiring high-security)
type "help" for help.
gbase=# \dx
list of installed extensions
name | version | schema | description
----------------- --------- ------------ -----------------------------------------------------------------------------------------------
dist_fdw | 1.0 | pg_catalog | foreign-data wrapper for distfs access
file_fdw | 1.0 | pg_catalog | foreign-data wrapper for flat file access
gsredistribute | 1.0 | pg_catalog | function for table redistribution
hdfs_fdw | 1.0 | pg_catalog | foreign-data wrapper for flat file access
hstore | 1.1 | pg_catalog | data type for storing sets of (key, value) pairs
log_fdw | 1.0 | pg_catalog | foreign data wrapper for accessing logging data
mot_fdw | 1.0 | pg_catalog | foreign-data wrapper for mot access
orafce | 3.17 | public | functions and operators that emulate a subset of functions and packages from the oracle rdbms
plpgsql | 1.0 | pg_catalog | pl/pgsql procedural language
security_plugin | 1.0 | pg_catalog | provides security functionality
(10 rows)
gbase=# select * from pg_available_extensions where installed_version is null;
name | default_version | installed_version | comment
-------------------- ----------------- ------------------- -------------------------------------------------------------------
postgres_fdw | 1.0 | | foreign-data wrapper for remote postgresql servers
pgcrypto | 1.0 | | cryptographic functions
postgis | 3.2.1 | | postgis geometry and geography spatial types and functions
postgis_raster | 3.2.1 | | postgis raster types and functions
postgis_sfcgal | 3.2.1 | | postgis sfcgal functions
yukon_geogridcoder | 1.0.1 | | yukon geogridcoder extension
yukon_geomodel | 1.0.1 | | yukon geomodel extension
fuzzystrmatch | 1.0 | | determine similarities and distance between strings
dblink | 1.0 | | connect to other postgresql databases from within a database
pg_trgm | 1.0 | | text similarity measurement and index searching based on trigrams
mapgis3d_pg | 1.1 | | support mapgis3d type.
mysql_fdw | 1.1 | | foreign data wrapper for querying a mysql server
oracle_fdw | 1.1 | | foreign data wrapper for oracle access
zhparser | 2.2 | | a parser for full-text search of chinese
uuid-ossp | 1.1 | | generate universally unique identifiers (uuids)
(15 rows)
1. dist_fdw
从dist_fdw的命名不难看出是一个 fdw (foreign data wrapper),外部数据包装器。
安装dist fdw之后,会提供两个内置方法。
gbase=# \df dist_fdw_*
list of functions
schema | name | result data type | argument data types | type | fencedmode | propackage | prokind
------------ -------------------- ------------------ --------------------- -------- ------------ ------------ ---------
pg_catalog | dist_fdw_handler | fdw_handler | | normal | f | f | f
pg_catalog | dist_fdw_validator | void | text[], oid | normal | f | f | f
(2 rows)
通过元命令 \des 可以查看当前已经创建的 fwd server。
gbase=# \des
list of foreign servers
name | owner | foreign-data wrapper | access privileges | type | version | fdw options | description
------------------------ ------- ---------------------- ------------------- ------ --------- ------------- -------------
gsmpp_errorinfo_server | gbase | file_fdw | | | | |
gsmpp_server | gbase | dist_fdw | | | | |
log_srv | gbase | log_fdw | | | | |
mot_server | gbase | mot_fdw | | | | |
(4 rows)
gbase=# select oid, * from pg_catalog.pg_foreign_server;
oid | srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions
------- ------------------------ ---------- -------- --------- ------------ -------- ------------
14851 | gsmpp_server | 10 | 14850 | | | |
14856 | gsmpp_errorinfo_server | 10 | 14855 | | | |
14888 | log_srv | 10 | 14887 | | | |
14930 | mot_server | 10 | 14929 | | | |
(4 rows)
gbase=# select oid, * from pg_catalog.pg_foreign_data_wrapper;
oid | fdwname | fdwowner | fdwhandler | fdwvalidator | fdwacl | fdwoptions
------- ---------- ---------- ------------ -------------- -------- ------------
14850 | dist_fdw | 10 | 14848 | 14849 | |
14855 | file_fdw | 10 | 14853 | 14854 | |
14860 | hdfs_fdw | 10 | 14858 | 14859 | |
14861 | dfs_fdw | 10 | 14858 | 14859 | |
14887 | log_fdw | 10 | 14885 | 14886 | |
14929 | mot_fdw | 10 | 14927 | 14928 | |
(6 rows)
dist fdw 运行与 gauss 内核中,在db初始化后会自动安装,并创建了一个名为gsmpp_server的服务,可用于创建位于分布式存储的外部表。
例如:
create table torg();
create foreign table tmpp( like torg) server gsmpp_server options (location 'gsfs://127.0.0.1:8781/xxx.txt', format 'text');
这里的外部存储也可以是obs(object storage service)。
对象存储服务,是一个基于对象的存储服务,为客户提供海量、安全、高可靠、低成本的数据存储能力。
2. file_fdw
在 gbase 8c 中,只是预装了 file_fdw,并且预设了 gsmpp_errorinfo_server ,但并没有调用者。
file_fdw 是从 postgresql 移植过来的插件,是 postgresql 在 9.1 版本发布的一款 fdw,
它能被用来访问服务器的文件系统中的数据文件,或者服务器上执行程序并读取它们的输出。 数据文件或程序输出必须是能够被copy from读取的格式。
比如可以读取服务器上的日志文件。
create extension file_fdw;
create server pglog foreign data wrapper file_fdw;
create foreign table pglog (
log_time timestamp(3) with time zone,
user_name text,
database_name text,
process_id integer,
connection_from text,
session_id text,
session_line_num bigint,
command_tag text,
session_start_time timestamp with time zone,
virtual_transaction_id text,
transaction_id bigint,
error_severity text,
sql_state_code text,
message text,
detail text,
hint text,
internal_query text,
internal_query_pos integer,
context text,
query text,
query_pos integer,
location text,
application_name text,
backend_type text,
leader_pid integer,
query_id bigint
) server pglog
options ( filename 'log/postgresql-2023-03-29.csv', format 'csv' );
select * from pglog;
3. gsredistribute
gbase 8c 是分布式数据库,支持 cn, dn 节点。 当启用多节点模式时,需要加载扩展: gsredistribute
与该扩展相关的命令有: gs_redis ,该命令用于扩展节点时数据重分布。
[gbase@gbase8c_1 ~]$ ~/gbase_db/app/bin/gs_redis --help
gs_redis execute data redistribute on cluster expansion.
usage:
gs_redis [option]... options:
-v, --build-redistb build pgxc_redistb entries for tables that needing redistirbution.
-r, --build-redistb-start build pgxc_redistb table if not exist and start re-distribution.
-t, --timeout=secs set wait timeout for lock table.(default 60s)
-j, --jobs=num use this many parallel jobs to redistribute. num tables of one database can be redistributed
at the same time. parallel is not used by default.
-c, --vacuum does vacuum full after data redistribution (default no); if -f specified, -c is ignored.
-f, --fast-redis fast data redistribution; need extra storage during data redistribution (default no).
-m, --mode=mode run data redistribution in mode: read-only or insert (default read-only).
read-only mode is used for offline redistribution, insert mode is used for online redistribution.
select * from pgxc_class;
以下函数为重分布期间gs_redis工具所用的系统函数,用户不要主动调用:
pg_get_redis_rel_end_ctid(text, name, int, int)
pg_get_redis_rel_start_ctid(text, name, int, int)
pg_enable_redis_proc_cancelable()
pg_disable_redis_proc_cancelable()
pg_tupleid_get_blocknum(tid)
pg_tupleid_get_offset(tid)
pg_tupleid_get_ctid_to_bigint (ctid)
以下函数均针对时序表,所指oid均只针对时序表:
redis_ts_table(oid)
4. hdfs_fdw
hdfs_fdw 是 edb 开源的一款扩展插件,支持 postgresql 11 ~ 15.
hdfs fdw 用于创建外部服务器,存储hdfs集群信息、obs服务器信息或其他同构集群信息,可连接 apache hadoop, hive, spark。
--创建hdfs_server
create server hdfs_server foreign data wrapper hdfs_fdw options
(address '10.10.0.100:25000,10.10.0.101:25000',
hdfscfgpath '/opt/hadoop_client/hdfs/hadoop/etc/hadoop',
type 'hdfs'
) ;
在 gbase 8c 中,分区表进程也会用到 hdfs_fdw 。
gbase=# select fdwname from pg_foreign_data_wrapper where fdwname = 'hdfs_fdw';
fdwname
----------
hdfs_fdw
(1 row)
postgres=# select * from pg_foreign_data_wrapper;
fdwname | fdwowner | fdwhandler | fdwvalidator | fdwacl | fdwoptions
---------- ---------- ------------ -------------- -------- ------------
dist_fdw | 10 | 14848 | 14849 | |
file_fdw | 10 | 14853 | 14854 | |
hdfs_fdw | 10 | 14858 | 14859 | |
dfs_fdw | 10 | 14858 | 14859 | |
log_fdw | 10 | 14885 | 14886 | |
mot_fdw | 10 | 14927 | 14928 | |
(6 rows)
5. hstore
hstore 是 postgresql 8.2 引入的扩展,该模块实现了 hstore 数据类型,
用于在单个postgresql值中存储键/值对集。
这在各种场景中都很有用,比如具有许多很少检查的属性的行,或者半结构化数据。
当前数据库中具有create权限的普通用户即可创建该模块。
-- 为记录或行构建hstore类型
gbase=# select 'a=>1,a=>2'::hstore;
hstore
----------
"a"=>"1"
(1 row)
-- hstore(record)返回hstore类型
gbase=# select hstore(row(1,2));
hstore
----------------------
"f1"=>"1", "f2"=>"2"
(1 row)
-- hstore(text[])返回hstore类型, 为键值数组或二维数组构建hstore类型
gbase=# select hstore(array['a','1','b','2']);
hstore
--------------------
"a"=>"1", "b"=>"2"
(1 row)
-- 将记录转为hstore类型
gbase=# create table test(col1 integer,col2 text,col3 text);
create table
postgres=# insert into test values(123,'foo','bar');
insert 0 1
postgres=# select hstore(t) from test as t;
hstore
---------------------------------------------
"col1"=>"123", "col2"=>"foo", "col3"=>"bar"
(1 row)
6. log_fdw
查阅资料发现目前有两个版本的 log fdw。
一个是 aws 开源的版本,用于 aws rds,可更加便利的读取数据库日志,从db中通过外部表的方式直接用sql查询日志文件内容。
另一个是 opengauss 中的 log fdw, 可以查询集群日志,如下图,可以在 8c 中查询 数据节点的日志信息。
7. mot_fdw
mot fdw 用于创建 mot 表。
mot, memory optimized table, 内存优化表存储引擎,表示表的数据将以内存的形式存储。
mot 内存适用于高吞吐事务处理,性能瓶颈加速,消除中间层缓存,大规模流数据提取。
启用 mot 表,需要在安装节点 执行 gs_guc 命令 修改数据库参数。
gs_guc reload -z coordinator -n all -i all -c "enable_incremental_checkpoint=off"
gs_guc reload -z datanode -n all -i all -c "enable_incremental_checkpoint=off"
gs_guc reload -z gtm -n all -i all -c "enable_incremental_checkpoint=off"
gs_guc reload -z coordinator -n all -i all -c "enable_gbase_mot=on"
gs_guc reload -z datanode -n all -i all -c "enable_gbase_mot=on"
gs_guc reload -z gtm -n all -i all -c "enable_gbase_mot=on"
在创建mot表时,[server mot_server]部分是可选的,因为mot是一个集成的引擎,而不是一个独立的服务器。
create foreign table test_astore_mot(col int) server mot_server ;
但是,mot通过 mot_fdw 与 gbase 8c 集成,需要授权用户权限。
grant usage on foreign server mot_server to 'user';
8. orafce
orafce 是 postgresql 中“知名”扩展,已支持 postgresql 15。
"orafce"项目在postgres中实现了oracle数据库中缺失的一些函数(或行为不同)。
这个模块包含了一些实用的函数,oracle pl/sql 子程序的子集和安装包可,以帮助将oracle应用程序移植到 postgresql 或 gbase 8c。
内置的oracle日期函数已经在oracle 10上进行了一致性测试。 从1960年到2070年的日期可以正常工作。 由于oracle中的一个错误,无法验证1100-03-01之前的日期。
安装插件:
create extension orafce;
现在orafce已经包含了如下内容:
- 类型 date, varchar2 and nvarchar2
- 函数 concat, nvl, nvl2, lnnvl, decode, bitand, nanvl, sinh, cosh, tanh and oracle.substr
- dual 表
- package: dbms_alert, dbms_pipe, utl_file, dbms_output, dbms_random, date, operations, dual
使用 orafce 前:
# select null || 'hello'::varchar2 || null;
error: type "varchar2" does not exist
line 1: select null || 'hello'::varchar2 || null;
^
使用 orafce 后:
$ set search_path to oracle,"$user", public, pg_catalog;
set
$ select null || 'hello'::varchar2 || null;
----------
| ?column? |
----------
| [null] |
----------
(1 row)
$ set orafce.varchar2_null_safe_concat to true;
set
$ select null || 'hello'::varchar2 || null;
----------
| ?column? |
----------
| hello |
----------
(1 row)
-- sin/sinh 函数
$ select sin(1.414);
--------------------
| sin |
--------------------
| 0.9877326197620127 |
--------------------
(1 row)
$ select sinh(1.414) from dual;
--------------------
| sinh |
--------------------
| 1.9346016882495571 |
--------------------
(1 row)
9. plpgsql
pl/pgsql是一种用于postgresql数据库系统的可载入的过程语言。
在postgresql 9.0 和以后的版本中,pl/pgsql是默认被安装的。但是它仍然是一种可载入模块,因此特别关注安全性的管理员可以选择移除它。
pl/pgsql与 pl/sql 在许多方面都非常类似。它是一种块结构的、命令式的语言并且所有变量必须先被声明。
举个栗子:
create or replace function somefunc() returns integer as $$
declare
quantity integer := 30;
begin
raise notice 'quantity here is %', quantity; -- prints 30
return quantity;
end;
$$ language plpgsql;
$ select somefunc();
notice: quantity here is 30
----------
| somefunc |
----------
| 30 |
----------
(1 row)
10. security_plugin
security_plugin 是 gbase 8c 中的数据动态脱敏插件。
当系统接收到查询命令时,security_plugin将在解析器中拦截语义分析生成的查询树(query),首先根据用户登录信息(用户名、客户端、ip)筛选出满足用户场景的脱敏策略。由于脱敏策略是基于(仅包含表列的)资源标签配置的,因此需要判断查询树的目标节点是否属于某个资源标签,然后将识别到的资源标签与脱敏策略相匹配,根据策略内容将查询树目标节点改写,最终将查询树返还给解析器。
security_plugin模块由于内置查询树脱敏方式,数据访问者不会感知内置安全策略重写查询树的过程,如同执行普通查询一样去访问数据,同时保护数据隐私。
- 打开内置安全策略[ 默认off ]
gs_guc reload -n all -i all -c "enable_security_policy=on"
gsql -d postgres -p 5432 -c "show enable_security_policy ;"
- 创建测试表及数据
- 创建测试表person
create table person(id int primary key,name varchar(20),creditcard varchar(20),address varchar(50));
insert into person values(1,'张三','1234-4567-7890-0123','huoyue mansion, no. 98, 1st fuhua street');
insert into person values(2,'李四','1111-2222-3333-4444','futian district, shenzhen city');
select * from person;
- 创建测试表orders
create table orders(id int primary key,pid int,customername varchar(20),order_no int,email varchar(50));
insert into orders values(1,1,'李雷',13002345,'654321@qq.com');
insert into orders values(2,1,'韩梅',13001234,'testdb@huawei.com');
insert into orders values(3,2,'jerry',13009876,'test123@google.com');
select * from orders;
- 策略配置
- 创建资源标签【对表的敏感字段添加资源标签(需要拥有poladmin权限)】
create resource label creditcard_label add column(person.creditcard);
create resource label customer_label add column(orders.customername);
create resource label email_label add column(orders.email);
create resource label id_label add column(orders.id);
create resource label order_no_label add column(orders.order_no);
create resource label pid_label add column(orders.pid);
- 创建策略
create masking policy mask_name_pol maskall on label(customer_label);
create masking policy mask_email_pol basicemailmasking on label(email_label);
- 验证结果
select * from orders;
- 查询策略label
gbase=# select * from gs_policy_label;
更多例子可以参考: opengauss 数据动态脱敏
11. pg_hint_plan
gbase 8c 中不提供 pg_hint_plan 扩展,但是原生支持 plan hint 功能。
postgresql 社区不考虑引入 功能,所以在 postgresql 中可以用 pg_hint_plan 扩展来支持该功能,但是在 gbase 8c 中,已经在内核级别融入了 hint 功能。
在 gbase 8c 中,plan hint 为用户提供了直接影响执行计划的手段,用户可以通过指定 join 顺序,join、scan 方法,指定行数等手段来进行执行计划调优,以提升查询性能。
并从以下几个范围来支持 plan hint 的使用:
‒ 指定 join 方式;
‒ 指定 join 顺序;
‒ 指定行数;
‒ 指定 scan 方式;
‒ 指定链接块名;
‒ custom plan 和 generic plan 选择的 hint;
‒ 指定子查询不扩展;
总结
本文介绍了 gbase 8c 中预装的 10 个扩展插件,并对其中部分插件做了功能演示。
gbase 8c 具备分布式事务强一致性、计算能力和存储能力线性扩展的核心能力;同时支持多地多中心和异地多活,提供99.999%的高可用性,这其中,gbase 8c 所预装的10款插件也起到了强大的支撑作用。
另外, gbase 8c 相关认证培训课程已经公开上线,欢迎对国产数据库感兴趣的同学多多交流。