目录
一、环境
ds1 为master
ds2 为standby
二、主备切换
模拟手动切换
1、关闭ds1
ds1 节点执行关闭命令
#gpstop -m
此时在ds1 上执行查看集群状态命令时,就会报错
2、将ds2 转变成主节点
在ds2 上执行gpstate -b 时,同样会出现上述错误,这是因为ds2暂时还不是master节点。此时需要将ds2 置为master节点。在ds2上执行
#gpactivatestandby -d $MASTER_DATA_DIRECTORY
这里的$MASTER_DATA_DIRECTORY 就是在配置集群时指定的数据目录。
再次执行gpstate -b 命令查看集群状态,发现集群正常,不过会提示没有standby 节点,生成环境中需要在配置一个从节点,可以在配置好ds3后,通过在ds2上执行 gpinitstandby -s ds3 即可,这里不做演示。
模拟master崩溃
上面模拟的是人为关闭master节点,这里模拟master节点意外异常。
1、kill master 节点的进程
kill ds1上所有gp进程,模拟master 节点意外宕机,此时活跃的客户端连接都会被断开,并且新的连接会被拒绝,不过segment 上的进程不受影响继续执行。Standby节点不会自动接管集群。
2、将standby节点转换成master
在ds2 运行
#gpactivatestandby -d $MASTER_DATA_DIRECTORY
3、验证集群状态
在ds2上执行gpstate -b 会发现集群正常。
以上测试均是演示mater 出现异常,将standby切换为master 节点。不过会发现几个问题
问题1: ds1 \ ds2 IP地址不同。
在实际场景中还需要配置代理,使用代理IP或者VIP,避免客户端更换IP。
问题2:集群故障不会自动切换。
可以通过编写检查脚本去判断主节点是否异常,从而触发拉起备节点作为主节点的动作。不过作为数据库集群,数据一致性是重中之重,特别是master节点存储的是集群的元数据,所以个人建议还是人工在检查无误后,进行切换验证。当然,如果通过充分的论证和试验,能够准确的判断集群可能出现的异常情况,完全可以做到自动切换。
三、还原主节点
前提:ds1 节点具备恢复的条件。
1、移除ds1 的数据目录
首先需要将ds1 的数据目录迁移,为了从ds2 同步集群元数据文件
#mv /mnt/data_1/mgpdb/gpseg-1 /mnt/data_1/mgpdb/gpseg-1.backup
2、定义ds1 为 standby 节点
将ds1 定义为ds2 的备节点,在ds2 上执行 gpinitstandby -s ds1
#gpinitstandby -s ds1
3、查询集群主备状态
此时可以看到备节点为ds1
#gpstate -f
4、关停ds2
这里关停ds2 是为了后面主备切换做准备
#gpstop -m
5、移除ds2 数据目录
#mv /mnt/data_1/mgpdb/gpseg-1 /mnt/data_1/mgpdb/gpseg-1.backup
6、定义ds2 为standby 节点
在ds1 上执行gpinitstandby -s ds2
7、验证
此时再次通过 gpstate 命令查看集群状态,发现已恢复ds1为主,ds2为备。