升级典型问题
官网升级操作指引 ,一般线上操作之前需要照着做一遍,但是由于数据量少、monit进程在测试环境没有启动等原因,一些操作、配置问题在测试过程中不会暴露,在生成操作的时候才暴露,下面3项是比较常见的容易遗漏的:
1、monit进程没停止引起升级失败
monit进程是什么
monit进程会对yasdb/yasagent/yasom3个进程做监控,如果出现异常重新拉起(注意不止yasdb,yasagent、yasom进程也会被拉起,如下演示杀死yasom、yasagent被重新拉起)。
monit进程没有停止的后果
monit进程没有停止的后果
如果升级过程没有停止monit进程,在停止老的yasdb进程的时候会被自动拉起,升级程序识别到db在OPEN状态,中止升级。
关键日志:
处理方式
停止monit进程,重新执行yasdb升级命令。
停止方式
■ 使用yasboot(yasboot monit stop --cluster debug)
■ 使用kill -9
2、升级前没预留足够的空间做备份
为什么需要备份空间
升级前需要整库做backup,作为升级过程的终极回退手段。处理需要预留backup的空间外,升级过程还会做数据转换,还需要预留下面的空间:
离线升级中会创建一个临时目录(${旧版本的安装目录}/upgrade_tmp/backup)作为备份目录,备份当前数据库ctrl/system/undo/redo等文件的备份(主备环境中各节点分别备份至本机),需要确保拥有足够的存储空间。
官网说明:
没有预留空间的后果
空间不足后果
升级过程,由于空间不足,数据库会变为readonly状态,导致升级中断。
案例:22.2.4.1版本升级到22.2.8.105版本由于空间不足,导致升级失败。
关键日志:
处理方式
清理空间,保证空间足够,执行rollback,rollback成功之后重新升级。
3、配置文件目录错误
哪些目录容易错
集群托管toml文件注意使用旧版本的$YASDB_HOME、$YASDB_DATA,需要特别注意:
配置错误的后果
路径配置错误后果
升级过程,会自动对monit进程做停止,但是如果路径配置错误,会使得兜底的停止动作没执行成功,进而引发上述monit进程没停止的问题。
案例:在22.2.11.100升级到22.2.14.100的时候,错误将yasdb_home目录设置为新的目录,导致自动停止monit进程失败。
关键日志 :
处理方式
检查升级结果,如果出现already started and status is OPEN, not nomount的错误, 执行下面步骤:
■ 确认yasdb进程没有升级, 还是老版本的
■ 停止monit进程
■ 执行yasdb升级
升级失败应急处理
根据日志快速定位根因
shell命令yasboot的命令,会通过调用yasom,再通过yasom调用各个节点yasagent(主备、集群、分布式每个节点上都有yasagent),最终转换成各个节点内部各个接口的调用。
因此,如果需要查看升级失败的日志,需要查看yasagent.log,路径是$YASDB_HOME/om/{cluster-name}/log/yasagent.log(每天一个日志文件,如果需要查看历史日志可以根据需要查找)
在yasagent.log查找错误日志,如上述典型问题的关键日志,yasagent.log可查找到。
根据错误原因判断执行rollback
崖山DB的升级,实际是分为独立的两步:
■ 托管的升级(即yasom/yasagent)
■ 数据库的升级(即yasdb)
官网上提供的升级rollback是针对数据库升级的rollback,对升级过程中存在的数据转换使用备份的数据做回退(ctrl/redo/undo),前提是数据库升级之前的操作都没有问题。因此我们遇到失败的情况,有时候直接回退是没有用的,如上面空间不足、路径错误问题,直接rollback会有其他错误产生。
使用备份数据做restore
升级之后可能yasagent/yasom/yasdb都已经换了版本,在不能使用yasboot rollback的情况下,需要逐一做回退,使用备份数据做恢复。以下使用22.2.11.100升级到22.2.13.100(集群名称为debug)为例,展示如何回退。
停止yasom/yasagent/yasdb
修改yasboot环境变量
yasboot命令执行的时候,执行的具体路径配置是在~/.yasboot/{cluster-name}.env里配置的:
修改~/.yasboot/{cluster-name}.env,指到原来目录
使用yasboot 重启yasom/yasagent,重启yasdb到nomount状态
主要yasdb使用nomount状态启动:
使用备份文件恢复
参考命令: