处理应用端连接redis报could not get a resource from the pool问题

时间:2022-12-24 13:55:31

一.基本信息

  Weblogic 10.3.6

  Redis 2.8.19 (主从+哨兵) 

二.问题描述

  应用人员反应系统无法访问,weblogic日志中提示could not get a resource from the pool。

. 原因分析

  尝试重启redis和哨兵,发现启动不久后,哨兵侦测到redis主库down了,报错如下:

处理应用端连接redis报could not get a resource from the pool问题

如是检查哨兵和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 198M 100% /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和哨兵服务后,观察35分钟,哨兵侦测到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的日志