文档目录

适用场景

  • 产品: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%。
  • 根分区写满后,管理节点无法启动。

判断方法

  1. 在两台管理节点上检查根分区使用率,确认是否已接近或达到 100%。
  2. 检查 temporal 和 zstone-master 服务状态,确认两台节点是否均异常。
  3. 使用 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 回滚;如果备份不可用,不应执行删除。
Temporal 脑裂后在双管理节点上重建 PostgreSQL 和 Temporal | 技术方案 · KB | ZStack 资源中心