我在 SLES 12 SP3 系统上有一个 postgresql 数据库,其服务由 systemd 通过标准单元文件管理。我想在失败时自动重新启动服务,因此创建目录/etc/systemd/system/postgresql.service.d/psql.conf包含以下内容。
[Service]
Restart=on-failure
这很有效,我很高兴。现在需要设置一个高可用性系统,其中一个从属设备处于备用状态,以防主设备发生故障。从事 HA 工作的团队已请求在设置集群时禁用重新启动服务标志,因为他们将监视服务并在 postgresql 停止时故障转移到从属服务器。所以我创建了一个文件/etc/systemd/system/potgresqlHA.service这是现有单元文件的副本,HA 团队开始使用此文件。
systemctl start/stop/restart/status postgresqlHA
现在有一个脚本可以根据请求备份数据库。该脚本在备份之前检查 postgresql 的状态以确保该服务正在运行。
systemctl status postgresql
当未设置集群时,此方法效果很好。但是当集群设置时,服务的状态是停止的,因为 postgresqlHA 是启动的服务。
如何使备份脚本无论正在运行的数据库服务如何都正常工作?我可以在其中一个单元文件中配置一些内容以使管理更容易吗?
我在检查其他脚本中其他一些服务(apache2、tomcat 等)的状态时遇到同样的问题。
谢谢,阿布舍克
答案1
systemctl status postgresql
为什么不将备份脚本中的测试更改为类似这样的内容?
...
if systemctl is-active postgresql
then
echo "PostgreSQL is active in non-clustered mode"
# add here any pre-backup commands specific to non-clustered mode
elif systemctl is-active postgresqlHA
then
echo "PostgreSQL is active in HA mode"
# add here any pre-backup command specific to HA mode
else
echo "PostgreSQL backup FAILURE: PostgreSQL is not running." >&2
# add any commands to send a backup failure alert here if necessary
exit 69 # EX_UNAVAILABLE
fi
# commands to run the backup here
...
请注意,它systemctl status <service...>
主要是为交互式使用而设计的;对于脚本来说,systemctl is-active <service...>
还是systemctl is-failed <service>
可以更方便。如果列出多个服务,并且至少有一项服务满足条件,则命令将返回 0 结果代码。
如果您不需要关心正在运行哪个版本的服务,您甚至可以同时测试它们:
...
if ! systemctl is-active postgresql postgresqlHA
then
echo "PostgreSQL backup FAILURE: neither clustered or non-clustered service is running." >&2
exit 69 # EX_UNAVAILABLE
fi
# commands to run the backup here
...