Weblogic은 Datasource를 통해 인스턴스가 DB와 통신하도록 한다. 이때 Weblogic에는 3가지 Datasource가 존재한다.
1개의 웹로직 서버를 Datasource를 통해 2중화 되어있는 RAC Database와 연동하였다.
DB 세션 확인
select inst_id, sid, serial#, username, status, machine, program, last_call_et from gv$session where username='SYSTEM' and MACHINE='waslan' order by 1,6;
Weblogic TCP 확인
netstat -po|grep node|grep [PID]|sort -k5|nl
JMeter 과부하
exec DBMS_SESSION.sleep(600);
node1: 35개, node2: 5개
oracle database scan에서 리소스에 따라 자동으로 loadbalancing을 해준다. 그렇기 때문에 WAS 기동시 node1을 통해 connection pool이 더 많이 생성됨을 알 수 있다.
참고
이때 scan이 load balance를 하는 기준은 OS의 resource가 아닌, >DB의 상태이다. stress 명령어를 통하여 DB가 아닌 OS 자체에 부하를 줬을 경우, 아무런 이상 없이 20개씩 분산되나, long query를 통하여 DB에 부하를 주면 위와 같은 결과가 나타난다.
node1: 35개, node2: 5개
node2의 쿼리가 종료, 정상적인 상태가 되었으나, connection pool 개수에 변화가 없음을 알 수 있다. 이 현상을 해결하기 위해 WAS 재기동이 필요하다.
node1: 0개, node2: 40개
node1을 다운하자, node2로만 connection이 생성되었다.
node1: 0개, node2: 40개
node1을 기동하였지만, node1로 connection이 생성되지 않는다.
이 경우에도, 정상적으로 connection pool을 나누기 위해서 Weblogic을 재기동을 해야 한다.
node1: 13개, node2: 27개
node1: 23개, node2: 17개
node1: 21개, node2: 19개
3번의 테스트 결과, node2에 부하를 줬음에도 node1에 더 적은 session이 생성되기도 하는 등, connection pool이 무작위로 생성되었다.
node1: 0개, node2: 40개
RAC node2로 40개의 connection pool이 생성되었다.
node1: 0개, node2: 40개
RAC node1이 정상적으로 기동되었으나, connection pool 에는 변화가 없다. 다시 connection pool을 분산시키기 위해서는 Weblogic 재기동이 필요하다.
node1: 20개, node2: 20개
Multi DS는 기본적으로 n개의 Generic DS를 그룹화 시켜 사용한다. 그렇기에, MaxCapacity(최대 Connection Pool 크기)를 20으로 설정한 2개의 Generic DS를 하나의 Multi DS로 그룹화 하였기 때문에, RAC node당 20개씩, 총 40개의 Connection Pool이 생성된다.
node1: 20개, node2: 20개
부하를 해제 후에도 기존 connection 상태에서 변화가 없음을 알 수 있다.
Weblogic 기동 후, RAC node1 종료
node1: 0개, node2: 20개
RAC node1 기동
node1: 20개, node2: 20개
node1을 기동시키자, 정상적으로 node1의 connection pool이 정상적으로 20개 생성됨을 알 수 있다.