问题描述
在运行 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。
希望以上解决方案能够帮助你解决问题!如果问题仍然存在,建议查看官方文档或社区支持以获取更多帮助。