暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GreenPlum生产环境行存表转列存表

IT那活儿 2023-03-02
621

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!




需求背景



生产环境Greenplum机器架构为1Master、1Standby、6Segments,Segment主机磁盘为RAID01,容量5.3TB。随着业务增长,数据量增长较快,Segment主机剩余空间不足。
因此提供以下三种解决方案:
  • 清理历史数据,回收部分空间;但由于历史数据需要用于数据分析,因此该方案未采纳
  • 集群扩容,由于硬件资源需要重新采购,耗时较久而未采纳该方式
  • 分析当前数据表基本信息,发现都是HEAP表,建议将大表采用列存,使用压缩特性进行空间节省



生产Greenplum部署架构





Segment 主机上部署8主8备,整个集群共有:

98个PostgreSQL实例:其中2个用于对外提供服务,96个节点用于实际数据存储。




行存表转列存表步骤



1. 查看当前库是否存在列存表
SELECT relname,reloptions,nspname from pg_class a inner join pg_namespace b on a.relnamespace = b.oid where b.nspname not in
('gp_tookit','information_schema','pg_aoseg','pg_bitmapindex','pg_catalog','pg_toast') and reloptions like '%column%';

如果存在列存表,在备份时候,将该部分表排除。

2. 备份出表结构
pg_dump -f db_name_struct.sql -F p -c -E utf8 -s -d dbname -h host -U user -p port
3. 对表结构进行部分替换,添加列存表参数
cp db_name_struct.sql db_name_struct.sql.bak
Vi db_name_struct.sql
执行全局替换:
:%s/DISTRIBUTED /with(appendonly=true,orientation=column,compresstype=zlib,compresslevel=5)

4. 对分区表进行特殊替换
Vi db_name_struct.sql
执行全局替换:
:%s/appenonly=false’/ appendonly=true,orientation=column,compresstype=zlib,compresslevel=5

5. 备份数据库中所有表数据,只进行数据备份
pg_dump -f db_name_data.sql -F p -E utf8 -a -d dbname -h host -p port -U username
6. 数据备份完成后,执行数据恢复
1)删除原始数据库,并重建
DROP DATABASE dbname;
CREATE DATABASE dbname;

2)恢复表结构
\c dbname
\i db_name_struct.sql

3)恢复数据
\c dbname

\i db_name_data.sql
4)数据库恢复完成后执行analyze
analyzdb -a -d dbname -p jobs

5)整体转换完毕后,原始集群数据11TB压缩至接近5TB,segment主机磁盘利用率为  32%,剩余磁盘容量:2.6TB。




方案缺点



1. 在转换存储引擎期间,数据库不能对外提供服务。
2. 由于采用数据备份恢复的方式,整个转换过程耗时较久,在此步骤建议采用gpbackup和gprestore备份恢复工具,该工具可以执行并行备份和恢复。
3. 建议仅对数据库中较大的表进行处理,并使用INSERT的方式回插数据,测试:单表数据48亿行,数据使用INSERT方式插入到列存表,耗时10min左右。

END


本文作者:魏 强(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论