基于HDFS实现OushuDB的迁移,大版本升级等操作

本文详细介绍了如何在HDFS基础上进行OushuDB的迁移操作,包括适用场景、迁移思路、优点和缺点。在前期准备阶段涉及新环境搭建、网络配置、时间预估和数据验证。正式迁移时,通过一系列脚本完成旧集群DDL导出、新集群DDL导入以及数据迁移。整个过程旨在确保数据完整性和系统稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

适用场景

1. OushuDB迁移
2. OushuDB备份
3. OushuDB跨大版本升级(即不可以rpm+升级脚本实现的情况)

迁移思路

迁移考虑到OushuDB存储与计算分离的特性,利用orc外部表的形式进行数据迁移
考虑到现场子表+父表数据量巨大进行建立子表的外部表然后进行子表插子表的形式进行导入
多加改造可以实现每日的定时同步增量脚本,需要改写
注: 此次迁移由30节点混部集群的10TB数据迁移至15节点的独立集群共计耗时5-6小时左右,网络传输速度120MB/s

此迁移优点

1. 对旧集群影响时间短,仅影响备份数据的时间
2. 迁移速度快
3. 迁移失败代价小,且可以对失败的表进行单独迁移

此迁移办法的缺点

1. 对于非HDFS外部表只迁移了元数据,未将gpfdist指向的文件迁移
2. 会创建大量外部表,后续删除比较慢

前期准备

新环境搭建

按照预期搭建环境即可

网络打通

实现新集群可以访问旧集群的HDFS

迁移时间预估

根据网络、磁盘、HDFS IO和数据量评估迁移时间,需要保证备份过程中数据尽量不发生变化

迁移前后数据验证

数据量验证(脚本自动生成)
关键统计值验证(业务人员准备)

正式迁移

旧集群导出DDL

旧集群执行 
pg_dumpall -s > all.sql

新集群导入DDL

新集群执行
psql -d postgres -f all.sql

进行迁移

脚本说明

迁移的脚本分为6个,每个的作用如下
1)统计表数据量.sh
执行集群:新旧集群
执行用户:gpadmin
执行目的:统计表的数据量,并生成csv文件

2)创建HDFS目录脚本.sh
执行集群:旧集群
执行用户:gpadmin,生成的脚本用hadoop执行
执行目的:建立备份表的HDFS目录

3)自动生成创建外表脚本.sh
执行集群:新旧集群
执行用户:gpadmin
执行目的:生成自动创建外部表的脚本,生成之后拿到新旧两套集群执行

4)自动生成备份insert脚本.sh
执行集群:旧集群
执行用户:gpadmin
执行目的:生成将数据备份到ORC外部表中的脚本

5)自动生成备份恢复到新集群脚本.sh
执行集群:新集群
执行用户:gpadmin
执行目的:生成将备份数据插入到新集群中的脚本

6)006-自动生成删除外表的脚本.sh
执行集群:旧集群
执行用户:gpadmin
执行目的:生成的删除外表的脚本

迁移流程

待跑批完成后,进行如下操作
1.旧集群执行001脚本,统计表记录条数
  sh 001-统计表数据量.sh
  
2.旧集群执行002脚本,生成创建hdfs目录脚本(手动划分成5个sh,同时执行)
  sh 002-创建HDFS目录脚本.sh
  sh $transfer_dir/create_hdfs.sh
  
3.旧集群执行003脚本,生成创建外表脚本
  sh 003-自动生成创建外表脚本.sh
  psql -d postgres -f $transfer_dir/create_external_table.sql
  
4.旧集群执行004脚本,生成备份insert脚本
  sh 004-自动生成备份insert脚本.sh
  sh $transfer_dir/insert_external.sh
  
5.新集群重新同步元数据
  1) 执行psql -d postgres -f all.sql
  2) 执行psql -d postgres -f $transfer_dir/create_external_table.sql
  
6.旧集群执行005脚本,生成备份恢复到新集群脚本(手动划分成15个sh,同时执行)
  sh 005-自动生成备份恢复到新集群脚本.sh
  新集群执行: sh $transfer_dir/recovery_from_external.sh
  
7.新集群执行001脚本,统计表记录条数
  sh 001-统计表数据量.sh
  并对新旧集群统计数据量进行对比(对比脚本未提供)

注: $transfer_dir=/home/gpadmin/transfer

001-统计表数据量.sh

#!/bin/bash
set -o errexit
###################################################################################################################################################################
###       作用:	统计数据库所有表的记录数,并生成csv文件                                                                                                       #
###       作者:	                                                                                                                                        #
###       日期:	2021-01-18                                                                                                                                    #
###       版本:	V1.0                                                                                                                                          #
###       变更:	                                                                                                                                              #
###################################################################################################################################################################

#开始执行
echo "统计数据库所有表的记录数,并生成csv文件"
echo "开始执行:"
echo ""
#创建对应的目录
transfer_dir=/home/gpadmin/transfer
script_dir=/home/gpadmin/transfer/script_count
mkdir -p $transfer_dir
mkdir -p $script_dir
#重跑清空
echo '' > $script_dir/all_table_count.sh
echo '库名,表名,统计时间,统计时间戳,数据量' > $transfer_dir/table_count.csv
echo '' >> $transfer_dir/table_count.csv
#获取所有库名
psql -d postgres -c "select datname from pg_database  where datname not in ('template1','template0','postgres');" |grep -v 'datname\|-\|row)\|^$\|rows)' > $script_dir/database.list
#生成获取所有表名的SQL
echo "select 'postgres'||'@#@'||c.nspname||'.'||b.relname 
from gp_distribution_policy a,
(select oid,* from pg_class b where not exists(select 1 from pg_partitions where partitiontablename=b.relname)) b,
pg_namespace c 
where b.relnamespace=c.oid and a.localoid=b.oid;" > $script_dir/gather_table.sql
cat $script_dir/database.list | while read line
do
echo "\\c $line">> $script_dir/gather_table.sql

echo "select '$line'||'@#@'||c.nspname||'.'||b.relname 
from gp_distribution_policy a,
(select oid,* from pg_class b where not exists(select 1 from pg_partitions where partitiontablename=b.relname)) b,
pg_namespace c 
where b.relnamespace=c.oid and a.localoid=b.oid;" >>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值