在生产环境中配置Redis + Sidekiq

4
我正在尝试在Passenger/Rails生产环境中设置Redis + Sidekiq,并遇到了一些困惑。服务器上有许多规模较小的应用程序,我确信其中不止一个应用程序将利用Sidekiq提供的延迟处理功能。我的第一个想法是使用Sidekiq中的命名空间选项为每个Rails应用程序创建一个命名空间。但是我注意到redis.conf中有一个databases 16设置,我想知道它究竟是做什么的。除了配置文件中的注释外,我似乎找不到关于它的文档:
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16

所以,想知道默认/示例的16个“数据库”是否意味着我可以将DB0用于一个应用程序,将DB1用于另一个应用程序?!?我不认为这种假设是正确的,但我除了以下信息外找不到更多信息:

Redis集群不支持像独立版Redis那样的多个数据库,只有一个数据库0,不允许使用SELECT。

希望有人能告诉我如何在同一服务器上运行的各种Rails应用程序之间共享Sidekiq和Redis。
3个回答

5
你可以在单台机器上为每个Rails应用关联多个Redis数据库。你可以在initializers目录下创建一个名为sidekiq.rb的文件,并加入以下代码:
app_name = Rails.application.class.parent_name

app_num = case app_name
  when 'AppOne'
    0
  when 'AppTwo'
    1
  when 'AppOne'
    2
  end

Redis.new(db: app_num) # existing DB is selected if already present

Sidekiq.configure_server do |config|
  config.redis = { url: "redis://localhost:6379/#{app_num}", namespace: "#{app_name}" }
end

Sidekiq.configure_client do |config|
  config.redis = { url: "redis://localhost:6379/#{app_num}", namespace: "#{app_name}" }
end

以此方式,您可以通过 Sidekiq 进程将 Redis 数据库和命名空间分离出来。

这很好,但最好从环境变量中获取“app_num”。即 app_num = ENV ['REDIS_DB_NUM'] || 0 - asgeo1

2
我想您需要查找命名空间。您可以使用sidekiq配置服务器/客户端配置,以使用不同的命名空间,并配置Passenger/Unicorn使用不同的命名空间。我已经在Unicorn上完成了此操作,但是在Passenger中应该有一个等效的选项。
您可以在这里找到如何做到这一点的文档。

请原谅我的无知,但为什么要涉及Passenger/Unicorn呢?(顺便说一下,我的生产环境使用Passenger) - Meltemi
如果您查看我提供的文档,您需要在Unicorn的after_fork回调中添加一个代码块。我不知道是否存在与Passenger相当的等效物。 - d_ethier

0

databases 16 in redis.conf 简单地设置 Redis 实例具有的最大数据库数量 (0-15)。如有需要,您可以更改它。我正在使用 Redis DB0 进行 Rails 缓存和 DB1 用于 Sidekiq(除了使用命名空间)。这只是为了使 FLUSHDB 更加清晰。

在您的情况下,我建议为不同的应用程序使用单独的 Redis 数据库。如果需要,只需增加数据库的数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接