标签: redis

如何处理Redis引发的内存碎片?

我有一个 Redis 3.0.5 实例,随着时间的推移,它往往会显示 mem_fragmentation_ratio 的增长。

使用该实例的应用程序不断地创建和删除密钥。

一个月后,我的结果是 mem_fragmentation_ratio > 1.30。这会影响 Redis 在该服务器上的内存占用:

~$ redis-cli info memory
# Memory
used_memory:7711297480
used_memory_human:7.18G
used_memory_rss:10695098368
used_memory_peak:11301744128
used_memory_peak_human:10.53G
used_memory_lua:95232
mem_fragmentation_ratio:1.39
mem_allocator:jemalloc-3.6.0
Run Code Online (Sandbox Code Playgroud)

如果我重新启动 Redis 服务并从 AOF 重新加载,mem_fragmentation_ratio 会回到可接受的水平 (1.06):

~$ redis-cli info memory
# Memory
used_memory:7493466968
used_memory_human:6.98G
used_memory_rss:7924920320
used_memory_peak:8279112992
used_memory_peak_human:7.71G
used_memory_lua:91136
mem_fragmentation_ratio:1.06
mem_allocator:jemalloc-3.6.0
Run Code Online (Sandbox Code Playgroud)

回收 Redis 正在影响我们的应用程序(即使我们在从服务器重启后使用 Sentinel 故障转移来执行此操作)。

是否有另一种方法可以减少 mem_fragmentation_ratio,例如我可以安排非高峰期的“碎片整理”过程?

fragmentation memory-usage redis

9
推荐指数
1
解决办法
8452
查看次数

如何在 Amazon Linux 2023 (AL2023) 上安装和配置 Redis 服务器?

根据 aws,Amazon Linux 2023 松散地基于 Fedora 34、35 和 36: https: //docs.aws.amazon.com/linux/al2023/ug/relationship-to-fedora.html

但是,redis该包在 AL2023 中不可用,而是redis6可用: https: //docs.aws.amazon.com/linux/al2023/release-notes/all-packages-al2023-20230322.html

我尝试使用它安装它sudo dnf -y install redis6并且安装成功。但我找不到任何 redis 配置文件。redis6已创建一个文件夹,并且可以使用该文件夹进行访问sudo cd /etc/redis6,但是该文件夹是空的并且没有任何配置文件。ls里面/etc/redis6没有返回任何东西。

在AL2023中安装redis服务器的正确方法是什么?

[UPDATE] ls命令未返回/etc/redis6文件夹内的任何文件,但配置文件实际上可用。使用sudo nano /etc/redis6/redis6.conf我能够更新现有的 redis 配置文件以使用 systemd 并设置密码。

所以redis服务器现在工作正常,只需要使用redis6而不是redisAL2023中的任何地方,例如redis6-cli.

fedora amazon-web-services redis amazon-linux aws-ec2

9
推荐指数
1
解决办法
8758
查看次数

如何在 ubuntu 上配置另一个 redis 实例?

我基本上想在 Ubuntu 上有 2 个 redis 实例。我查看了/etc/init.d/redis-server脚本并尝试创建一个指向另一个配置文件(新端口等)的新脚本(redis-server-dev),但它似乎不起作用。

正确的程序是什么?

谢谢

ubuntu installation service redis

8
推荐指数
2
解决办法
5786
查看次数

无法连接到安装在从 Windows 7 运行 Ubuntu 的 VirtualBox 上的 Redis

我已经在 Windows 7 主机上的 VirtualBox 上设置了一个 Ubuntu 映像。在 Ubuntu 客户机上,我安装了默认在端口 6379 (TCP) 上运行的 Redis。

我已经使用 VirtualBox GUI 为 SSH 设置了端口转发,并验证了通过连接到 localhost:2222 连接正确转发到端口 22 并且 SSH 工作。

但是,当我为端口 6379 完成相同的设置时,在连接端口 30000(设置为转发到 6379)时出现“telnet:无法连接到远程主机:连接被拒绝”错误。

为了验证 Redis 是否正确运行,我验证了我可以使用端口 6379(telnet localhost 6379)在本地(通过来宾计算机上的命令行)连接到 Redis 并成功对其运行命令。

对于为什么会发生这种情况,我有点不知所措。任何输入都会很棒。

ubuntu windows-7 virtualbox connection redis

8
推荐指数
2
解决办法
2万
查看次数

Redis不会关闭

大多数情况下,当我重新启动我的 Ubunutu 服务器时,我一遍又一遍地收到“等待 Redis 关闭……”的消息,并且在我强制重新启动之前它永远不会停止。什么可能导致这种情况?

我有http://godrb.com/监控 resque 保持运行,所以它可能与此有关。

ubuntu god redis

8
推荐指数
1
解决办法
2万
查看次数

如何将 dump.rdb 文件加载到 redis 中?

我有一个 dump.rdb 文件,它与 redis.config 位于同一目录中。

当我开始我的服务器时:

redis-server ./redis.config
Run Code Online (Sandbox Code Playgroud)

它不会加载该 1 GB 文件中的数据。

我如何加载这些数据?

linux unix redis

8
推荐指数
1
解决办法
3万
查看次数

如何为 start-stop-daemon 生成一个命令,如果它在超时期间没有终止,它将终止该进程?

