-
그림으로 공부하는 오라클 구조 : 오라클의 여러 프로세스STUDY/DB 2022. 4. 25. 00:00
오라클
- DBMS인 오라클은 해당 데이터를 디스크에 저장하고 관리한다. 오라클을 포함한 DBMS의 기본적인 동작은 데이터를 보관하고, 요구에 따라 데이터를 반환한다. - 오라클은 SQL문과 그 결과 데이터를 프로그램과 송수신한다. - 프로그램은 여러 개 존재할 수 있으며, 오라클의 프로세스도 여러 개 존재한다.
데이터베이스를 사용하지 않는 애플리케이션의 프로그래밍에서는 각각의 프로세스가 자신이 가진 변수(데이터)를 처리하는 것이 일반적이다. 같은 프로그램이 여러 개 실행되었다 하더라도 실제로 변수는 개개의 프로그램마다 존재하기 때문에 프로세스간의 간석을 신경 쓸 필요없이 데이터를 건드려도 문제가 없다.
하지만 데이터베이스에서는 여러 프로세스나 사용자가 하나의 데이터베이스(데이터 집합)에 접근하기 때문에 다른 사용자나 애플리케이션을 신경써야 한다.
기본적으로 데이터베이스에는 데이터를 중복으로 보관하지 않으며, 보관해서도 안된다. 그리고 기본적으로 여러 사용자나 프로그램은 데이터베이스의 데이터를 공유하고 있다.
ex) 엑셀과 DBMS의 차이
데이터를 관리한다는 관점에서 엑셀과 DBMS가 하는 일이 비슷할 수 있다. 하지만 '여러 사용자가 관리한다'는 관점에서는 차이가 발생한다.
엑셀은 하나의 PC에서 작동되며, 단일 사용자가 사용하는 것으로 여러 명의 사용자가 동시에 사용할 수 없다. 반면에 DBMS는 다수의 사용자나 애플리케이션이 데이터를 공유한다는 전제로 만들어져 있어서 많은 사용자가 데이터를 동시에 검색하거나 변경할 수 있다. 다수의 사용자가 동시에 데이터를 처리하는 경우 사용자의 실수로 데이터가 손상되지 않도록 처리하는 Lock 장치를 가지고 있다.- 여러 개의 프로세스로 구성된 오라클
오라클은 여러 개의 프로세스로 구성되어 있는데 그 이유는 무엇일까?
SQL 처리는 길게는 몇 시간 이상이 걸리는 경우가 존재한다. 현재 사용자가 작업을 하는 동안 다른 사용자는 아무 작업도 하지 못하고 기다릴 수는 없다. 이런 경우 다중 처리를 위해서 여러 개의 프로세스로 구성된다.
또한, 디스크는 메모리 액세스에 비해서 속도가 매우 느리다. CPU와 같은 자원을 속도가 느린 I/O가 반복되고 있는 동안에 방치하는 것은 매우 아깝기 때문에, 가능하다면 I/O가 반복되는 그 순간에는 다른 SQL 처리를 하는 것이 효율적이기 때문에 여러 프로세스로 구성된다.
오라클은 여러 개의 프로세스를 실행하는 방식으로 병렬 처리를 한다. 단, 오라클은 같은 프로세스가 여러 개 작동하는 것이 아니라, 다른 역할을 가진 여러 가지 프로세스가 존재한다.
- 서버 프로세스와 백그라운드 프로세스
오라클은 두 가지 프로세스로 구성되어 있다.
1. 서버 프로세스(SQL문을 처리하는 프로세스, 포그라운드 프로세스) 2. 백그라운드 프로세스(주로 서버 프로세스를 지원하는 프로세스)
오라클 클라이언트는 서버 프로세스와 통신한다. 서버 프로세스는 오라클 클라이언트의 요청(SQL문)을 처리한다. 백그라운드 프로세스(일부)의 역할은 아래와 같다.
오라클에서 처리하는 주요 처리
1. SQL문의 수신 2. SQL문의 파싱(어떤 테이블에 어떻게 접근해야 하는지를 생각하는 작업) 3. 데이터 읽기(디스크에서 읽어온다.) 4. 데이터 기록(디스크에 기록한다.) 5. SQL문의 결과 회신 6. 로그 기록(데이터의 변경 로그를 디스크에 기록) 7. 각종 정리(프로세스의 비정상 종료로 인한 아무도 사용하지 않는 Lock의 해제 등) 8. 로그 보관(아카이브)
SQL문 처리에 필요한 작업
오라클은 SQL문을 수신하지 않으면 작업을 처리하지 않으며, 파싱(parsing)이라고 불리는 절차를 거치지 않으면 어떤 테이블에 접근해야 하는지조차 알 수 없다. 당연히 디스크에서 데이터를 읽어오지 않으면 데이터를 처리할 수 없다. 또한, 겨우 처리하더라도 마지막에 데이터나 결과를 오라클 클라이언트에게 전달하지 않으면 종료할 수 없다.
따라서 SQL문을 처리하기 위해서는 SQL문을 수신하고, 어떤 테이블에 어떻게 접근해야하는 지를 판단하는 파싱 작업과, 데이터를 읽고, SQL문의 결과를 회신하는 작업이 필요한다.
SQL을 처리하는 과정에서 데이터 기록과 같은 처리는 SQL문의 결과를 회신하는 것과는 상관없으며, 시간을 의미 없이 사용하기 때문에 블필요하다고 볼 수 있다. 이러한 작업은 백그라운드 프로세스에게 맡길 수 있다.
ex) 데이터를 디스크에 기록하는 일은 DBWR(데이터베시스 라이터)가 수행한다. 즉, 서버 프로세스가 디스크에서 데이터를 읽어오기는 하지만 기록하는 것은 백그라운드 프로세스가 처리한다. 만약, 서버 프로세스가 디스크에 기록하는 처리를 한다면, 디스크에 작업을 처리하는 데 시간이 많이 소요되기 때문에(1회에 10밀리초나 20밀리초), 오라클 클라이언트는 그만큼 기다려야 한다.
요약)
- 데이터베이스는 모두 공유해서 사용한다. - 애플리케이션이나 SQL * Plus 같은 오라클 클라이언트가 여러 개 존재하고, 여러 개의 SQL문이 오라클에 전달된다. - 오라클 위에서 여러 개의 SQL문이 동시에 동작하고 있다. - 서버 프로세스는 SQL문의 결과를 가능하면 빠르게 회신하기 위한 일을 한다. - 서버 프로세스를 도와주는 백그라운드 프로세스가 존재한다.
시스템에서 데이터 베이스는 어떤 식으로 사용되고 있을까?
데이터베이스는 데이터를 보관하는 장소로 사용되고 있으며, 애플리케이션이 데이터를 보관하고(또는 변경하거나 꺼내고) 싶을 때 사용한다. 애플리케이션은 업무 처리나 화면 처리를 수행하다가 '이 데이터가 필요하다'라고 생각한 시점이 되면 데이터베이스에 접근해서 데이터를 꺼내 온다.
그리고 SQL문을 수행하기 위해서 실제 시스템에서 애플리케이션이 SQL * PLUS를 직접 사용하는 일은 거의 없다. 대부분 JDBC, ODP, NET, Pro * C 같은 것을 통해 오라클에서 SQL문을 수행한다.
'프로세스'와 '스레드'란?
프로세스는 실행 중인 상태에 있는 프로그램을 의미한다. 실행 중인 상태이기 때문에 메모리나 자원을 가지고 있다, 예를 들어, 유닉스 상에 프로그램이 여러 개 실행되어 있으면 그것들은 각각 다른 프로세스이므로 CPU가 여러 개 있다면 동시에 처리할 수 있다.
스레드는 프로세스 내에 존재하는 실행 단위를 말한다. 하나의 프로세스 안에서 병렬로 작업을 처리하고 싶을 때 사용한다.
둘 다 병렬로 처리하기 위한 구조이지만, 가장 다른 점은 부하의 크기와 메모리 공유 여부이다. 프로세스는 각자 독립적으로 수행되어 자원을 독자적으로 사용하기 떄문에 부하가 크고, 메모리를 공유하지 않는다. 스레드는 한 프로세스 안에서 수행되므로 부하가 적지만, 스레드끼지 메모리를 공유한다.
오라클 RAC란?
RAC란 Real Application Clusters의 약자로, 오라클 클러스터웨어(Clusterware)를 활용한 오라클 데이터베이스의 클러스터 기술을 말한다. 여러 개의 서버상에 가동된 인스턴스를 하나의 데이터베이스처럼 사용할 수 있다. 여러 개의 서버로 구성되어 있지만 데이터의 일관성을 유지하기 위해 스토리지는 함께 사용한다.
HA(High Availability, 고가용성) 구성과 비교해서 RAC 구성이 가진 특징은 각 서버가 액티브(active)/스탠바이(standby)가 아닌 액티브/액티브 구성이므로 서버의 CPU나 메모리 같은 자원을 100% 활용할 수 있다는 것이다. 즉, 두 대 이상의 저렴한 서버가 비싼 서버 한 대 보다 강력하게 동작한다. 한 개의 인스턴스에 장애가 발생하더라도 남은 인스턴스로 작업을 처리할 수 있기 때문에 지속적인 운영이 가능하다. 또한, RAC를 구성하는 서버를 추가/삭제할 수 있다. 서버를 추가한다는 것은 CPU와 메모리를 추가하는 것에 상응하며 가용성이 향상된다. RAC는 메모리에 캐시되어 있는 블록을 서버 간에 공유하므로 디스크의 I/O를 기다릴 필요 없이 데이터의 일관성을 유지할 수 있는 구조이다.
HA 구조는 액티브/스탠바이 구성으로 액티브 서버에 장애가 발생할 경우 스탠바이 서버를 즉시 액티브 상태로 바꿔 서비스 중단이 발생하지 않도록 한다. HA 구조는 구조가 단순해서 구축 비용이 저렴하고, 서버 하나만 가동되기 때문에 유지비 역시 저렴한 장점이 있다. HA 구조의 단점은, 스탠바이 상태의 서버는 액티브 서버에 장애가 발생하지 않는 이상 이용률이 거의 없고, 액티브 서버만 사용되기 때문에 액티브 서버가 모든 부하를 부담해야 한다. 또한, 각 서버별로 스토리지를 가지고 있기 때문에 수시로 동기화가 이루어져야 하고, 따라서 성능 저하를 야기할 수 있다. 또한 이러한 특성으로 서버간 데이터가 불일치하는 문제가 발생할 수 있다. 그리고 액티브 서버가 멈추면 스탠바이 서버가 활성화 될 때 까지의 트랜잭션을 모두 유실하게 된다.
이러한 HA 구조의 문제들로 인해 한 단계 발전시킨 OPS 방식이 있다. OPS(Oracle Parallel Serve) 구조는 액티브/액티브 구조로 하나의 스토리지에 접근해서 데이터를 조회, 변경하는 작업을 수행한다. 하나의 서버에 장애가 발생할 경우 나머지 서버로 작업을 넘기고, 나머지 서버는 계속 작업을 수행한다. 하지만 이러한 OPS 방식에도 RAC ping 이라는 문제가 존재한다.
RAC Ping이란 액티브1 서버에서 데이터를 변경하고 완료했을 때, 액티브2 서버에서 조회할 경우 변경 내용을 반드시 디스크에 저장한 후에 액티브2에서 가져올 수 있다는 것이다. 하지만 이러한 디스크의 사용은 시간이 오래걸리기 때문에 성능 저하의 주요 원인이 된다. 이러한 현상을 해결한 것이 위에 나오는 RAC 구조이다.
이전장 : I/O와 디스크의 관계
다음장 : 캐시와 공유 메모리
출처 : 스키타 아츠시 외 4명, 『그림으로 공부하는 오라클 구조』, 이민재, 제이펍(2022), p18-p35
'STUDY > DB' 카테고리의 다른 글
그림으로 공부하는 오라클 구조 : SQL문 분석과 공유 풀 (0) 2022.05.09 그림으로 공부하는 오라클 구조 : 캐시와 공유 메모리 (0) 2022.05.08 그림으로 공부하는 오라클 구조 : I/O와 디스크의 관계 (0) 2022.04.24 프로젝트 성패를 결정짓는 데이터 모델링 이야기2 (0) 2021.07.08 JOIN (0) 2021.07.06