使用Sidekiq来利用Redis
使用Sidekiq来使用Redis。
最后更新:2018/10/20 编辑者迈克·佩雷姆
Sidekiq会将所有数据保存在Redis中。
默认情况下,Sidekiq会尝试连接到 localhost:6379 上的Redis。在开发中,这个配置可以正常工作,但是在生产环境中需要进行一些调整。
使用环境变量 ENV
可以使用环境变量来设置Redis URL。这样,Heroku就可以非常轻松地配置Sidekiq了。
请使用环境变量REDIS_PROVIDER作为Redis服务器的URL。这样,Sidekiq将使用该值连接到Redis。
heroku config:set REDIS_PROVIDER=REDISTOGO_URL
此外,还可以使用通用环境变量 REDIS_URL。
使用初始化函数
请注意,需要同时指定 Sidekiq.configure_server 和 Sidekiq.configure_client。请将以下代码写入 config/initializers/sidekiq.rb 文件中。
Sidekiq.configure_server do |config|
config.redis = { url: 'redis://redis.example.com:7372/0' }
end
Sidekiq.configure_client do |config|
config.redis = { url: 'redis://redis.example.com:7372/0' }
end
注意:将记录的参数直接传递给Redis客户端。
注意2:参数的键必须是符号。
完全掌控关系网
如果使用redis-failover或Redis Sentinel等工具,您可以在提前将连接传递给Sidekiq。
redis_conn = proc {
Redis.new # do anything you want here
}
Sidekiq.configure_client do |config|
config.redis = ConnectionPool.new(size: 5, &redis_conn)
end
Sidekiq.configure_server do |config|
config.redis = ConnectionPool.new(size: 25, &redis_conn)
end
请注意连接池的大小。需要为每个进程执行的线程数提供足够的连接数。连接将根据需要创建,如果需要的数量不确定,也可以指定更大的大小(例如:20〜30)。Sidekiq服务器至少需要(并发数+5)个连接。
在云环境中使用Sidekiq
在像EC2和Heroku这样的基于云的系统中,网络性能的不可预测性可能会引发问题。如果在这些环境中出现超时错误,需要稍微调整网络超时时间。默认设置为1秒。
config.redis = { url: 'redis://...', network_timeout: 5 }
重要提醒:此超时设定只是权宜之计,请注意它并非解决性能下降的根本解决方案。
如果出现Redis超时错误,请使用redis-cli –latency或–latency-history选项来检查Redis的延迟。
$ redis-cli --latency-history localhost
min: 0, max: 1, avg: 0.20 (1359 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.18 (1356 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.18 (1355 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.17 (1359 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.19 (1358 samples) -- 15.00 seconds range
min: 0, max: 1, avg: 0.18 (1353 samples) -- 15.01 seconds range
min: 0, max: 1, avg: 0.19 (1357 samples) -- 15.01 seconds range
通过上述结果,我们可以看出连接到在localhost上运行的redis服务器的平均延迟为0.2ms或200微秒,这是一个很棒的结果。
根据用户的环境,延迟可能会定期超过5秒,这是一个糟糕的结果。
在这种糟糕的网络性能下,Sidekiq无法做任何事情。您可以考虑切换到另一个Redis提供商或在专用机器上运行自己的Redis服务器。
您可以联系Redis提供商,询问可用的选项。
禁用CLIENT命令
出于安全原因(以防止意外的CLIENT KILL等),一些Redis服务器禁用了所有的CLIENT命令。
在这种情况下,您可以将id选项设置为nil以禁用Sidekiq的CLIENT SETNAME命令。
config.redis = { url: 'redis://...', id: nil }
架构
在Redis中,可以使用多种不同的拓扑结构。
単一ノード フォールトトレランスを提供しません
Redis Sentinel フォールトトレランスを提供し、プライマリ障害が発生した場合にレプリカにフェールオーバーします
Redis Cluster 多くのインスタンスにまたがるマルチマスターキースペース
集群设计用于大规模的数据集,比如缓存数据等,可平均分布在整个机器上。
由于Sidekiq始终有一些经常变化的非常热门的键值(即队列),所以集群对Sidekiq来说不适用。
我们建议使用Sentinel或使用内置故障转移支持的Redis SaaS。
调音
你可以使用redis-cli info命令来检查Redis可用的设置。
存储
为了确保Redis不会默默丢弃Sidekiq的数据,需要在redis.conf中设置maxmemory-policy noeviction。这样,Redis在所有数据都能完全存储在内存时将能发挥最佳性能。
多个Redis实例
很多人会将Redis用作缓存(在Rails缓存存储中能很好地工作),而在使用Redis实例作为持久化存储的同时运行Sidekiq是很重要的。
如果同时在缓存和Sidekiq中使用Redis,建议为每个用途配置适当的两个不同Redis实例。
由于Redis的命名空间无法配置此设置,并且可能伴随许多其他问题,所以最好使用单独的Redis实例。
暂停
Redis最常见的网络超时原因如下所示。
-
- 当RAM交换不足时,磁盘交换会引起较长的延迟峰值。由于使用Redis来存储缓存数据可能需要大量的RAM,因此请根据需要配置Sidekiq以使用另一个Redis实例。
Redis命令的等待时间可能会非常长。请阅读有关监控的博客文章。
笔记
redis-cli –help を見てください。–latency-history や –bigkeysなど、いくつかの便利なオプションが表示されるでしょう。
redis-rdb-toolsには、ダンプされたRDBファイルを調査するためのいくつかのオプションがあります。
Monitoring Redisでは、Redisを使用するときに監視する必要がある最も重要な事項を扱います。
Datadogには、Redisの内部と監視に関する素晴らしいホワイトペーパーがあります。
BRPOPLPUSHおよびその他のB*コマンドは ブロッキング です。 それらのコマンドによる大きなレイテンシスパイクは 正常 であり、特に問題はありません。