안녕하세요 @flyyou입니다.
이전에 제 소개를 보신분들이 계시지만 아마 기억하지 못하실 것인데요
저는 java 개발자입니다.
나이가 먹고나니 PM도 하고 PL도 하고 하지만 아무튼 직업은 개발자인것이지요~
최근까지 클라우드 관제시스템 개발하다가 요즘은 모커피브랜드에서 프로젝트를 수행하고 있는데요
어제 발생한 오류상황 때문에 애를 좀 먹었는데
관련해서 정리를 해 보려고 합니다. (flyyou-tip) 이라는 태그를 만들어서 나중에 저만을 위한 라이브러리 역할을 하고도 싶네요
제가 개발에 참여한 시스템은 선불카드 시스템이 적용되어 있습니다. POS에서 선불카드 결제시 연동을 통해서 수수료를 계산하고 실적을 쌓고 정산처리를 진행하는데요?
이때 선불카드 실적에 대해서 매일매일 실적을 추출해서 대사작업을 위해 SFTP를 통해 특정 G/W서버로 전송하는 데몬이 있습니다.
하지만 이 데몬에서 오류가 발생하고 실적데이터가 전달되지 않았습니다.
오라클 11g에 접속이 안되는 현상이 발생하여 데이터 추출이 불가능 함
이전에는 아주 정상적으로 잘 수행되는 것이 어쩌다 가뭄에 콩나듯 아래의 오류가 발생함.
java.sql.SQLRecoverableException: IO Error: Connection reset
드라이버는 기존 운영시스템에 따라 11g JDBC 드라이버를 사용
11g JDBC 드라이버를 사용시에는 connect string을 암호화하기 위해서 /dev/random을 이용해서 40byte의 난수를 생성한 다음에 connect string을 암호화 한다고 합니다.
그런데 /dev/random은 변동이 적은 시스템에서는 난수 생성이 중단(block)된다는 문제점이 발생한 이력이 있고
/dev/random의 OS level문제 때문에 시스템이 조용하면 /dev/random이용시 난수생성이 원할하지 않아서 /dev/random으로부터 40byte의 난수를 얻지못한 JDBC는 connect string을 암호화하지 못하고 암호화가 되지 않아서 DB접속을 못하는 현상이 발생한다고 합니다.
/dev/random 대신 /dev/urandom을 강제적으로 사용을 하게되면 시스템 noise가 없어도 항상 난수 생성이되어서 JDBC를 이용한 접속에 문제가 발생하지 않음
urandom은 random과는 달리 entropy pool 상황에 상관없이 난수생성이 되므로 JDBC 드라이버 사용시 혹은 WAS 구동시 명시적으로 JAVA 옵션을 부여해서 문제 해결함.
(참조 : ttp://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/)
-Djava.security.egd=file:///dev/urandom
시스템의 noise가 적으면 /dev/random으로부터 난수생성이 잘 되지 않는다는 사실을 처음 알았습니다.
참 별의별 희안한 Case가 있네요~