DBMS 2

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

아키텍처

DBMS 2
DB2 가이드
DB2 사용자 가이드
아키텍처
작성자
admin
작성일
2021-02-19 14:51
조회
1197

아키텍처

아키텍처 개요

DB2 9.5이전 DB2프로세스 모델은 아래와 같습니다

db2

DB2 9.5부터 다중 스레드 기반의 모델로 변경되었습니다.

db2


단일 데이터베이스 파티션의 아키텍처

단일 데이터베이스 파티션으로 구성된 인스턴스의 아키텍처는 다음과 같습니다.

db2

DB2 엔진은 고유한 기능을 담당하는 여러 개의 EDU(Engine Dispatchable Unit)로 구 성되어 있으며, 각 EDU는 UNIX에서는 스레드로 구현됩니다.

응용프로그램이 데이터베이스에 접속을 요청하면, 전용 Coordinator Agent 프로세스가 생성되어 응용프로그램을 대신하여 데이터베이스에게 필요한 SQL문의 실행을 요청하는 역할을 하게 됩니다. 클라이언트와 서버 사이의 통신에는 TCP/IP, APPC, Netbios 등의 프로토콜 이 지원됩니다.

에이전트 프로세스가 필요한 데이터를 가져오기 위하여 프리페치 큐를 통해 비동기 방식의 읽기 요청을 하면, 프리페처 프로세스는 big-block I/O를 통해 요청된 페이지들을 버퍼풀로 미리 가져오므로 에이전트 프로세스는 디스크 I/O 대기 시간을 줄일 수 있습니다.

페이지 클리너는 백그라운드 EDU로 특정 상황이 될 때마다 버퍼풀의 Dirty Page를 디스크로 미리 반영하여 버퍼풀의 가용 공간을 확보함으로써 버퍼풀을 사용하는 에이전트 프로세스가 대 기하는 일이 없도록 합니다.

변경된 데이터 페이지와 로그 레코드는 성능을 위해 디스크로 즉시 반영되지 않습니다. 변경된 데이터를 디스크에 반영할 때는 반드시 로그 파일에 먼저 기록됩니다. 이러한 방식을 Write Ahead Logging이라고 합니다.


다중 데이터베이스 파티션의 아키텍처

다중 데이터베이스 파티션으로 구성된 인스턴스의 아키텍처는 다음과 같습니다.

db2

DB2 UDB의 Data Partitioning Feature는 다중 데이터베이스 파티션 기능을 이용하여 병렬 데이터베이스를 구축합니다. 다중 데이터베이스 파티션에 생성된 데이터베이스는 사용자에 게는 한 개의 논리적인 데이터베이스로 인식되지만, 각 파티션에 물리적으로 데이터베이스를 생 성합니다. 파티션별로 생성된 데이터베이스는 일반적인 단일 데이터베이스와 동일하게 독립적 인 자원을 사용할 수 있으므로 각 파티션은 버퍼풀, 잠금 관리, 디스크 등을 독립적으로 운영하게 됩니다.

데이터베이스 파티션은 동일한 머신에 생성되는 논리적 파티션과 다른 머신에 생성되는 물리적 파티션으로 구분됩니다. 동일한 머신에 존재하는 데이터베이스 파티션들은 공유 메모리를 이용 하여 통신하고, 다른 머신에 존재하는 데이터베이스 파티션끼리는 고속의 네트?을 통해서 필요 한 부분만 통신합니다.

응용프로그램이 접속을 요청하면, 접속한 데이터베이스 파티션에 Coordinator Agent 프로 세스가 생성되고, 다른 파티션에는 Subagent 프로세스들이 생성됩니다. SQL문은 Global optimizer에 의한 최적화된 후에 각 Subagent들에게 전송됩니다. Subagent가 해당 파 티션의 데이터베이스에 대해서만 SQL문의 요청을 처리하여 결과를 Coordinator Agent 프로세스에게 반환하면, Coordinator Agent는 응용프로그램에게 최종 결과를 반환합니다.

