一.基本信息
Weblogic 10.3.6
Redis 2.8.19 (主从+哨兵)
二.问题描述
应用人员反应系统无法访问,weblogic日志中提示could not get a resource from the pool。
三. 原因分析
尝试重启redis和哨兵,发现启动不久后,哨兵侦测到redis主库down了,报错如下:
如是检查哨兵和redis配置,有些配置不合理,如两个redis实例写入的日志文件是同一个、主从设置没有写在从库的配置文件中、哨兵没有配置守护进程启动,对上面修改后,重启redis和哨兵,哨兵依然侦测到redis主库down了。
连入redis主库检查好像也正常,连入从库检查发现从库连接到主库是down状态,如下:
# Replication
role:slave
master_host:10.16.68.63
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1469869955
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
感觉问题有点怪,如是执行ps –ef|grep redis查看redis进程,进程中有出现一个rdpsave进程,这让我想到是否为磁盘空间不足引起了问题。检查磁盘空间如下:
df -h
/dev/mapper/vgapp-lvapp
99G 94G 198M100% /wlmsuat1
上面还有198M,但由于redis启用了rdp持久化,会每到触发时间点将内存全量快照一份到磁盘中,查看redis目前使用的内存大小如下:
# Memory
used_memory:964717248
used_memory_human:920.03M
used_memory_rss:978718720
used_memory_peak:965176104
used_memory_peak_human:920.46M
used_memory_lua:35840
mem_fragmentation_ratio:1.01
mem_allocator:jemalloc-3.6.0
查看rdp快照触发时间:
save 900 1
save 300 10
save 60 10000
只要符合上面一条规则就会触发全量rdp快照到磁盘,而磁盘才只有198M,无法完成rdpsave,而导致redis主进程阻塞。
四.解决方法
删除磁盘中weblogic的日志,释放近13G空间,如下:
df -h
/dev/mapper/vgapp-lvapp
99G 81G 13G 87% /wlmsuat1
并重启redis和哨兵服务后,观察3到5分钟,哨兵侦测到redis主库正常,应用启动后恢复正常。
连接从库,查看主从复制也恢复正常。
/wlmsuat1/redis/bin/redis-cli -p 6479
# Replication
role:slave
master_host:10.16.68.63
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:29
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
五.后续对redis的优化
1. 由于应用只需要用redis作缓存使用,并不需要持久化,所以可以将rdp停用,如下:
save ""
#save 900 1
#save 300 10
#save 60 10000
2. Redis配置文件中没有设置内存最大值,需要设置:
maxmemory 2g
3.OS磁盘需要排定crontab定期删除weblogic的日志