Technical posts/Weblogic

WAS 에서 DB로 접속 불가 java.sql.SQLRecoverableException: IO Error: Connection reset

ODB 2014. 9. 22. 00:54

WAS에서 java.sql.SQLRecoverableException: IO Error: Connection reset 가 발생한다


장애상황


WAS1, WAS2가 있는데

WAS2에서는 batch작업이 빠르게 잘돌고

WAS1에서는 batch작업이 느리고

JEUS에서 커넥션풀 초기화시 접속 문제가 간헐적으로 발생합니다 (접속불가 현상)



원인분석


sqlplus이용한 접속 connection loss는 발생하지 않음

tnsping 이용시 ping에 문제는 없음

JEUS엔지니어와 통화, DB에서 접속을 끊는 것 같다는 의견과 함께 아래 오류메시지 확인

오류내용 java.sql.SQLRecoverableException: IO Error: Connection reset



문제해결


java.sql.SQLRecoverableException: IO Error: Connection reset


기본적으로는 DB와 접속이 문제가 있을때 발생하나 이번장애의 문제점은 아래와 같았다


11g JDBC 드라이버는 사용시 connect string을 암호화하기 위해서 /dev/random을 이용 40bytes의 난수를 생성하여 connect string을 암호화 하는데 /dev/random은 변동(noise)이 적은 시스템에서는 난수 생성이 중단(block)된다 는 문제점이 발생 (참조 2.1, 2.2) /dev/random의 OS level문제 때문에 시스템이 조용하면 /dev/random이용한 난수 생성이 원활하지 않고, 난수생성이 안되어 11g JDBC사용을 필요로 할때 noise가 적어 /dev/random으로부터 40byte의 난수를 얻지 못한 JDBC는 connect string을 암호화 하지 못하고 암호화가 되지 않아 디비접속을 못해서 JDBC사용시 접속불가 장애가 발생한 것으로 확인이 됨.


urandom은 random과 달리 entropy pool 상황에 상관없이 난수생성이 되므로 JDBC드라이버 사용시 혹은 WAS 구동시 명시적으로 -Djava.security.egd=file:///dev/urandom 이라는 자바옵션을 부여하여 (참조 1.1)


/dev/random 대신 /dev/urandom을 강제적으로 사용을 하면 시스템 noise가 없어도 항상 난수 생성이 되어 JDBC를 이용한 접속시 문제가 발생하지 않음



참조


1.1 http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/

2.1 http://www.cl.cam.ac.uk/cgi-bin/manpage?4+random // when read 부터 instead 까지

2.2 http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/system_programing/Unix_Env/random // 2.3.1절