了解更多Greenplum技术干货,欢迎访问Greenplum中文社区网站
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模型,还是将数据库对象的实时磁盘使用量存储在系统表中。 系统表pg_class存储了数据表的元数据信息,比如relpages记录了analyze后数据表的页面数。我们没有采用此方式管理diskquota模型,一方面,如果让每次数据加载、删除操作都实时更新relpages等信息,会降低数据库性能;另一方面,diskquota基于extension框架,不希望改动DB内核,因而选择使用单独的监控进程来管理diskquota模型(在diskquot工作进程中维护所有数据表的实时磁盘使用量)。
- 对于单独进程管理diskquota模型的方案,如何实现Greenplum Master和Segment之间的通信。 对于diskquota而言,Master和Segment之间的通信内容主要是每个Segment上实时的磁盘使用量数据。由于diskquota是集群级别的磁盘配额管理工具,我们只关心Master节点维护的数据表的全局磁盘使用量。因此,基于Greenplum的SPI框架,Master上的diskquota工作进程可以定期通过SPI查询,实时计算和汇总所有Segment上活跃表的磁盘使用量,Segmen