redis不断异常自动重启问题

问题:宕机重启后,业务部署日志报错无法访问redis

一、问题描述

  1. 首先查看redis状态,发现状态正常,本地尝试连接,watch命令每个2秒看redis状态,发现每隔20s左右,redis会自动重启

    (1)第一次查看redis状态
    root@white:~# systemctl status redis
    ● redis.service - Redis In-Memory Data Store
       Loaded: loaded (/etc/systemd/system/redis.service; enabled; vendor preset: enabled)
       Active: active (running) since Thu 2023-03-09 19:05:04 CST; 22s
     Main PID: 30028 (redis-server)
        Tasks: 6
       Memory: 980.6M
       CGroup: /system.slice/redis.service
               └─30028 /usr/local/bin/redis-server 0.0.0.0:6379
    
    Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
    
    (2)尝试本地连接,发现每隔20s左右会自动断开
    root@white:~# redis-cli -h 127.0.0.1
    
    (3)watch查看redis状态,发现redis每隔20s左右会重启
    root@white:~# watch systemctl status redis
    
  2. 查看redis日志有,两块异常内容

    root@white:~# tail -f /home/redis/var/log/redis.log
    ......
    19 Jun 2023 15:41:23.222 # WARNING overcommit_memory is set to O! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.vm.overcommit_memory = 1
    ......
    19 Jun 2023 15:49:39.577 # Bad file format reading the append only file: make a backup of your A0F file, then use ./redis-check-aof --fix <filename>
    

二、问题分析

  1. 关于redis不断重启,检查管理redis服务的systemd unit 文件,因为配置服务重启策略,说了redis服务是因为有异常退出,所以不会尝试重启

    root@white:~# cat /etc/systemd/system/redis.service
    [Unit]
    Description=Redis In-Memory Data Store
    After=network.target
    
    [Service]
    User=redis
    Group=redis
    ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
    ExecStop=/usr/local/bin/redis-cli shutdown
    Restart=always    # 指定了服务的重启策略。具体来说,它表示当服务异常退出时,systemd 会自动尝试重新启动该服务,直到服务正常退出为止。
    
    [Install]
    WantedBy=multi-user.target
    
  2. 分析异常日志

    异常日志一:
    19 Jun 2023 15:41:23.222 # WARNING overcommit_memory is set to O! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.vm.overcommit_memory = 1
    
    分析:
       这个日志主要是在警告系统的内存配置可能导致 Redis 后台保存数据时失败。具体来说,日志中提到了 overcommit_memory 参数被设置为 0,vm.overcommit_memory = 1 参数控制了 Linux 系统内存超额分配机制的行为。当这个参数被设置为 1 时,Linux 内核会拒绝分配超过系统可用内存的内存,从而防止系统因为内存不足而出现进程崩溃或者死锁等问题。在 Linux 系统中,如果 overcommit_memory 参数被设置为 0,那么当系统内存不足时,内核会尝试超额分配内存,这可能会导致 Redis 后台保存数据时失败,因此redis无法使用系统分配内存,因而出现异常,所以不断重启。
       为了解决这个问题,日志中建议将 vm.overcommit_memory 参数设置为 1。这个参数控制了系统内存超额分配机制的行为,当 vm.overcommit_memory 参数被设置为 1 时,内核会拒绝分配超过系统可用内存的内存,这可以避免 Redis 后台保存数据时失败的问题。
       日志中还提供了两种方法来修改 vm.overcommit_memory 参数,一种是将 vm.overcommit_memory = 1 添加到 /etc/sysctl.conf 文件中,并重启系统使其生效;另一种是使用 sysctl vm.overcommit_memory=1 命令来实时修改参数。
    
    异常日志二:
    19 Jun 2023 15:49:39.577 # Bad file format reading the append only file: make a backup of your A0F file, then use ./redis-check-aof --fix <filename>
    
    分析:
    	这个日志表示 Redis 在读取 AOF(Append-Only File)文件时遇到了格式错误,无法正确解析文件内容。这可能是由于 AOF 文件宕机重启已经损坏或者被修改导致的。
    日志中建议用户先备份 AOF 文件,然后使用 redis-check-aof 工具来检查和修复文件。具体来说,可以使用以下命令来修复 AOF 文件:
    	redis-check-aof --fix <filename>
    	其中 <filename> 是需要修复的 AOF 文件名。这个命令会检查 AOF 文件的格式并尝试修复错误,如果修复成功,就可以重新加载 AOF 文件来恢复 Redis 数据库状态。
        需要注意的是,修复 AOF 文件可能会导致一些数据丢失或者不一致,因此在执行修复操作之前一定要先备份好 AOF 文件,并在修复后检查数据的完整性和正确性。
    

三、问题处理

  1. 设置vm.overcommit_memory 参数为1

    root@white:~# sysctl vm.overcommit_memory=1
    root@white:~# sysctl -p
    
  2. 根据日志提示,备份后修复AOF文件

    (1)首先查找修复命令
    root@white:~# find / -name "redis-check-aof"
    (2)查找AOF文件
    root@white:~# find / -name "*.aof"
    (3)备份原AOF文件
    root@white:~# cp -a appendonly.aof appendonly.aof.bak.$(date +"%Y%m%d")
    (4)修复原文件
    root@white:~# redis-check-aof appendonly.aof
    
  3. 重启redis

    root@white:~# systemctl restart redis
    
  4. 检查是否没有不断重启,并且业务也反馈可以正常连接

