解决 Ansible Playbook 启动 Apache Cassandra 失败问题

65次阅读
没有评论

问题描述

在运行 Ansible Playbook 时,对 cassandra.yml 文件进行了更改后,当服务尝试启动时,出现了以下错误:

● cassandra.service - LSB: distributed storage system for structured data
   Loaded: loaded (/etc/rc.d/init.d/cassandra; bad; vendor preset: disabled)
   Active: failed (Result: exit-code) since sex 2021-04-02 01:06:05 UTC; 15min ago
   Docs: man:systemd-sysv-generator(8)
   Process: 5052 ExecStop=/etc/rc.d/init.d/cassandra stop (code=exited, status=1/FAILURE)
   Process: 4883 ExecStart=/etc/rc.d/init.d/cassandra start (code=exited, status=0/SUCCESS)
   Main PID: 4972 (code=exited, status=3)
abr 02 01:05:37 ip-10-5-10-195.ec2.internal cassandra[4883]: Starting Cassandra: OK
abr 02 01:05:37 ip-10-5-10-195.ec2.internal systemd[1]: Started LSB: distributed storage system for structured data.
abr 02 01:05:40 ip-10-5-10-195.ec2.internal systemd[1]: cassandra.service: main process exited, code=exited, status=3/NOTIMPLEMENTED
abr 02 01:05:40 ip-10-5-10-195.ec2.internal runuser[5063]: pam_unix(runuser:session): session opened for user cassandra by (uid=0)
abr 02 01:05:40 ip-10-5-10-195.ec2.internal cassandra[5052]: Shutdown Cassandra: kill: sending signal to 4972 failed: No such process
abr 02 01:05:40 ip-10-5-10-195.ec2.internal runuser[5063]: pam_unix(runuser:session): session closed for user cassandra
abr 02 01:06:05 ip-10-5-10-195.ec2.internal cassandra[5052]: ERROR: could not stop cassandra
abr 02 01:06:05 ip-10-5-10-195.ec2.internal systemd[1]: cassandra.service: control process exited, code=exited status=1
abr 02 01:06:05 ip-10-5-10-195.ec2.internal systemd[1]: Unit cassandra.service entered failed state.
abr 02 01:06:05 ip-10-5-10-195.ec2.internal systemd[1]: cassandra.service failed.

在 cassandra.yml 文件中,他仅更改了 Cassandra 存储数据的挂载点/路径。

此外,他在 Cassandra 的 system.log 中还发现了以下错误:

ERROR [main] 2021-04-05 16:57:34,074 CassandraDaemon.java:822 - Exception encountered during startup
java.lang.ExceptionInInitializerError: null
    at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:240)
    at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:676)
    at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:800)
Caused by: java.lang.IllegalStateException: Failed to mkdirs /hints; unable to start server
    at org.apache.cassandra.config.DatabaseDescriptor.createAllDirectories(DatabaseDescriptor.java:1395)
    at org.apache.cassandra.db.commitlog.CommitLog.<init>(CommitLog.java:95)
    at org.apache.cassandra.db.commitlog.CommitLog.construct(CommitLog.java:78)
    at org.apache.cassandra.db.commitlog.CommitLog.<clinit>(CommitLog.java:65)
    ... 3 common frames omitted

尽管他在新的挂载点上使用了 cassandra:cassandra 权限创建了目录,但仍然出现了此错误。

解决方案

请注意以下操作可能涉及到版本差异或风险,进行操作前请做好备份。

解决方案 1

根据最佳回答,需要在 Systemd 中定义一个 cassandra.service 文件,以便管理 Cassandra。按照以下步骤进行调整:
1. 创建一个 cassandra.service 文件,路径为 /etc/systemd/system/cassandra.service
2. 根据你的安装情况,进行以下调整:

[Unit]
Description=Cassandra Cluster Node Daemon

[Service]
Type=forking
User=cassandra
ExecStartPre=/usr/bin/echo "Starting Cassandra Daemon"
ExecStart=/usr/sbin/cassandra
ExecStartPost=/usr/bin/echo "Cassandra Daemon Running"
ExecStopPost=/usr/bin/rm -rf /cassandra/saved_caches;/usr/bin/echo "Cassandra Daemon Stopped"
SuccessExitStatus=143

[Install]
WantedBy=default.target

解决方案 2

如果解决方案 1 未能解决问题,你还可以尝试以下方法:
使用脚本或工具手动控制启动顺序,以确保 Cassandra 在正确的顺序下启动。这可能会涉及到一些复杂性,但是这种方法可以更好地控制容器的启动顺序。

一个简单的脚本示例如下:

#!/bin/bash
# 启动 Cassandra
/usr/sbin/cassandra
# 等待 Cassandra 启动完全
while ! docker exec cassandra echo "Cassandra is ready"; do
  sleep 1
done
# 启动其他服务
# ...

在这个脚本示例中,首先使用 /usr/sbin/cassandra 命令启动 Cassandra。然后,使用一个循环来等待 Cassandra 完全启动。一旦 Cassandra 就绪,你可以继续启动其他服务。

以上解决方案提供了两种尝试解决问题的方法。你可以先尝试解决方案 1,如果问题仍然存在,再考虑尝试解决方案 2。

希望以上解决方案能够帮助你解决问题!如果问题仍然存在,建议查看官方文档或社区支持以获取更多帮助。

正文完