ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 그림으로 공부하는 오라클 구조 : 커넥션과 서버 프로세스의 생성
    STUDY/DB 2022. 5. 30. 00:32

    1. 오라클의 접속 동작

    1.1 소켓의 동작

     

    오라클은 TCP/IP의 소켓(socket)을 네트워크 통신 수단으로 사용하고 있다.

     

    소켓의 동작

     

    한 번 소켓을 만들어 두면 소켓을 읽고 쓰기만 해도 송수신을 구현할 수 있으므로 프로세스의 측면에서 편리한 기능이다.

    네트워크의 드라이버와 OS의 라이브러리가 송수신을 수행하며, 네트워크 안에는 여러 개의 소켓이 존재한다.

    소켓은 '주소(address)'와 '포트(port)번호'라고 불리는 번호의 조합으로 식별할 수 있고, 소켓의 연결에서 중요한 부분은 연락이 오기만을 기다리는 프로세스가 존재한다는 점과 연결할 때는 송신 측에서 '주소'와 '포트'를 반드시 지정해야 한다는 점이다.

     

    소켓 연결

     

    1.2 오라클에서 소켓의 동작

    오라클에서도 위 그림과 같이 동작하며, 오라클에서는 수신을 기다리는 프로세스를 '리스너(listener)'라고 부른다(서버 프로세스X). 그리고 리스너로 접속하려는 프로세스는 애플리케이션의 프로세스이다.

     

    오라클 커넥션

     

    1.3 커넥션 처리1 : 리스너 기동

     

    커넥션 처리 = 창고 회사 오라클

    리스너 = 창소 회사 오라클의 접수 데스크

    listener.ora 파일 = 접수 데스트가 가지고 있는 '회사의 대표 번호' 및 '내선 전화번호부'

     

    하나의 리스너는 여러개의 데이터베이스에 안내할 수 있다. 일반적인 상황에서는 하나의 리스너가 데이터베이스 한 개를 담당한다. 오라클은 기본적으로 리스너의 포트 번호로 1521를 사용하지만, 다른 번호를 사용해도 된다. 리스너의 설정이 끝나면, lsnrctl이라는 도구를 사용해서 리스너를 기동한다. 리스너가 자신이 안내해야 하는 데이터베이스를 인식하는 방법으로는 listener.ora 파일에 기록되어 있는 설정을 읽거나, 데이터베이스가 자동으로 등록하는 방법이 있다. 일반적으로는 사용이 간단한 자동 등록을 선택해서 사용한다.

    리스너의 기동

     

    1.4 커넥션 처리2 : 애클리케이션에서의 커넥션

    애플리케이션 안에서 연결하기 위한 명령이 실행되거나, SQL*Plus에서 connect 명령어를 실행한 순간에 데이터베이스에 연결된다. 먼제 데이터베이스에 연결할 때 필요한 정보를 오라클 클라이언트에 전달할 필요가 있으며, 그 정보를 '커넥션 디스크립터(connection descriptor)'라고 부른다. 커넥션 디스크립터 안에는 주소, 포트, 서비스 이름 등의 정보가 포함되어 있다. 연결할 때마다 정보를 입력할 수는 없으므로, 일반적으로 tnsnames.ora 파일에 커넥션 디스크립터를 작성해놓고 커넥션 식별자를 오라클 클라이언트에게 전달한다. 전화로 비유하면 커넥션 식별자는 '단축 다이얼'에 해당한다. 

    일반적으로 오라클 클라이언트는 tnsnames.ora의 커넥션 디스크립터 정보를 사용해서 리스너와 클라이언트 사이에 소켓을 생성한다.

    tnsnames.ora
    애플리케이션에서 오라클 연결

     

    1.5 커넥션 처리3 : 서버 프로세스의 생성

    서버 프로세스를 생성하고 소켓을 인계받는다. 소켓을 생성하면 리스너가 그대로 SQL 처리를 해도 될 것처럼 보이지만, 한 번 SQL을 처리하면 요청받은 SQL을 처리하느라 다른 처리를 할 수 없게 되므로 서버 프로세스를 생성해서 SQL 처리를 즉시 인계한다. 리스너가 인계한 후부터 서버 프로세스와 오라클 클라이언트는 직접 송수신하므로 리스너는 자유로워진다. 이것은 '병렬 처리를 가능하게 하고 높은 처리량을 실현한다'에 해당한다.

     

    이때, 서버 프로세스의 생성은 큰 작업에 해당한다. OS상에서 프로세스를 생성해야 하며(일반적으로 프로세스를 생성하는 것은 처리가 무겁다고 알려짐), 서버 프로세스가 사용할 수 있는 공유 메모리를 확보해야 한다. 또한, 서버 프로세스용 전용 메모리(PGA)도 확보해야 한다. 그 외에 데이터베이스 내부의 처리도 남아있다. 따라서 서버 프로세스를 한 번 생성하는 데는 가벼운 SQL문을 처리할 때 사용하는 CPU 시간보다 몇 배에서 몇십 배 많은 CPU 시간을 사용하게 된다. 

    서버 프로세스 생성 과정

     

    2. 접속 장애 발생 예시

     

    - tnsnames.ora 파일에 해당하는 데이터가 없을 때

     

    - 리스너가 기동하지 않았을 때

     

    - 리스너가 가진 데이터베이스의 정보와 일치하지 않을 때

     

    3. 정지나 리스너 상태 확인

    - 리스너 정지 : lsnrctl의 stop 명령어 사용

    - 리스너 상태 확인 : lsnrctl의 status 명령어 사용, 현재 리스너 기동 상태나 listen하고 있는 포트의 번호, 보유하고 있는 데이터베이스의 정보 등을 알 수 있음.

     

    4. 성능 개선

    커넥션을 맺는 것과 서버 프로세스를 생성하는 것은 오라클에게 무거운 작업이다. 이것을 개선하기 위해서 '서버 프로세스 몇 개를 풀로 구성해두고 여러 애플리케이션이 사용하고 싶을 때 풀에서 하나를 꺼내 사용한다'는 구조를 만들면, 가동 시간 중 대기 시간이 대부분인 서버 프로세스의 가동률을 높일 수 있다. 이러한 구성을 위해서 오라클의 '공유 서버 구성'이나 '커넥션 풀(연결 풀)이라고 불리는 구성을 사용할 수 있다. 

     

    커넥션 풀

     

    5. 요약

    • 데이터베이스에 접속하기 위해서는 데이터베이스 서버의 주소와 리스너의 포트 번호가 필요하다.
    • tnsnames.ora 파일 안에 접속하기 위한 정보를 기록해둔다.(JDBC Thin 드라이버 제외)
    • 리스너라고 하는 프로세스가 접속 요청을 받으며, 서버 프로세스의 생성도 같이 수행한다.
    • listener.ora 파일 안에 리스너의 설정(포트 번호 등)을 기록해둔다.
    • 서버 프로세스의 생성은 매우 무거운 작업이므로 가능하면 줄이는 것이 좋다.

     

    이전장 : 오라클의 기동과 정지

     

    출처 : 스키타 아츠시 외 4명, 『그림으로 공부하는 오라클 구조』, 이민재, 제이펍(2022), p98-p114

Designed by Tistory.