MPP 머신으로 구축한 DB2의 다중 데이터베이스 파티션 환경은 완전한 Shared Nothing Architecture를 제공하므로 확장성이 좋습니다


데이터베이스 시스템

DB2 UDB 데이터베이스 시스템은 엔진, 인스턴스, 데이터베이스로 구성됩니다. 엔진, 인스턴 스, 데이터베이스, 테이블스페이스 컨테이너 등은 물리적으로 분리되어 있으므로 제품의 재설치, 인스턴스의 재생성시에도 데이터베이스와 관련된 물리적인 파일은 보존되고, 필요시에 다시 사 용할 수 있습니다

db2

DB2 UDB 제품 모듈은 AIX 머신에서는 default 경로인 /opt/ibm/db2/V9.7 디렉토리 에 설치되고, Windows 머신에서는 원하는 디렉토리에 설치됩니다. 한 개의 서버 머신에서 서 로 다른 디렉토리에 각각의 다른 버전의 제품의 설치가 가능합니다.

한 개의 서버 머신에서 여러 개의 인스턴스를 생성할 수 있습니다. AIX 머신에서는 인스턴스마 다 사용자 계정이 필요합니다.

root 사용자가 db2icrt 명령어를 이용하여 인스턴스를 생성하면, 인스턴스 사용자 계정의 홈 디렉토리에 sqllib 라는 서브디렉토리가 생성됩니다. sqllib에 생성된 일부 디렉토리와 파일은 제품이 설치된 /opt/ibm/db2/v9.7 디렉토리의 일부 서브디렉토리와 심볼릭 링크 (symbolic link)로 연결되거나 복사됩니다.

인스턴스 사용자가 db2start 명령어를 이용하여 인스턴스를 기동시키면, sqllib에 존재하는 파일들을 이용하여 인스턴스와 관련된 여러 개의 엔진 프로세스가 생성되고, 인스턴스 전역 메모 리가 할당됩니다.

인스턴스 사용자가 create database 명령어를 이용하여 데이터베이스를 생성하면, 특정 디렉토리에 데이터베이스 구성 파일을 비롯한 물리적인 디렉토리와 파일들이 생성됩니다.

데이터베이스에 접속한 후에 create tablespace 명령어를 이용하여 테이블스페이스와 컨 테이너를 지정하면, 실제 데이터를 물리적으로 독립적인 공간에 저장할 수 있습니다


단일 데이터베이스 파티션의 프로세스 모델

단일 데이터베이스 파티션으로 구성된 인스턴스에서는 다음과 같은 프로세스가 생성됩니다.

db2

단일 데이터베이스 파티션 환경에서 DB2 프로세스는 인스턴스 레벨 에서만 보여진다.

db2

데이터베이스 엔진과 관련된 프로세스들은 방화벽을 통해 외부의 응용프로그램 프로세스들과 다 른 address space를 사용하도록 구성되어 있으므로, 데이터베이스 제어 블록 및 중요한 데 이터베이스 파일과 분리되도록 설계되어 있습니다.


다중 데이터베이스 파티션의 프로세스 모델

다중 데이터베이스 파티션으로 구성된 인스턴스에서는 다음과 같은 프로세스가 생성됩니다.

db2

다중 데이터베이스 파티션 환경에서 DB2 프로세스는 인스턴스, 카탈로그 파티션, 데이터베이스 파티션, 응용프로그램의 4가지 수준으로 분리됩니다.

db2


인스턴스 수준의 프로세스

인스턴스 수준의 프로세스에는 db2fmcd, db2wdog, db2sysc, db2ckpwd, db2acd, db2fmd 등이 있습니다. 인스턴스 사용자가 db2start를 실행한 후에 ps 명령어 를 이용하여 확인할 수 있습니다.


$ login 인스턴스 사용자>
$ db2start
$ ps ?ef | grep -i 인스턴스명>

