Sidekiq 心跳测试失败,正在重启

你好!我在管理后台发现了一个奇怪的错误,显示 Sidekiq 未运行。
我查看了日志,发现数百条类似以下的错误:

/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.5.1/lib/logster/logger.rb:112:in `report_to_store'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.5.1/lib/logster/logger.rb:103:in `add_with_opts'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.5.1/lib/logster/logger.rb:54:in `add'
/usr/local/lib/ruby/2.6.0/logger.rb:534:in `warn'
config/unicorn.conf.rb:147:in `check_sidekiq_heartbeat'
config/unicorn.conf.rb:164:in `master_sleep'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.2/lib/unicorn/http_server.rb:296:in `join'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.2/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `<main>'

以下是来自应用的错误信息:

run-parts: executing /etc/runit/1.d/00-ensure-links
run-parts: executing /etc/runit/1.d/00-fix-var-logs
run-parts: executing /etc/runit/1.d/anacron
run-parts: executing /etc/runit/1.d/cleanup-pids
Cleaning stale PID files
run-parts: executing /etc/runit/1.d/copy-env
run-parts: executing /etc/runit/1.d/letsencrypt
[Wed 01 Jan 2020 10:40:41 AM UTC] Domains not changed.
[Wed 01 Jan 2020 10:40:41 AM UTC] Skip, Next renewal time is: Tue Feb 25 00:52:11 UTC 2020
[Wed 01 Jan 2020 10:40:41 AM UTC] Add '--force' to force to renew.
[Wed 01 Jan 2020 10:40:41 AM UTC] Installing key to:/shared/ssl/discourse.example.com.key
[Wed 01 Jan 2020 10:40:41 AM UTC] Installing full chain to:/shared/ssl/discourse.example.com.cer
[Wed 01 Jan 2020 10:40:41 AM UTC] Run reload cmd: sv reload nginx
warning: nginx: unable to open supervise/ok: file does not exist
[Wed 01 Jan 2020 10:40:41 AM UTC] Reload error for :
[Wed 01 Jan 2020 10:40:42 AM UTC] Domains not changed.
[Wed 01 Jan 2020 10:40:42 AM UTC] Skip, Next renewal time is: Wed Jan  8 00:39:10 UTC 2020
[Wed 01 Jan 2020 10:40:42 AM UTC] Add '--force' to force to renew.
[Wed 01 Jan 2020 10:40:42 AM UTC] Installing key to:/shared/ssl/discourse.example.com_ecc.key
[Wed 01 Jan 2020 10:40:42 AM UTC] Installing full chain to:/shared/ssl/discourse.example.com_ecc.cer
[Wed 01 Jan 2020 10:40:42 AM UTC] Run reload cmd: sv reload nginx
warning: nginx: unable to open supervise/ok: file does not exist
[Wed 01 Jan 2020 10:40:42 AM UTC] Reload error for :
Started runsvdir, PID is 628
chgrp: invalid group: ‘syslog’
rsyslogd: imklog: cannot open kernel log (/proc/kmsg): Operation not permitted.
rsyslogd: activation of module imklog failed [v8.1901.0 try https://www.rsyslog.com/e/2145 ]
supervisor pid: 633 unicorn pid: 647

我尝试清空 Redis 数据库,但并无帮助。
我使用了独立的容器来运行应用、PostgreSQL 和 Redis。
请问有什么解决建议吗?

1 个赞

Sidekiq 是否已暂停?队列中的作业数量是否在不断增加?

3 个赞

默认队列中显示有 2 个任务,均为 Jobs::VersionCheck
清除 Redis 数据库后,显示已完成任务 0 个,失败任务 0 个,已排队任务 2 个。

调度器页面显示部分任务处于排队或运行状态,但这些任务并未计入 Sidekiq 页面的统计中。调度器页面上的所有任务持续时间为空或 -1 毫秒。

因此,数字没有变化,实际上没有任何变动。
如何检查 Sidekiq 是否已暂停?

1 个赞

同样的问题出现在最新版本更新后,除了通过重建进行更新外没有任何其他更改,管理面板显示 Sidekiq 未运行。我将 PostgreSQL 和 Redis 放在一个容器中,应用放在另一个容器中,并且已经再次重启了所有容器。队列中有几百条任务,但没有任何处理。

编辑1:清空所有队列并没有解决问题或带来任何帮助,队列又开始填充,但仍然没有处理。

编辑2:重新构建了论坛,经历了所有相关的停机时间,但依然显示此消息:

并且 /sidekiq 中的队列也没有处理。在从 beta7 更新到 2.4.0.beta9 之前,一切运行正常。

编辑3:可用空间超过 50GB。手动运行备份(接近 300MB)成功完成,系统显示暂停和恢复 Sidekiq,日志中未报告任何错误,但 Sidekiq 似乎仍未运行?

编辑4:/logs 中唯一值得注意的日志是不断重复的 Sidekiq heartbeat test failed, restarting

编辑5:Redis 似乎正常运行,至少它的日志文件正忙着显示它没什么可做的……为了明确起见:

[3] pry(main)> Sidekiq.paused?
=> false

编辑6:我稍早前清除了队列,现在又有 10 个任务排队但未处理。

编辑7:发现 bundle exec sidekiq 是在普通项目中启动 Sidekiq 的常规方式,所以让我们尝试运行它看看会发生什么:

root@vps198273-forum:/var/www/discourse# bundle exec sidekiq
2020-01-06T05:10:18.814Z pid=31242 tid=gn383wxbu INFO: Booting Sidekiq 6.0.4 with redis options {:host=>"forum-data", :port=>6379, :namespace=>"sidekiq", :id=>"Sidekiq-server-PID-31242", :url=>nil}
You are connecting to Redis v3.0.6, Sidekiq requires Redis v4.0.0 or greater
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-6.0.4/lib/sidekiq/cli.rb:62:in `run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-6.0.4/bin/sidekiq:12:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-6.0.4/lib/sidekiq/cli.rb:62:in `run'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/sidekiq-6.0.4/bin/sidekiq:12:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/sidekiq:23:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/sidekiq:23:in `<top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/lib/bundler/cli.rb:476:in `exec'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/lib/bundler/vendor/thor/lib/thor.rb:399:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/lib/bundler/vendor/thor/lib/thor/base.rb:476:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/exe/bundle:46:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/lib/bundler/friendly_errors.rb:123:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.6.0/gems/bundler-2.1.1/exe/bundle:34:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'

您正在连接 Redis v3.0.6,但 Sidekiq 需要 Redis v4.0.0 或更高版本

嗯,这看起来很有趣?让我们尝试重建数据容器,并祈祷不要碰到数据,哈哈……

编辑8:看来 Redis 正在运行 5.0.5 版本(为什么这里不使用 PostgreSQL 的 pubsub 功能呢?),这肯定高于 4.0.0……重建已完成,测试论坛,数据似乎仍然存在,并且我们看到了一个峰值!


看起来已修复!也许这篇帖子会对某些人有帮助。我希望论坛能直接告诉我 Sidekiq 报错说 Redis 版本过旧,但我猜这些日志可能只是被丢到某个地方去了,因为我没在任何地方看到它们。:slight_smile:

4 个赞

这是一项非常出色的排查工作,希望它能帮助到其他人。

5 个赞

你是怎么得到这个古老版本的 Redis 的?你是否使用了非标准安装?

2 个赞

我使用的是多容器架构,从未重建过 Redis。
我会尝试重建 Redis。

更新:
@OvermindDL1,感谢提供的解决方案。我重建了 Redis 容器,现在一切正常。

Sidekiq 是一个后台任务库,它依赖 Redis。它非常优化且成熟,但仅支持 Redis 后端。
我也认为 message_bus(Discourse 的实时功能)在底层使用了 Redis。

2 个赞

按照说明使用标准的 Docker 拆分容器安装(以便我可以构建新版本的 Discourse,然后快速切换它们以实现零停机),但我没有碰数据容器,而 Redis 显然是在那里运行的(我原以为它会在主容器中,当我在主容器中找不到它运行时,我很惊讶)。

没错,我和 @arrowcircle 的情况完全一样。:slight_smile:

2 个赞

在双容器配置中,您仍然需要重建数据容器,建议您至少每年安排一次重建。

4 个赞

那有什么方法可以在不中断服务的情况下完成吗?这正是当初将它们分离出来的初衷。

1 个赞

要实现零停机,您需要运行 Redis 副本和数据库副本。在故障转移过程中,您仍然会经历短暂的只读阶段。

是的,这些功能都是可行的,但您需要组建一个基础设施团队。

3 个赞

这里所有内容都是开源的,不收费。^_^;

1 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.