四、问题优化

  1. 使vm.overcommit_memory=1永久生效

    (1)在 /etc/sysctl.conf 追加配置
    root@white:~# echo "vm.overcommit_memory=1"  >> /etc/sysctl.conf
    (2)运行以下命令重新加载 sysctl.conf 文件,永久设置为系统的默认值
    root@white:~# sysctl -p
    (3)通过下面命令检查是否成功设置,如果输出为 1,则说明选项已成功设置。
    root@white:~# cat /proc/sys/vm/overcommit_memory
    
  2. 关于AOF文件损坏问题,定期备份 AOF 文件。这样,如果 AOF 文件损坏,您可以使用备份文件来恢复 Redis 数据。防止出现fix无法修复的情况

<think>嗯,用户想了解Redis重启的相关内容。首先,我需要确定用户可能的需求。重启Redis通常是因为配置更改、故障恢复或者维护需要。用户可能遇到了问题,需要重启服务,或者只是提前了解步骤以备不时之需。 接下来,我应该分步骤介绍如何正确重启Redis。考虑到用户可能在不同环境下操作,比如Linux系统,使用systemctl或者直接通过命令行。需要详细说明每个步骤,避免遗漏关键点,比如保存数据、关闭和启动服务的命令。 还要注意数据持久化的问题。如果Redis没有正确配置持久化,重启可能导致数据丢失,这一点必须提醒用户。需要提到SAVE或BGSAVE命令,以及配置文件中的选项,比如appendonly和save参数。 另外,用户可能关心重启后的验证步骤,比如检查服务状态和连接情况。这部分也不能少,确保用户知道如何确认Redis是否成功重启。 潜在的问题方面,比如长时间关闭导致客户端连接问题,或者配置错误导致服务无法启动,这些都需要提前预警,帮助用户避免常见陷阱。最后,安全重启的建议,比如在低峰期操作,备份数据,都是用户可能需要的实用提示。 需要确保整个回答结构清晰,步骤明确,同时用中文口语化表达,避免技术术语过于晦涩。检查每个步骤的正确性,比如systemctl命令的正确顺序,配置文件的路径是否正确,这些细节都要准确无误。可能还需要区分不同情况,比如是否使用systemd,或者直接运行redis-server的情况,但大多数现代系统都用systemd,所以重点放在这上面。 还要注意用户可能的权限问题,比如执行命令是否需要sudo,这在步骤中要提示用户,避免他们遇到权限错误。同时,在数据持久化部分,要解释配置参数的作用,让用户理解为什么这些设置重要。 最后,总结安全重启的建议,帮助用户形成良好的操作习惯,减少数据丢失的风险。整个过程要保持逻辑连贯,覆盖用户可能需要的各个知识点,确保回答全面且有帮助。</think>Redis 重启操作指南及注意事项 (结构清晰版) 一、Redis重启的两种典型场景 1. 计划性重启 - 应用场景:配置修改、版本升级、服务器维护 - 特点:可预先通知客户端,选择业务低峰期操作 2. 故障性重启 - 应用场景:服务崩溃、内存溢出、数据异常 - 特点:需紧急处理,存在数据丢失风险 二、标准重启步骤(Linux系统示例) 1. 安全停止服务 ```bash # 使用systemctl停止(推荐) $ sudo systemctl stop redis # 或使用redis-cli停止 $ redis-cli shutdown ``` 2. 启动服务验证 ```bash $ sudo systemctl start redis $ systemctl status redis # 检查运行状态 $ redis-cli ping # 返回PONG表示正常 ``` 三、关键注意事项 1. 数据持久化保障 - 执行`SAVE`命令前强制落盘: ```bash $ redis-cli save # 同步保存(阻塞式) 或 $ redis-cli bgsave # 后台保存(非阻塞) ``` - 检查配置文件: ```conf appendonly yes # 启用AOF持久化 save 900 1 # RDB快照策略 ``` 2. 连接中断处理 - 客户端应实现重连机制(指数退避算法) - 监控`ERR Error: Connection reset by peer`错误 3. 配置变更生效 ```bash # 修改redis.conf后需重启生效 $ sudo systemctl restart redis ``` 四、故障排查清单 1. 启动失败常见原因: - 端口冲突(默认6379) - 权限问题(/var/lib/redis目录) - 内存超限(检查maxmemory配置) - 持久化文件损坏(修复RDB/AOF文件) 2. 日志分析命令: ```bash $ journalctl -u redis -n 100 -f # 实时追踪日志 ``` 五、生产环境最佳实践 1. 高可用方案: - 使用Redis Sentinel实现自动故障转移 - 部署Redis Cluster分片集群 2. 灰度重启策略: ```bash # 逐个节点重启(集群环境) $ redis-cli -h <node-ip> -p <port> shutdown nosave ``` 3. 性能指标监控: ```bash $ redis-cli info stats | grep uptime_in_seconds $ redis-cli info persistence # 持久化状态 ``` 六、进阶技巧 1. 热配置加载(无需重启): ```bash $ redis-cli config set maxmemory 4GB ``` 2. 内存碎片整理: ```bash $ redis-cli memory purge # 需要Redis 4.0+ ``` 建议在重启前执行`redis-cli info`获取当前状态快照,重启后对比关键指标(连接数、内存用量、持久化状态)。对于容器化部署环境,需特别注意持久化卷的挂载配置。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值