Greenplum 集群故障恢复与主备同步机制实战
环境:Greenplum 6.17.1(安装包:
open-source-greenplum-db-6-6.17.1-1.el7.x86_64),RHEL/CentOS 7。文中主机名、路径均已脱敏(host1、/opt/greenplum),替换为实际环境信息即可。
gp 库挂掉后,先检查磁盘使用情况,删除日志等无用内容、确保空间足够,再进行恢复与同步操作。
第一步:找到停止的数据段
bash
su gpadmin
gpstate -a # 整体状态
gpstate -m # mirror 端口状态
gpstate -c # primary/mirror 状态
ps -ef | grep postgres
ps -ef | grep gpseg
找到未启动的数据段后,挨个切换 gpadmin 用户启动 primary 以及 mirror。启动命令在每个数据段目录下都有记录,例如 /opt/greenplum/primary/gpseg1/postmaster.opts:
bash
cd /opt/greenplum/primary/gpseg1
cat postmaster.opts
su gpadmin
# 粘贴 cat 出来的内容执行
注意:启动后不要 Ctrl+C 退出,要直接关闭窗口退出!
第二步:恢复数据段在主节点上的状态
A. 可能会用到的内容
bash
gprecoverseg -help # 查看命令帮助
-
按提示找到锁文件并删除(出现锁文件问题时会用到)。
-
/home/gpadmin为 recoverseg 配置文件目录,如recover_config_file3内容示例:host1|17005|/opt/greenplum/mirror/gpseg11
-
/opt/greenplum/master/gpseg-1是 Greenplum 主节点(master)的数据目录。
B. 操作
bash
gprecoverseg -i recover_config_file4 -F
# ...
gprecoverseg -i recover_config_file12 -F
recover 配置文件需要自行编写,内容示例(格式:主机|端口|数据目录):
host1|16001|/opt/greenplum/primary/gpseg1
host1|16002|/opt/greenplum/primary/gpseg2
host1|16003|/opt/greenplum/primary/gpseg3
host1|16004|/opt/greenplum/primary/gpseg4
host1|16005|/opt/greenplum/primary/gpseg5
C. 其他报错
过程中报错 SSH 问题:
One or more hosts are not reachable via SSH. Any segments on those hosts will be marked down
原因是目标主机 host1 的公钥在本地 known_hosts 中对应的指纹与之前不同(主机密钥更改或安全问题),SSH 客户端为防中间人攻击拒绝连接:
bash
sed -i '3d' ~/.ssh/known_hosts # 删除对应行,具体行号按实际调整
重新连接成功后,再执行恢复:
bash
gprecoverseg -i recover_config_file12 -F
第三步:同步机制恢复(primary 恢复为主数据节点)
如果 seg 数据段挂掉,mirror 会接管服务。想恢复原拓扑:先用 gprecoverseg 恢复状态,再用 -r 参数将镜像与数据段的切换关系切回:
bash
gprecoverseg -r
第四步:检查
bash
gpstate -a
gpstate -m
gpstate -c
ps -ef | grep postgres
ps -ef | grep gpseg
小结
| 阶段 | 关键命令 | 说明 |
|---|---|---|
| 定位故障段 | gpstate -a/-m/-c、ps -ef |
找到未启动的 primary/mirror |
| 手动拉起 | postmaster.opts 中的启动命令 |
逐段启动,勿 Ctrl+C 退出 |
| 恢复状态 | gprecoverseg -i <配置文件> -F |
配置文件格式:`主机 |
| 主备回切 | gprecoverseg -r |
把 primary 切回主数据节点 |
| 验证 | gpstate -a/-m/-c |
全部 Up 即恢复完成 |