인스턴스가 기동될 때, 최초로 생성되는 기본 프로세스는 다음과 같습니다.

db2


인스턴스 수준의 프로세스

지역 또는 원격에서 데이터베이스에 대한 접속을 요청하면, 클라이언트와 서버 머신 사이에 사용 되는 통신 프로토콜의 유형에 따라 다음과 같은 통신 리스너 스레드가 db2agent 라는 EDU 를 생성하여 응용프로그램과 엔진을 연결시켜 줍니다.

db2


인스턴스 수준의 프로세스

아카이브 로깅만 사용되거나, UserExit 프로그램을 이용하여 아카이브 로깅을 하는 경우에는 다 음과 같은 프로세스가 관련됩니다

db2


인스턴스 수준의 프로세스

특정한 DB2 명령어 또는 유틸리티를 실행할 때 생성되는 프로세스는 다음과 같습니다

db2


인스턴스 수준의 프로세스

DPF를 사용하여 다중 데이터베이스 파티션 환경을 구성한 경우에만 생성되는 프로세스들은 다 음과 같습니다.

db2

global deadlock 의 작동 원리를 이해하기 위하여 다음과 같은 상황을 가정하도록 합니다. 두 개의 트랜잭션 Trans1과 Trans2가 있습니다. 두 트랜잭션은 각각 한 개의 SQL문에 대한 subsection1과 subsection2 를 두 개의 파티션에서 병렬로 실행시키려고 합니다. trans1은 파티션2에서 subsection2의 작업을 먼저 끝내고, 파티션1에서 subsection1 이 작업 결과 또는 메시지를 반환하기를 대기하고 있지만, subsection1은 파티션1에서 trans2의 subsection2가 lock을 걸고 있기 때문에 잠금 대기 상태에 있습니다. trans2는 파티션1에서 subsection2의 작업을 먼저 끝내고, 파티션2에서 subsection1 이 작업 결과 또는 메시지를 반환하기를 대기하고 있지만, subsection1은 파티션2에서 trans1의 subsection2가 lock을 걸고 있기 때문에 잠금 대기 상태에 있습니다. 다중 파티션 환경에서 서로 잠금을 대기하는 교착 상황이 발생하게 되면, db2glock 프로세스 가 점검하여 한 쪽의 응용프로그램을 강제로 종료시킵니다.

db2


인스턴스 수준의 프로세스

Fault Monitor 와 연관된 프로세스입니다

db2

db2fmcd 프로세스는 기본적으로 시스템 부팅시에 자동적으로 시작되도록 /etc/inittab 파일에 등록되어 있습니다. 자동적으로 시작되는 것을 원하지 않는다면, 해당 명령행을 주석으 로 처리하도록 합니다.


$ login root
$ cat /etc/inittab

#respawn:/opt/ibm/db2/V9.7/bin/db2fmcd

인스턴스 수준의 프로세스

OS와 관련된 작업을 수행하는 프로세스는 다음과 같습니다.

db2


데이터베이스 수준의 프로세스

db2pfchr 와 db2pclnr 프로세스는 버퍼풀과 테이블스페이스 컨테이너 사이의 비동기적인 I/O를 담당합니다.

db2

db2pclnr 프로세스는 다음과 같은 경우에 활동하게 됩니다.

db2


데이터베이스 수준의 프로세스

데이터베이스 로그 파일의 I/O 와 연관된 프로세스입니다.

db2

테이블스페이스의 복구와 연관된 프로세스입니다.

db2


데이터베이스 수준의 프로세스

아카이브 로그 파일의 USEREXIT 과 연관된 프로세스입니다.

db2

데이터베이스 수준의 프로세스에는 다음과 같은 프로세스들도 있습니다.

db2


응용프로그램 수준의 프로세스

통신 리스너 프로세스는 지역 또는 원격 응용프로그램이 데이터베이스에 대한 접속을 요청하면 다음과 같은 에이전트 프로세스를 생성합니다.

