Diskquota是什么
Diskquota extension 是 Greenplum6.0 提供的磁盘配额管理工具,它支持控制数据库 schema 和 role 的磁盘使用量。当 DBA 为 schema 或者 role 设置磁盘配额上限后,diskquota 工作进程负责监控该schema和role的磁盘使用量,并维护超出配额上限的schema和role的黑名单。当用户试图往黑名单中的schema或者role中插入数据时,操作会被禁止。
Diskquota的典型应用场景是对于企业内部多个部门共享一个Greenplum集群,如何分配集群的磁盘资源给不同的部门。Greenplum的Resource Group功能支持对CPU,Memory等资源进行分配。而Diskquota则是对磁盘资源的细粒度分配,支持在schema和role的层级进行磁盘用量的控制,支持秒级延时的磁盘实时使用量检测,这是传统基于的cron job的磁盘管理工具做不到的。企业可以选择为不同的部门分配专属schema,从而实现对各个部门的磁盘配额分配。
需要指出Diskquota是对磁盘用量的一种软限制,“软”体现在两个方面: 1. 计算schema和role的实时用量存在一定延时(秒级),因此schema和role的磁盘用量可能会超出配额。延时对应diskquota模型的小刷新频率,可以通过GUC diskquota.naptime 调整其大小。2. 对插入语句,diskquota只做查询前检查。如果加载数据的语句在执行过程中动态地超过了磁盘配额上限,查询并不会被中止。DBA可以通过show_fast_schema_quota_view和show_fast_role_quota_view快速查询每个schema和role的配额和当前使用量,并对超出配额上限的schema和role进行相应处理。
Diskquota架构
Diskquota设计伊始,主要考虑了如下几个问题:
终diskquota extension的架构由以下四部分组成。
Quota Status Checker
Quota Status Checker基于Greenplum background worker框架实现,包含两类bgworker: diskquota launcher和diskquota worker。
Diskquota launcher负责管理diskquota worker。每个集群只有一个launcher,并且运行在Master节点。laucher进程在数据库启动时(具体时间是Postmaster加载diskquota链接库的时候)被注册并运行。
Laucher进程主要负责:
Diskquota worker进程实际扮演Quota Status Checkers的角色。每个启动diskquota extension的数据库都有隶属于自己worker进程。没有采用一个worker进程监控多个数据库是由于Greenplum和Postgres存在一个进程只能访问一个数据库的限制。由于每个worker进程占用数据库连接和资源,我们为同时启动disk extension的数据库个数设置了上限:10。diskquota worker通过SPI与Segment进行交互,因此,diskquota worker同样只运行在Master节点。
Worker进程主要负责:
刷新diskquota模型的算法如下:
Quota Change Detector
Quota Change Detector通过一系列Hook函数实现。对于Heap表,在smgrcreate()/smgrextend()/smgrtruncate()等位置设置Hook函数,记录活跃表信息;对于AO表和CO表,在BufferedAppendWrite/copy_append_only_data/TruncateAOSegmentFile等位置设置Hook函数,记录活跃表信息。活跃表被存储在每个Segment的共享内存中,等待Quota Status Checker周期性查询。由于活跃表只是一个子集,显著减少了每次刷新diskquota模型的代价。
Quota Enforcement Operator
Quota Enforcement Operator同样通过Hook函数实现。通过重用Greenplum的Hook函数ExecutorCheckPerms_hook,实现在每次插入和更新数据前,检查目标schema或role是否在diskquota的黑名单中,并中止击中黑名单的查询。
Quota Setting Store
diskquota的磁盘配额分为schema和role两类,存储在数据表’diskquota.quota_config’中。每一个启动diskquota的数据库存储和管理自己的磁盘配额。需要指出的是,尽管role不隶属于数据库,而是一个数据库集群的对象,在diskquota中将role的磁盘配额限定为数据库特定。即role会在不同的数据库有不同的配额,role的磁盘使用量也是不同数据库独立计算。Quota Setting Store被定义为如下数据表。
create table diskquota.quota\_config (targetOid oid, quotatype int, quotalimitMB int8, PRIMARY KEY(targetOid, quotatype)); `
复制代码
Diskquota快速上手
安装和配置
1.开源版diskquota下载地址:diskquota repo,安装步骤如下
# source greenplum\_path.sh
cd $diskquota;
make;
make install;
复制代码
2.创建数据库diskquota 用来持久化启动diskquota extension的数据库列表。
create database diskquota;
复制代码
3.将diskquota添加到shared_preload_libraries列表
# enable diskquota in preload shared library.
gpconfig -c shared\_preload\_libraries -v 'diskquota'
\# restart database.
gpstop -ar
复制代码
4.置diskquota extension的刷新频率
# set naptime (second) to refresh the disk quota stats periodically
gpconfig -c diskquota.naptime -v 2
复制代码
5.创建diskquota extension,例如希望在postgres数据库启用diskqota extension, 执行如下语句。
# suppose we are in database 'postgres'
create extension diskquota;
复制代码
6.果DBA在非空数据库创建了dikquota extension,会收到提示信息,需要手动执行UDF初始化表table_size。根据数据库中已经存在的文件数,该操作可能耗时。
# after create extension diskquota on non empty database
select diskquota.init\_table\_size\_table();
复制代码
7.删除diskquota extension,例如希望在’postgres’数据库禁用diskqota extension,执行如下语句。
# login into 'postgres'
drop extension diskquota;
复制代码
使用
1.设置schema的磁盘配额
create schema s1;
select diskquota.set_schema_quota('s1', '1 MB');
set search_path to s1;
create table a(i int);
# insert small data succeeded
insert into a select generate_series(1,100);
# insert large data succeeded, since diskquota is soft limit
insert into a select generate_series(1,10000000);
# insert small data failed
insert into a select generate_series(1,100);
# delete quota configuration
select diskquota.set_schema_quota('s1', '-1');
# insert small data succeeded
select pg_sleep(5);
insert into a select generate_series(1,100);
reset search_path;
复制代码
2.设置role的磁盘配额
create role u1 nologin;
create table b (i int);
alter table b owner to u1;
select diskquota.set_role_quota('u1', '1 MB');
# insert small data succeeded
insert into b select generate_series(1,100);
# insert large data succeeded, since diskquota is soft limit
insert into b select generate_series(1,10000000);
# insert small data failed
insert into b select generate_series(1,100);
# delete quota configuration
select diskquota.set_role_quota('u1', '-1');
# insert small data succeed
select pg_sleep(5);
insert into a select generate_series(1,100);
reset search_path;
复制代码
3.询schema的磁盘使用量和配额
select * from diskquota.show_fast_schema_quota_view;
复制代码
4.查询role的磁盘使用量和配额
select \* from diskquota.show\_fast\_role\_quota\_view;
相关文章
SQL数据库触发器语法详解 (sql数据库触发器语法)
2023-08-06
数据库
语法
触发器
快速简单的删除Oracle数据库字段方法 (删除oracl数据库字段)
2023-08-06
数据库
字段
删除
如何打开社工数据库bak文件 (社工数据库bak怎么打开)
2023-08-06
数据库
打开
社工
实现数据库按拼音排序的方法和技巧 (数据库按拼音排序)
2023-08-06
数据库
排序
按拼音
探究Sybase数据库的性能和功能特点 (sybase数据库怎么样)
2023-08-06
数据库
性能
探究
SQL Server 如何成功建立自己的数据库? (sql server 建立数据库)
2023-08-06
数据库
自己的
建立
如何在Oracle中查看数据库触发器? (oracle查看数据库触发器)
2023-08-06
数据库
查看
触发器
数据库表数据量千万级,对性能影响有多大? (数据库表千万级数据量多吗)
2023-08-06
数据库
级数
有多大
如何使用Oracle按时间导出表数据库? (oracle按时间导出表数据库)
2023-08-06
数据库
导出
如何使用
数据库存储:帖子长期保存,信息永不丢失 (帖子存数据库)
2023-08-06
数据库
丢失
帖子
小米六数据库:全方位数据保障和优化方案 (小米六数据库)
2023-08-05
数据库
优化
小米
简易教程:使用dbe数据库实现数据连接 (dbe数据库 数据连接)
2023-08-05
数据
数据库
连接
Oracle实现多个数据库链接的简便方法 (oracle链接多个数据库)
2023-08-05
数据库
多个
链接
数据库索引:用哪种方法建立? (数据库索引用什么建的)
2023-08-05
索引
数据库
哪种
实现高效缓存同步:Redis数据库技巧大全 (redis 数据库缓存同步)
2023-08-05
数据库
缓存
同步
如何利用数据库实现高效的模糊匹配查询? (数据库实现模糊查询)
2023-08-05
查询
数据库
模糊
数据库有哪些安装方式和位置? (数据库是装在什么上)
2023-08-05
数据库
位置
装在
Lactmed数据库:妈妈们必备的喂养指南 (lactmed 数据库)
2023-08-05
数据库
必备
喂养
数据库设计中的主属性定义及作用 (数据库主属性是什么)
2023-08-05
数据库
定义
属性
数据库分区操作不当常常造成分区不清的问题 (分区不清数据库)
2023-08-05
数据库
分区
不清