我需要start-stop-daemon为一个 redis 实例运行一个,我希望它发送一个SIGTERM,如果 redis 实例没有退出,我希望它强制退出。

start-stop-daemon配置表示,该--retry选项可用于这一点,但我想不出一个办法做到这一点,这是我目前的命令:

/sbin/start-stop-daemon --stop --retry forever/TERM --quiet --oknodo --pidfile /var/run/redis/redis.pid --exec /usr/bin/redis-server
Run Code Online (Sandbox Code Playgroud)

关于我如何能够做到这一点的任何提示?

linux daemon redis start-stop-daemon

8
推荐指数
1
解决办法
9246
查看次数

Redis 高可用和负载均衡

我使用 Redis 有一段时间了,现在我们想迁移到一个容错、高可用和负载均衡的冗余集群。

我主要将 Redis 用于一些存储一些进程状态信息的 PHP Web 应用程序(我为此使用 PHPRedis),我也想将它用于负载平衡集群中的 PHP 会话存储。

我已经有一个用于 Nginx 和 MySQL 的负载平衡(基于 pfSense)。

我看到 Redis 集群存在于 Redis 3,但我也阅读了一些关于它尚未准备好用于生产这一事实的评论,其他评论则表明 Redis 无法进行完整的主/主集群配置。

你的建议是什么?

  • 尝试Redis集群
  • 转移到另一个键=值引擎(CouchDB?Memcached?其他?)
  • 不要介意负载平衡,每次只使用集群的一个节点,并进行手动故障转移,因为我不使用持久性
  • 其他想法?

非常感谢您的帮助!

cluster failover load-balancing redis

8
推荐指数
1
解决办法
3万
查看次数

对 Redis 停顿进行故障排除

我们在服务器上运行了几个 redis 实例。还有多个 Web 层服务器连接到同时遇到停顿的那些实例。

根据以下wireshark IO图,我们当时进行了数据包捕获,确定TX和RX流量均出现停滞:

在此处输入图片说明

在此处输入图片说明

redis 调用中有一个相关的峰值,但我怀疑这是一个结果,而不是由于时间滞后的原因:

在此处输入图片说明

以 15/s 的采样间隔(作为计数器收集),平均有 136 个内存分配停顿:

在此处输入图片说明

同时迁移的 NUMA 页面数量似乎也异常的多:

在此处输入图片说明

尽管以上看起来很正常,但与图中看到的其他 300 多个峰值相比,有两个连续的数据点使其异常。

内存压缩失败和压缩停顿也有相关的峰值:

在此处输入图片说明

在此处输入图片说明

虽然我这里有丰富的内存信息,但我的 Linux 内存知识还不够深入,无法真正假设一个好故事,将所有这些信息放在一起来解释停顿。任何拥有深厚的 Linux 内存知识(或许还有深厚的 redis 内存知识)的人都可以将其中的一些信息联系在一起吗?

我们每隔 15 秒从 /proc/vmstat 收集所有统计信息,因此如果您认为那里有任何数据可能会添加到其中,请提出请求。我只是挑选了一些似乎有有趣活动的东西,特别是 alloc 停顿、numa 迁移和压缩停顿/失败。总数如下,包括 20 天的正常运行时间:

[kbrandt@ny-redis01: ~] uptime
 21:11:49 up 20 days, 20:05,  8 users,  load average: 1.05, 0.74, 0.69
[kbrandt@ny-redis01: ~] cat /proc/vmstat
nr_free_pages 105382
nr_alloc_batch 5632
nr_inactive_anon 983455
nr_active_anon 15870487
nr_inactive_file 12904618
nr_active_file 2266184
nr_unevictable 0
nr_mlock 0
nr_anon_pages 16361259
nr_mapped 26329
nr_file_pages 15667318
nr_dirty …
Run Code Online (Sandbox Code Playgroud)

linux memory redis

8
推荐指数
1
解决办法
1357
查看次数

Redis 多主复制

场景:我们有两个同时运行的数据中心(都为流量提供服务)。
每个都有自己的整个基础架构堆栈,因此它可以在没有另一个启动的情况下运行。

也就是说,当网络条件允许时,我们希望我们的 Redis 数据库在两者之间同步。在网络分区期间丢失密钥是可以接受的,因为有重复的密钥 - 它只是缓存数据。但是,当两个数据中心都启动时(从 15-20% 的缓存命中率到 30-40% 的缓存命中率),我们从缓存中获得了最大的好处。

经过一番搜索,我找不到任何可以有效地为我们提供多主的东西。(主要是说“不要那样做”或“不支持”)。

最后,我编写了一个客户端,连接到两个主服务器,订阅数据库的键空间事件,然后在 DB 之间推送所有 SET 命令(我们所有的键都设置为过期)-带有一些内部“最近看到”的缓存以防止重播循环。

目前,这很好用 - 唯一真正的缺点是,在我们获得一个新的关键事件之后,我们必须发出一个 GETEX 来获取该密钥并且它已经过期 - 所以你最终会进行第二次读取(因此大约是 2 倍)远程 DC 的 RTT 延迟)。它也仅限于真正支持 SET。

我的问题是:有没有更好的方法来获得这种多主复制?

我开始研究 SYNC/PSYNC,但是关于这些协议的文档并不多,并且不确定客户端可能必须承担哪些义务才能不破坏服务器。

replication redis

8
推荐指数
1
解决办法
4947
查看次数