db2

단일 데이터베이스 파티션에서 INTRA_PARALLEL 인스턴스 구성 변수를 이용하여 파티션내 (Intra-Partition) 병렬 처리를 지정한 경우에 db2agent와 db2agntp 프로세스의 관계 는 다음과 같습니다

db2


응용프로그램 수준의 프로세스

Subagent로 생성되어 사용이 완료된 프로세스는 성능을 위해 즉시 제거하지 않고 Agent Pool 에 저장하였다가 재사용할 수 있습니다

db2

응용프로그램이 접속을 요청했을 때, Agent 프로세스를 할당하는 우선 순위는 다음과 같은 방 법으로 결정됩니다.

db2


응용프로그램 수준의 프로세스

병렬 복구 처리를 위한 프로세스입니다

db2

아래 그림에서 Coordinator Agent는 읽어온 로그 레코드를 병렬 프리페처를 이용하여 버 퍼풀로 저장합니다. Parallel Recovery Agent 들은 버퍼풀의 데이터를 이용하여 병렬로 복구 작업을 진행합니다.

db2


메모리 모델

DB2 메모리는 다음과 같이 4가지로 구성됩니다.

db2

각 메모리별 특성은 다음과 같습니다.

db2


인스턴스 공유 메모리

인스턴스 공유 메모리는 db2start 명령어로 엔진 기동시에 할당되며, 인스턴스에 존재하는 모 든 EDU들은 이 영역을 액세스할 수 있습니다


$ login 인스턴스 사용자>
$ db2start

할당된 인스턴스 공유 메모리의 양은 db2mtrk 명령어로 확인할 수 있습니다.


$ db2mtrk -i -v
메모리 추적 설정: 16:30:07에서 2009/08/17
인스턴스용 메모리
Other Memory의 크기는 13697024바이트입니다.
FCMBP Heap의 크기는 786432바이트입니다.
Database Monitor Heap의 크기는 65536바이트입니다.
총계: 14548992바이트

인스턴스 공유 메모리는 다음과 같은 메모리 영역으로 구성됩니다.

db2


데이터베이스 공유 메모리

데이터베이스 공유 메모리는 activate db 명령어로 데이터베이스 활성화시에 할당되며, 해 당 데이터베이스에 연관된 모든 EDU들은 이 영역을 액세스할 수 있습니다.


$ login 인스턴스 사용자>
$ db2 activate db 데이터베이스명>

할당된 데이터베이스 공유 메모리의 양은 db2mtrk 명령어로 확인할 수 있습니다.


$ db2mtrk -d -v
메모리 트랙 위치: 19:48:41의 2005/07/18
데이터베이스용 메모리: SAMPLE
Backup/Restore/Util Heap의 크기는 16384바이트임
Package Cache의 크기는 131072바이트임Pool Heap의 크기는 4341760바이트임
Buffer Pool Heap의 크기는 655360바이트임
Buffer Pool Heap의 크기는 393216바이트임
Buffer Pool Heap의 크기는 262144바이트임
Buffer Pool Heap의 크기는 196608바이트임
Lock Manager Heap의 크기는 491520바이트임
Database Heap의 크기는 3555328바이트임
Other Memory의 크기는 0바이트임
총계: 10108928바이트

데이터베이스 공유 메모리의 양은 get snapshot for db 명령어로 확인할 수 있습니다


$ db2 get snapshot for db on 데이터베이스명>
데이터베이스의 메모리틸리티 힙
현재 크기(바이트) = 16384
상위 워터 마크(바이트) = 16384
구성된 크기(바이트) = 20496384
메모리 풀 유형 = 패키지 캐시 힙
현재 크기(바이트) = 131072
상위 워터 마크(바이트) = 131072
구성된 크기(바이트) = 2147483648
메모리 풀 유형 = 카탈로그 캐시 힙
현재 크기(바이트) = 65536
상위 워터 마크(바이트) = 65536
구성된 크기(바이트) = 2147483648

