适用场景
- 产品:ZCF。
- ZStone
- 版本:源案例建议升级到 4.2.2 以上版本彻底解决;因此本文适用于 4.2.2 以下版本中已发生 Temporal 脑裂的恢复场景。
- 部署方式:双管理节点。
- 涉及服务:
zstone-master、temporal、bucardo、postgresql-9.6。 - 涉及目录:
/opt/zstone-installer/、/var/lib/pgsql/、/var/run/bucardo。 - 本文适用于双管理节点环境中已发生 Temporal 脑裂,需要清理 PostgreSQL 数据并重建 Temporal 相关数据库和同步服务的场景。
问题现象
- 双管理节点环境中 Temporal 出现脑裂异常。
- PostgreSQL 持续写入导致根分区使用率接近或达到 100%。
- 根分区写满后,管理节点无法启动。
判断方法
- 在两台管理节点上检查根分区使用率,确认是否已接近或达到 100%。
- 检查
temporal和zstone-master服务状态,确认两台节点是否均异常。 - 使用
df -h并检查根目录下占用空间最大的目录,排除日志增长、镜像缓存等其他根分区写满原因。
问题根因
Temporal 发生脑裂后,PostgreSQL 持续写入异常数据,最终可能写满根分区并导致管理节点无法启动。源案例采用的处理方式是停止双管理节点上的 zstone-master、temporal 和 bucardo,清理 PostgreSQL 数据后重新安装并初始化 PostgreSQL、Bucardo 和 Temporal 相关数据库。
解决方案
Note:
警告:以下操作涉及停止服务、删除 PostgreSQL 数据目录和重建数据库。执行前请确认已获得客户授权,并在维护窗口内操作。删除 /var/lib/pgsql/ 前必须确认已有最近且可用的管理节点数据库备份;删除后除从已有 dump 恢复外无其他回滚路径。
1. 停止双管理节点上的 zstone-master、Temporal 和 Bucardo
在两台管理节点上分别执行以下操作,停止 zstone-master、temporal 和 bucardo,并关闭 Bucardo 开机启动。
systemctl stop zstone-master
systemctl stop temporal
mkdir /var/run/bucardo
pkill -9 bucardo
sed -i "/^bucardo/d" /etc/rc.local
bucardo stop
如果停止 Bucardo 时出现异常,可根据现场情况清理 Bucardo 运行目录:
rm -rf /var/run/bucardo
2. 卸载双管理节点上的 PostgreSQL 并删除 pgsql 目录
在两台管理节点上分别执行:
systemctl stop postgresql-9.6
yum remove -y "postgresql*"
rm -fr /var/lib/pgsql/
systemctl -a | grep postgresql
确认 PostgreSQL 服务已停止,相关服务不再运行。
3. 重新安装 PostgreSQL 和 Bucardo,并创建 Temporal 所需数据库
在两台管理节点上分别执行以下命令。
其中 [IP] 替换为当前节点的管理网 IP。
cd /opt/zstone-installer/
yum localinstall -y ./pkgs/pg-rpms/*.rpm
./install.sh cmd setup_postgresql
cd /opt/zstone-installer/
./install.sh cmd setup_bucardo bucardo bucardo bucardobucardo [IP] 5432 -D
bucardo status
./install.sh cmd setup_temporal_db /opt/zstone-installer/pkgs/temporal/temporal_home/ [IP] 5432 bucardo bucardobucardo
cd /var/lib/pgsql
sudo -u postgres -H -- psql -c "\l"
确认数据库列表中已创建 Temporal 所需数据库。
4. 开启双管理节点上的 Bucardo 同步和 Temporal
在两台管理节点上分别执行:
cd /opt/zstone-installer/
./install.sh cmd setup_bucardo_sync
./install.sh cmd setup_temporal
如果执行 setup_bucardo_sync 时某个节点出现报错,可在对应节点执行:
bucardo stop
然后重新执行:
./install.sh cmd setup_bucardo_sync
确认最终两台管理节点的同步状态均正常。
5. 注册 Temporal namespace
在其中一台管理节点上执行即可:
cd /opt/zstone-installer/
./install.sh cmd setup_temporal_namespace
tctl namespace list
确认 Temporal namespace 已注册成功。
6. 启动双管理节点上的 zstone-master
在两台管理节点上分别执行:
systemctl start zstone-master
systemctl status temporal
systemctl status zstone-master
确认 temporal 和 zstone-master 服务状态正常。
验证方法
完成恢复后,确认以下结果:
- 两台管理节点上的
temporal服务状态正常。 - 两台管理节点上的
zstone-master服务状态正常。 bucardo status显示同步状态正常。tctl namespace list可正常返回 namespace 信息。- ZStone 相关业务功能恢复正常。
风险
- 本方法仅用于清理已发生 Temporal 脑裂后的 PostgreSQL 数据,无法预防 Temporal 脑裂再次发生。
- 若需彻底解决该问题,源案例建议升级到 4.2.2 以上版本。
- 源案例提到 4.2.2 版本存在预防 Temporal 脑裂的参考方法,但不建议使用。
- 删除
/var/lib/pgsql/前请确认现场是否需要备份 PostgreSQL 数据。 - 删除 PostgreSQL 数据目录后,只能使用操作前的可用数据库 dump 回滚;如果备份不可用,不应执行删除。
