记一次 redis 调错经验 java.util.NoSuchElementException: Unable to validate object

[size=large]
运行正常的redis集群,在今早爆出 连串错误。
先是 拒绝连接:
排查过程:
范围猜测
1 怀疑服务器断电重启导致端口被防火墙校验
2 端口被其他进程占用
3 内存不足
4 IP段切换造成

过程:
关闭防火墙 检查redis读写是否能够正常访问  正常
netstat 检查端口占用 无占用
查看内存  因为使用的redis是3.2.9 版本,鉴于redis copy-on-write特性,内存应该占用不大
IP 分段测试,多台服务器检测。

一轮排查下来 范围大致圈定在redis服务器本身。

续查:给指定的问题redis 指定日志 具体配置redis.conf
 loglevel notice
logfile /opt/server/redis-3.2.9/redis.log 


注意要把不相干的日志配置注释 以免干扰,发现无异常。怀疑是redis.conf bind参数问题,因为后期有新机器接入 IP段混乱。 为避免干扰 直接注释掉此参数。
 
  现在允许访问。

  但是后续问题继续出现,允许访问一段时间(几分钟)之后,停止对外服务,报错为     java.util.NoSuchElementException: Unable to validate object 
 
随即排除用户名密码问题和redis服务本身问题。
继续观察日志 发现在停止访问的过程中  不断有进程尝试对内存数据进行持久化。日志提示open file有限制
怀疑:
1 连接超时
2 文件句柄太小
3 文件写入异常

过程:
  增加 timeout 时间,进行调试,
  增加ulimit -n 限制 进行测试 此时报错改为 RDB文件写入有问题。
  随即修改rdb持久化文件配置
 
dir /tmp/redis_data  
#./->/tmp/redis_data
dbfilename temp.rdb
#
  

操作指令:

  sudo mkdir /tmp/redis_data
  sudo touch temp.rdb
 

进行测试  发现日志提示  不允许自己创建temp.rdb文件,随即删除该文件
测试 ,报错修改为 写入文件权限不足,随即修改文件路径权限。
测试 正常,一段时间后 仍然正常写入。
问题解决。


  
[/size]

猜你喜欢

转载自annan211.iteye.com/blog/2377865