데이터베이스 공유 메모리

데이터베이스 공유 메모리는 다음과 같은 메모리 영역으로 구성됩니다.

db2


응용프로그램 공유 메모리

응용프로그램 공유 메모리는 응용프로그램의 첫 번째 에이전트 프로세스가 데이터베이스에 연결 을 요청하는 경우에 할당되며, 응용프로그램이 완료되면, 반환됩니다. 해당 응용프로그램과 연관 된 모든 EDU들이 액세스할 수 있습니다.

응용프로그램 공유 메모리는 응용프로그램의 첫 번째 에이전트 프로세스가 데이터베이스에 연결 을 요청하는 경우에 할당되며, 응용프로그램이 완료되면, 반환됩니다. 해당 응용프로그램과 연관 된 모든 EDU들이 액세스할 수 있습니다.


$ login 인스턴스 사용자>
$ db2 update dbm cfg using INTRA_PARALLEL YES
$ db2 update db cfg for 데이터베이스명> using DFT_DEGREE 병렬 등급>
$ db2stop force
$ db2start
$ db2 get dbm cfg | grep INTRA_PARALLEL
파티션내 병렬 처리 사용 (INTRA_PARALLEL) = YES
$ db2 get db cfg for 데이터베이스명> | grep DFT_DEGREE
병렬 처리 등급 (DFT_DEGREE) = 병렬 등급>

SQL문의 파티션 내 병렬 처리 수준은 CURRENT DEGREE 특수 레지스터 또는 DEGREE 바인드 옵션을 사용하여 명령문 컴파일시 지정됩니다. 기본값은 DFT_DEGREE 데이터베이스 구성 변수에 지정된 값입니다. 실행 중인 응용프로그램의 파티션 내 병렬 처리의 최대 런타임 수 준은 SET RUNTIME DEGREE 명령을 사용하여 지정됩니다.

에이전트 공유 메모리는 다음과 같은 메모리 영역으로 구성됩니다.

db2


응용프로그램 개별 메모리

에이전트 개별 메모리는 connect 명령어로 데이터베이스에 접속할 때 생성되는 에이전트 프 로세스에게 개별적으로 할당되는 메모리 영역입니다.


$ login 인스턴스 사용자>
$ db2 connect to 데이터베이스명>

할당된 데이터베이스 공유 메모리의 양은 db2mtrk 명령어로 확인할 수 있습니다


$ db2mtrk -p -v
메모리 추적 설정: 16:43:40에서 2009/08/17
에이전트 3708용 메모리
Other Memory의 크기는 720896바이트입니다.
총계: 720896바이트

특정한 에이전트 개별 메모리의 양은 확인하려면, list applications 명령어로 에이전트에 대 응되는 핸들 번호를 확인합니다.


$ db2 list applications
권한 ID 응용프로그램 Appl. 응용프로그램 ID DB 에이전트
이름 핸들 이름 수
-------- ---------------- ---------- ----------------------------------------------- ----------- ----------
ADF db2bp.exe 146 *LOCAL.DB2.090817073144 SAMPLE 1

get snapshot for application 명령어에서 agentid 옵션으로 특정한 에이전트 개별 메모리의 양을 확인합니다.


$ db2 get snapshot for application agentid 응용프로그램 핸들 번호>
응용프로그램의 메모리 사용:
메모리 풀 유형 = 응용프로그램 힙
현재 크기(바이트) = 65536
상위 워터 마크(바이트) = 65536
구성된 크기(바이트) = 1048576
에이전트 프로세스/스레드 ID = 3708
에이전트 잠금 시간종료(초) = -1
에이전트의 메모리 사용:
메모리 풀 유형 = 기타 메모리
현재 크기(바이트) = 720896
상위 워터 마크(바이트) = 917504
구성된 크기(바이트) = 3195011072

