Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | https://vearne.cc

1. 起因

萌叔手上有一个测试用的Redis集群,集群是Master-slave模式,
平常也不怎么使用。 于是打算清理释放一下内存,打算降低一下配置。

使用FLUSHALL

FLUSHALL

可以看到所有的key都已经被清空

> info Keyspace
# Keyspace

查看内存开销情况

> info memory
# Memory
used_memory:537921192
used_memory_human:513.00M
used_memory_rss:544067584
used_memory_rss_human:518.86M
used_memory_peak:650406864

实例的内存开销超过500MB,内存让狗吃了?

2. 排查

# Memory
used_memory:537921192
used_memory_human:513.00M
used_memory_rss:544067584
used_memory_rss_human:518.86M
used_memory_peak:650406864
used_memory_peak_human:620.28M
used_memory_peak_perc:82.71%
used_memory_overhead:537863648
used_memory_startup:791600
used_memory_dataset:57544
used_memory_dataset_perc:0.01%
allocator_allocated:537984728
allocator_active:538705920
allocator_resident:548462592
total_system_memory:201219264512
total_system_memory_human:187.40G
used_memory_lua:40960
used_memory_lua_human:40.00K
used_memory_scripts:216
used_memory_scripts_human:216B
number_of_cached_scripts:1
maxmemory:1073741824
maxmemory_human:1.00G
maxmemory_policy:allkeys-lru
allocator_frag_ratio:1.00
allocator_frag_bytes:721192
allocator_rss_ratio:1.02
allocator_rss_bytes:9756672
rss_overhead_ratio:0.99
rss_overhead_bytes:-4395008
mem_fragmentation_ratio:1.01
mem_fragmentation_bytes:6229608
mem_not_counted_for_evict:0
mem_replication_backlog:536870912  // 约为512MB
mem_clients_slaves:16922
mem_clients_normal:183998
mem_aof_buffer:0
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0

# Replication
role:master
connected_slaves:1
slave0:ip=192.168.88.29,port=9981,state=online,offset=23482674189,lag=0
master_replid:b58677283938996fdae00f7692d24d11d88ff488
master_replid2:effdd3cd4ab2030a2d49273e0cf2ed74df4bccb9
master_repl_offset:23482674347
second_repl_offset:17046600529
repl_backlog_active:1
repl_backlog_size:536870912   // 约为512MB
repl_backlog_first_byte_offset:22945803436
repl_backlog_histlen:536870912

# Cluster
cluster_enabled:0

# Keyspace

将INFO命令返回的所有内容都交给chatGPT分析,笔者找到了答案,主要原因是复制积压缓冲区设置的过大。

什么是复制积压缓冲区?

复制积压缓冲区(Replication Backlog) 是 Redis 主从复制机制中的一个关键组件。
当主节点有从节点连接时,主节点会维护一个固定大小的环形缓冲区,用于保存最近写入的命令。
这个缓冲区的主要作用是支持从节点在短暂断开后快速重新同步,而不需要进行完整的同步过程,从而提高复制的效率和稳定性。

默认情况下,Redis 的复制积压缓冲区大小为 1MB。但在这个配置中,这个值被设置为 512MB。

3. 处理

3.1 临时调整,重启后失效

CONFIG SET repl-backlog-size 52428800

3.1 永久设置

在配置文件中添加并重启实例

repl-backlog-size 50mb

微信公众号

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据