最近做了greenplum 4.3 --> greenplum 6.9 的迁移升级, 踩坑无数, 先写个总结:
-
迁移方案:
- 构建新集群, 再将老集群数据迁移到新集群。
-
坑
- 自带的gptransfer不能用, 执行时会报一个参数不存在。
- 最终只能回到原始的pg_dump。
- 理想的方式是gptransfer大表, 小表dump。
- greenplum 5开始不支持 date类型 --> text类型的自动隐式转换, 会导致部分sql兼容性问题。
-
在使用mirror的情况下, 一次导入过多数据可能导致节点挂掉, 导致primary和mirror替换。
-
临时的处理方案是导出数据时拆的更细一点
# 原导出操作 pg_dump -t 'dw.src*' dw | gzip > src.sql.gz # 拆分后的导出操作 pg_dump -t 'dw.src_c*' dw | gzip > src_c.sql.gz pg_dump -t 'dw.src_e*' dw | gzip > src_e.sql.gz pg_dump -t 'dw.src_f*' dw | gzip > src_f.sql.gz ... etc
- 实践下来是没有问题的。
-
-
客户环境问题
- 偶尔会出现cpu异常导致的软中断进程ksoftrqd占满资源, 具体底层应该和他们那一套基于openstack的超融合虚拟机的问题, 与我无瓜。
-
性能问题
-
Greenplum的查询优化器对一个节点上多个segment的集群有比较好的优化, 一开始部署一台一个节点的时候性能反而不如老集群, 与官方社区沟通后是查询优化器的问题, 后来一个节点上装了3个segment后性能显著提升, 复杂sql比老集群快了一倍多。
-
使用的gpinitsystem_config
#数据库代号 ARRAY_NAME="Greenplum" #segment前缀 SEG_PREFIX=gpseg #primary segment 起始的端口号 PORT_BASE=33000 #指定primary segment的数据目录,网上写的是多个相同目录,多个目录表示一台机器有多个segment declare -a DATA_DIRECTORY=(/home/gpadmin/data/datap1 /home/gpadmin/data/datap2 /home/gpadmin/data/datap3) #master所在机器的host name MASTER_HOSTNAME=mdw #master的数据目录 MASTER_DIRECTORY=/home/gpadmin/data/master #master的端口 MASTER_PORT=5432 #指定bash的版本 TRUSTED_SHELL=/usr/bin/ssh #将日志写入磁盘的间隔,每个段文件通常 =16MB < 2 * CHECK_POINT_SEGMENTS + 1 CHECK_POINT_SEGMENTS=8 #字符集 ENCODING=UNICODE #mirror segment 起始的端口号 MIRROR_PORT_BASE=44000 # mirror的数据目录,和主数据一样,一个对一个,多个对多个 declare -a MIRROR_DATA_DIRECTORY=(/home/gpadmin/data/datam1 /home/gpadmin/data/datam2 /home/gpadmin/data/datam3)
-