응용프로그램 개별 메모리

에이전트 개별 메모리는 다음과 같은 메모리 영역으로 구성됩니다.

db2


Thread 모니터링

아키텍처가 변경됨에 따라 DBA도 관리방법이 변경됩니다


$ ps -fu db2ins10
UID PID PPID C STIME TTY TIME CMD
db2ins10 1237176 2109662 0 Feb 28 - 0:12 db2acd 0
db2ins10 1921136 2109662 0 Feb 28 - 0:14 db2sysc 0
db2ins10 2101494 1941686 0 14:22:34 pts/1 0:00 -ksh
db2ins10 2420958 2101494 0 15:25:33 pts/1 0:00 ps -fu db2ins10

db2sysc가 1921135 입니다. AIX에서 모든 Thread를 확인하려면 아래와 같이 입력합니 다.


$ db2pd -edu
Database Partition 0 -- Active -- Up 1 days 01:05:54
List of all EDUs for database partition 0
db2sysc PID: 1921136
db2wdog PID: 2109662
db2acd PID: 1237176
EDU ID TID Kernel TID EDU Name USR SYS
===========================================================
========================
1801 1801 2216003 db2agent (idle) 0 0.706935 1.071737
1543 1543 5628153 db2resync 0 0.002641 0.004271
1286 1286 1851457 db2ipccm 0 0.082388 0.044037
1029 1029 2023571 db2licc 0 0.000211 0.001055
772 772 4390991 db2thcln 0 0.000244 0.000105
515 515 2621455 db2aiothr 0 2.740874 6.287562
2 2 1273899 db2alarm 0 0.274076 0.408226
258 258 2658531 db2sysc 0 2.085981 1.379128

Memory 사용량 모니터링

4가지 방법이 제공됩니다.


1) db2pd -dbptnmem
2) db2 get snapshot for applications on sample
3) select * from table(admin_get_dbp_mem_usage())
4) db2mtrk -a and db2mtrk -p

db2pd 사용


$ db2pd -dbptnmem
Database Partition 0 -- Active -- Up 1 days 01:11:27
Database Partition Memory Controller Statistics
Controller Automatic: Y
Memory Limit: 13994636 KB
Current usage: 76608 KB
HWM usage: 332736 KB
Cached memory: 16064 KB
Individual Memory Consumers
: Name Mem Used (KB) HWM Used (KB) Cached (KB)
========================================================
DBMS-db2ins10 46784 46784 10048
FMP_RESOURCES 22528 22528 0
PRIVATE 7296 7296 6016

db2 get snapshot 사용


$ db2 get snapshot for applications on sample
Memory usage for application:
Memory Pool Type = Application Heap
Current size (bytes) = 65536
High water mark (bytes) = 65536
Configured size (bytes) = 1048576
Agent process/thread ID = 6463
Agent Lock timeout (seconds) = -1
Memory usage for agent:
Memory Pool Type = Other Memory
Current size (bytes) = 196608
High water mark (bytes) = 196608
Configured size (bytes) = 16710107136

Memory 사용량 모니터링

SQL 사용


$ db2 "select * from table(admin_get_dbp_mem_usage())"
DBPARTITIONNUM MAX_PARTITION_MEM
CURRENT_PARTITION_MEM PEAK_PARTITION_MEM -------------- --
------------------ --------------------- -------------------- 0 14330507264
340590592 340852736 1 record(s) selected.

db2mtrk 사용 (db2mtrk ?a 또는 db2mtrk ?p)


$ db2mtrk -a
Tracking Memory on: 2008/02/29 at 15:51:00
Application Memory for database: SAMPLE
appshrh
128.0K
Memory for application 546
apph other
64.0K 192.0K
Memory for application 545
apph other
64.0K 192.0K
Memory for application 544
apph other
64.0K 320.0K
Memory for application 543
apph other
64.0K 576.0K
Memory for application 547
apph other
64.0K 192.0K