记一次 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]

你可能感兴趣的:(记一次 redis 调错经验 java.util.NoSuchElementException: Unable to validate object)