데이터베이스 시스템 7판을 읽으며 간략하게나마 정리하는 글입니다.
1. 물리적 저장 장치 매체 개요
컴퓨터 시스템에는 여러 유형의 데이터 저장 장치가 존재한다.
이러한 저장 장치 매체를 데이터에 접근하는 속도, 해당 매체를 구매하기 위해 드는 데이터 단위당 비용, 그리고 매체의 신뢰성에 따라 분류할 수 있다.
- 캐시(Cache)
캐시는 저장 장치 중에 가장 빠르고 비싸다. 캐시 메모리는 크기가 상대적으로 작으며, 컴퓨터 시스템 하드웨어가 캐시의 사용을 관리한다.
데이터베이스 시스템의 질의 처리 데이터 구조와 알고리즘을 설계하는 데 캐시 효과를 고려하는 것은 의미가 있다.
- 메인 메모리(Main Memory)
연산에 사용할 데이터를 저장하기 위한 저장 장치이다. 범용의 기계어가 메모리에서 동작한다.
메인 메모리의 내용은 정전이나 시스템 충돌이 발생하면 잃어버리게 된다. 그래서 메인 메모리는 휘발성(volatile)이 있다고 한다.
- 플래시 메모리(Flash Memory)
플래시 메모리는 메인 메모리와 달리 정전이 발생해도 사라지지 않는 비휘발성(non-volatile)이다.
플래시 메모리는 메인 메모리에 비교해 바이트당 비용이 더 낮지만, 자기 디스크보다 바이트당 비용은 더 비싸다.
USB 메모리도 플래시 메모리를 많이 사용한다.
또한 개인용 컴퓨터의 자기 디스크의 대체품으로 플래시 메모리를 더 많이 사용하고 있다.
솔리드 스테이트 드라이브(Solid-state drive, SSD)는 내부적으로 플래시 메모리를 사용하여 데이터를 저장하지만 자기 디스크와 유사한 인터페이스를 제공하여 데이터를 블록 단위로 저장하거나 검색할 수 있다.
이러한 인터페이스를 블록 지향 인터페이스(block-oriented interface)라 부른다.
- 자기 디스크 저장 장치(Magnetic-disk storage)
자기 디스크는 온라인으로 장기간 데이터를 저장하기 위한 주된 매체이며, 또한 하드 디스크 드라이브(hard disk drive, HDD)라고도 한다. 비휘발성이다.
자기 디스크에 저장된 데이터에 접근하려면 시스템은 먼저 데이터에 접근할 수 있는 디스크에서 메인 메모리로 데이터를 이동시켜야 한다.
시스템이 지정한 작업을 수행한 후 수정된 데이터를 디스크에 기록해야 한다.
- 광학 저장 장치(Optical storage)
DVD는 레이저 광원을 사용하여 데이터를 쓰고 다시 읽는 광학 저장 매체이다.
DVD는 특정 데이터에 접근하는 데 필요한 시간이 자기 디스크에 걸리는 시간에 비교해 상당히 길 수 있으므로 활성 중인 데이터베이스 데이터를 저장하는데 적합하지 않다.
또한 단 한 번만 기록(write-once)를 지원하며, 한번만 기록되고 여러 번 읽기 가능한 디스크를 WORM(write-once, read-many) 디스크라 부른다.
- 테이프 저장 장치(Tape storage)
주로 데이터 백업과 보관용으로 테이프 저장 장치를 사용한다.
다만 테이프는 테이프 시작부터 순차적으로 접근해야 하므로 데이터 접근이 훨씬 더 느리며 접근하는 데 걸리는 시간이 매우 길어질 수 있으므로 수십에서 수백초가 소요된다.
이러한 이유로 테이프를 순차 접근 저장 장치(sequantial-access storage)라 불린다.
반대로 자기 디스크와 SSD 저장장치는 데이터가 어디에 위치하든지 데이터를 읽을 수 있으므로 직접 접근 저장 장치(direct-access storage)라 불린다.
다양한 저장 매체는 속도와 비용에 따라서 다음과 같은 계층 구조로 나타낼 수 있다.
계층이 높을수록 비싸고 빠르며, 계층이 낮을수록 비트당 비용은 감소하고, 접근 시간은 증가한다.
예를 들어 캐시, 메인 메모리는 1차 저장 장치(primary storage)라 부르고,
플래시 메모리와 자기 디스크 같은 매체는 2차 저장 장치(secondary storage) 혹은 온라인 저장 장치(online storage)라 부른다.
자기 테이프, 광디스크는 3차 저장 장치, 오프라인 저장 장치 라 부른다.
2. 저장 장치 인터페이스
자기 디스크와 플래시 기반 SSD는 고속의 상호 연결선을 통해 컴퓨터 시스템에 연결되어 있다.
디스크는 일반적으로 직렬 ATA(SATA) 인터페이스, 혹은 직렬 부착 SCSI(Serial Attached SCSL, SAS) 인터페이스를 지원한다.
SAS 인터페이스는 일반적으로 서버에서만 사용된다.
SATA-3 버전은 실제로 초당 600MB까지 전송이 가능하며, SAS-3 버전은 초당 12GB까지 데이터 전송 속도를 지원한다.
비휘발성 메모리 익스프레스(Non-Volatile Memory Express, NMVe) 인터페이스는 SSD를 더 잘 지원하기 위해 개발된 논리 인터페이스 표준이며, 일반적으로 PCIe 인터페이스와 함께 사용된다.
일반적으로 케이블을 통해 컴퓨터 시스템의 디스크 인터페이스에 디스크를 직접 연결하지만, 원격에 위치할 수 있으며 고속 네트워크를 통해 컴퓨터에 연결할 수 있다.
SAN(Storage area network) 구조에서는 수많은 디스크가 고속 네트워크를 통해서 여러 서버 컴퓨터에 연결된다.
일반적으로 독립적인 디스크의 중복적인 배열(redundant arrays of independent disks, RAID)이라 불리는 저장 장치 조직 기법을 사용하여 디스크를 지역적으로 조직하는데, RAID는 서버에 매우 크고 안정적인 디스크의 논리적 뷰를 제공한다.
SAN에 사용되는 상호 연결 기술에는 SCSI 명령을 IP 네트워크를 통해 전송할 수 있는 iSCSI, 버전에 따라 초당 1.6 ~ 12 기가바이트를 제공하는 파이버 채널(Fiber Channel, FC), 매우 낮은 대기 시간의 고대역 폭 네트워크 통신을 제공하는 인피니밴드(InfiniBand)가 포함된다.
NAS(network attached storage)는 SAN의 대안이다.
NAS는 큰 디스크처럼 보이는 네트워크 저장 장치 대신, NFS 또는 CIFS와 같은 네트워크 파일 시스템 규약을 사용하여 파일 시스템 인터페이스를 제공한다는 점을 제외하면 SAN과 매우 유사하다.
3. 자기 디스크
3 - 1) 디스크의 물리적 특성
다음 그림은 자기 디스크의 모습을 보여주고 있다.
각 디스크 판(platter)은 납작한 원형이다.
디스크는 사용 중일 때 일반적으로 분당 5,400 ~ 10,000 회전의 일정한 속도로 회전시킨다.
디스크 판 표면 바로 위에 판독-기록 헤드가 있다. 디스크 표면은 논리적으로 트랙(track)으로 나뉘고, 다시 섹터(sector)로 나뉜다.
섹터는 디스크로부터 읽고 쓸 수 있는 정보의 가장 작은 단위다.
섹터의 크기는 보통 512바이트이다.
디스크의 중앙 쪽 내부 트랙은 외부 트랙보다 길이가 짧고 섹터의 수가 더 적다.
판독-기록 헤드(read-write head)는 자기 물질의 자화(자기 물질 방향)와 반대 방향으로 회전하면서 자기적으로 섹터 위에 정보를 저장한다.
디스크는 일반적으로 많은 판을 포함하고, 모든 트랙의 판독-기록 헤드는 디스크 암(disk arm)이라는 하나의 어셈블리(assembly) 위에 올려져 있으며 다 같이 움직인다.
모든 디스크 판 위에 있는 헤드는 다 같이 움직이기 때문에 하나의 판 위에 헤드가 i번째 트랙에 있을 때 모든 다른 판 위에 있는 헤드 또한 i번째 트랙에 있다. 그러므로 모든 디스크 판의 i번째 트랙을 i번째 실린더(cylinder)라 부른다.
3 - 2) 디스크의 성능 측정
디스크의 우수성에 대한 주요 측정은 용량, 접근 시간, 데이터 전송 속도와 신뢰성에 대해서 이루어진다.
탐색 시간(seek time)은 암을 재위치 시키는 데 걸리는 시간을 의미하며, 회전 지연 시간(rotational latency time)은 헤드가 원하는 트랙에 도달한 뒤 섹터가 헤드 아래에 와서 접근할 수 있을 때까지 기다리는 시간을 의미한다.
- 접근 시간 (access time)
접근 시간은 읽기나 쓰기 요구를 받았을 때부터 데이터가 전송되기 시작할 때까지의 시간이다.
- 평균 탐색 시간(average seek time)
평균 탐색 시간은 일련의 임의의 요구를 측정한 탐색 시간의 평균값이다.
일반적으로 파일 시스템에서 디스크 I/O를 요청하지만, 데이터베이스 시스템에서 이를 직접 생성할 수도 있다.
각 요청은 참조할 디스크의 주소를 지정한다. 해당 주소는 블록 번호 형식이다.
디스크 블록(disk block)은 저장 장치 할당 및 검색의 논리적 단위이며, 오늘날 블록 크기는 일반적으로 4 ~ 16KB이다.
디스크와 메인 메모리 간에 블록 단위로 데이터를 전송한다.
블록을 지칭하는데 페이지(page)라는 용어를 자주 사용하지만, 일부 문맥에서는 서로 다른 것을 가리킨다는 것을 유의하자.
디스크 블록에 대한 일련의 접근 요청은 크게 순차적 접근 유형 또는 임의 접근 유형으로 분류된다.
- 순차적 접근 유형(sequential access patter)
순차적 접근 유형의 연속적인 요청은 같은 트랙 혹은 인접 트랙에 있는 연속적인 블록 번호에 대한 것이다.
순차적 접근 유형에서 블록을 읽으려면 첫 번째 블록에 대한 디스크 탐색(disk seek)이 필요할 수 있겠지만, 연속적인 요청에는 탐색이 필요 없거나, 멀리 있는 트랙보다 더 빠른 인접 트랙 탐색이 필요할 수 있다.
데이터 전송률은 순차적 접근 유형에서 가장 높은데, 이는 탐색 시간이 최소이기 때문이다.
- 임의 접근 유형 (random access pattern)
임의 접근 유형에서 연속적인 요청은 디스크상에 있는 임의의 블록에 대한 것이다.
이러한 각 요청에는 탐색이 필요하다.
초당 I/O 연산 수(IOPS), 즉 디스크에서 초당 가능한 임의 블록 접근 수는 접근 시간, 블록 크기 및 디스크의 데이터 전송 속도에 따라 다르다.
4KB 블록 크기의 현세대 디스크는 모델에 따라 50~200의 IOPS를 지원한다.
탐색당 소량(1블록)의 데이터만 읽히기 때문에 데이터 전송 속도는 순차적 접근 유형보다 훨씬 느리다.
- MTTF(mean time to failure)
평균적으로 시스템이 아무 실패 없이 계속해서 동작할 수 있는 시간을 의미한다.
4. RAID
디스크의 성능과 신뢰성 향상을 위해, 통칭하여 RAID(redundant arrays of independent disk)라 불리는, 여러 개의 디스크 드라이버를 하나의 논리적인 유닛으로 묶어주는 저장 기술이다.
과거 시스템 설계자는 저장장치 시스템을 몇 개의 값싼 디스크로 구성하는 것이 크고 비싼 디스크를 사용하는 것보다 비용면에서 효율적이라고 여겼다.
실제 RAID의 I가 초기에는 값이 싸다는 것(inexpensive)을 나타냈으며 현재는 독립적이라는 것을 나타낸다.
그러나 오늘날 모든 디스크는 물리적으로 작으며, 좀 더 큰 용량을 가진 디스크는 실제로 메가바이트당 비용이 더 적기도 하다.
RAID 시스템은 경제적인 이유보다는 오히려 좀 더 높은 신뢰성과 성능을 위해 사용된다.
RAID를 사용하는 또 다른 이유는 관리와 작업이 쉬워지기 때문이다.
4 - 1) 중복에 의한 신뢰성 향상
먼지 신뢰성에 대해 생각해보자.
N개의 디스크 집합에서 적어도 한 개의 디스크가 실패할 가능성이 딱 하나의 디스크가 실패할 확률보다 더 높다.
하나의 디스크에 대한 MTTF가 100,000시간, 약 11년이 넘는다고 가정하자.
그러면 디스크 100개로 구성된 하나의 배열에서 일부 디스크가 실패할 MTTF는 100,000/100 = 1,000시간, 약 42일이 되는데, 이는 전혀 길지 않다.
신뢰성 문제를 해결하는 방법으로 중복(redundancy)을 소개한다.
즉, 디스크 중복 기법은 보통 때는 필요하지 않지만, 디스크 실패 시 손실된 정보를 복원하는 데 사용할 여분의 정보를 저장하는 것이다.
중복을 도입하는 가장 간단한 방법은 모든 디스크를 복제하는 것이다. 이 기술을 미러링(mirroring, shadowing)이라고 한다.
논리 디스크는 두 개의 물리적인 디스크로 구성되고, 매번 쓰기를 두 디스크에 모두 수행한다.
논리 디스크 중 하나가 실패하면 그 데이터는 실패하지 않은 다른 디스크로부터 읽을 수 있다.
즉, 데이터 손실은 디스크 2개가 실패했을 때만 일어난다.
미러링 된 디스크의 MTTF는 개별 디스크의 MTTF와 데이터 복구 평균 시간(mean time to repair)에 달려 있다.
데이터 복구 평균 시간이란, 실패한 디스크를 교체해서 데이터를 다시 저장할 수 있도록 하는 데 평균적으로 걸리는 시간이다.
모든 상황을 고려해도 미러 디스크 시스템은 하나의 디스크를 사용하는 시스템보다 훨씬 더 높은 신뢰성을 제공한다.
오늘날 데이터 손실 평균 시간이 약 500,000~1,000,000시간 또는 55 ~ 110년인 미러 디스크 시스템을 이용할 수 있게 된다.
4 - 2) 병렬화에 의한 성능 향상
복수의 디스크에 병렬로 접근하여 얻는 이득에 대하여 살펴보자.
여러 개의 디스크에 걸쳐 데이터 분산(striping)을 통해 전송 속도 또한 향상할 수 있다.
가장 간단한 형태로 보면, 데이터 분산은 각 바이트의 비트를 복수의 디스크에 걸쳐 나누는 것으로 구성되어 있는데, 이런 형태의 분산을 비트 단위 분산(bit-level-striping)이라 한다.
예를 들어 8개의 디스크로 이루어진 그룹이 있다면 디스크 i에 쓴다. 이러한 그룹에서 모든 디스크가 모든 접근에 참여하므로 초당 처리할 수 있는 접근 수는 단일 디스크에서와 거의 같지만, 각 접근은 단일 디스크상에서 읽는 시간에 비해 8배 많은 데이터를 읽게 된다.
블록 단위 분산(block-level striping)은 블록을 여러 개의 디스크에 분산한다.
디스크 배열을 하나의 큰 디스크로 여기고 블록에 논리적 번호를 부여한다. 이때 블록 번호를 0부터 시작한다고 하자.
n개의 디스크 배열에서 블록 단위 분산은 디스크 배열의 논리적 블록 i를 (i mod n) + 1에 할당한다.
즉, 논리적 블록 i를 저장하기 위해 디스크의 floor(i/n) 번째 물리적 블록을 사용한다.
예를 들어, 여덟 개의 디스크가 있다면 논리적 블록 0은 디스크 1의 물리적 블록 0에 저장되고, 논리적 블록 11은 디스크 4의 물리적 블록 1에 저장된다.
큰 파일을 읽을 때 블록 단위 분산은 n개의 디스크로부터 병렬로 높은 데이터 전송 속도를 제공하면서 한 번에 n개의 블록을 가져올 수 있다.
한 블록을 읽을 때는 데이터 전송 속도가 하나의 디스크일 때와 같지만, 나머지 n-1개의 디스크는 자유롭게 다른 작업을 할 수 있다.
일반적으로 비트 단위 분산은 사용되지 않으며, 블록 단위 분산을 사용한다.
디스크 시스템의 병렬화에는 두 가지 주요한 목적이 있다.
1) 작은 접근의 처리량을 증가시키기 위해서 여러 작은 접근을 부하 분산(load-balance)하는 것
2) 큰 접근에 대한 응답 시간을 줄이기 위해 큰 접근을 병렬화 하는 것
4 - 3) RAID 수준
미러링은 신뢰성이 있지만 값이 비싸다. 분산은 높은 데이터 전송 속도를 제공하지만 신뢰성을 향상하지 못한다.
이 때문에 대안으로 디스크 분산을 "패리티 비트(parity bit)"와 결합함으로써 좀 더 저렴한 비용으로 중복을 제공하려 한다.
이러한 방식에는 서로 다른 비용-성능의 상관관계가 있는데, 이를 RAID 수준으로 분류한다.
▶ RAID 수준 0
수준 0은 블록 단위로 분산하는 디스크 배열을 말한다. 그러나 미러링은 하지 않는다.
▶ RAID 수준 1
수준 1은 분산을 하는 미러링 디스크를 의미한다.
4개의 디스크만이 실제 데이터를 저장하고 있고, 나머지 C 4개는 미러링을 하고 있다.
▶ RAID 수준 5
블록이 상호 배치되고 분산된 패리티(block-interleaved distributed parity)를 나타낸다.
모든 N+1개의 디스크에 데이터와 페리티를 분할시킨다. N개의 논리적 블록의 각 집합에 대해, 디스크 중 하나는 패리티를 저장하고 다른 N개의 디스크에는 블록을 저장한다.
N개의 블록을 갖는 서로 다른 집합에 대해 페리티 블록을 서로 다른 디스크상에 나누어 저장한다.
따라서 모든 디스크가 읽기 요청을 하는데 참여한다.
위 그림을 보면 모든 디스크에 걸쳐서 패리티 P를 분산 저장한다.
예를 들어 5개의 디스크 배열이 있고, 패리티 블록을 Pk로 표시하면 논리적 블록 4k, 4k+1, 4k+2, 4k+3 디스크 (k mod 5)에 저장한다.
4k부터 4k+3까지 네 개의 테이블 블록을 나머지 네 개 디스크의 대응하는 블록에 저장한다.
다음은 0부터 19까지 20개의 블록과 패리티 블록을 어떻게 배치하는지 보여준다.
패리티 블록은 같은 디스크에 있는 블록을 위한 패리티를 저장할 수 없다.
만약 디스크가 문제가 생기면 데이터뿐만 아니라 패리티도 손실되어 복구할 수 없게 되기 때문이다.
▶ RAID 수준 6
수준 6은 P+Q 중복 방법인데, RAID 수준 5와 유사하지만 복수의 디스크 실패를 대비하여 중복된 정보를 여분으로 저장한다.
수준 6은 패리티를 사용하지 않는 대신에 Reed-Solomon 코드 같은 에러 정정 코드를 사용한다.
중복 데이터의 두 개의 비트를 데이터의 모든 네 개의 비트를 위해 저장하여 시스템은 2개의 디스크 실패에 대비할 수 있다.
추가로 다음 글 참고
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=nicehosting&logNo=220577068983
4 - 4) 하드웨어 사안
RAID는 하드웨어 수준의 변경 없이 소프트웨어만 수정해서 구현할 수 있는데, 이러한 RAID의 구현을 소프트웨어 RAID라 한다.
하지만 RAID 지원을 위한 특수 목적의 하드웨어를 구축하면 상당한 이득을 볼 수 있는데, 이처럼 특수한 하드웨어의 지원을 받는 시스템을 하드웨어 RAID라 부른다.
하드웨어 RAID는 비휘발성의 RAM을 사용하여 write를 수행하기 전 해당 write를 기록할 수 있다.
정전 발생 시 시스템을 복구할 때, 시스템은 비휘발성 RAM으로부터 완성되지 않은 쓰기에 대한 정보를 모두 검색해서 그 쓰기를 완료할 수 있다. 이후 정상작동한다.
반대로 소프트웨어 RAID는 정전 전에 부분적으로 기록되었을 수 있는 블록을 감지하기 위한 추가 작업을 수행해야 합니다.
이러한 감지 스캔을 시간이 오래 걸리며, 디스크에서 사용 가능한 대역폭 일부를 사용하여 백그라운드에서 수행된다.
RAID 시스템은 이 단계 동안 재동기화(resynchronizing) 한다고 한다.
재동기화를 하는 동안 정상적인 읽기 및 쓰기를 허용하지만, 이 단계에서 오류가 발생하면 쓰기가 완료되지 않은 블록의 데이터가 모두 손실될 수가 있다. 하드웨어 RAID는 이러한 제약이 없다.
모든 쓰기가 완료되더라도 이전에 성공적으로 쓰기가 되었던 부분이 읽을 수 없게 되는 디스크 내의 섹터의 작은 변화가 있을 수 있다.
각 섹터의 데이터 손실은 제조 결함, 인접한 트랙에서 반복적인 쓰기가 일어날 때 발생할 수 있는 트랙 상의 데이터 충돌과 같은 이유로 발생한다.
이전에 성공적으로 write 된 데이터의 손실은 때때로 지연 실패(latent failure) 또는 비트 부식(bit rot)으로 언급된다.
이러한 데이터 손실의 가능성을 최소화하기 위해서 좋은 RAID 컨트롤러는 scrubbing을 수행한다.
즉, 디스크가 가동되지 않는 동안 모든 디스크의 모든 섹터를 읽고 만약 어떤 섹터를 읽지 못한다면, 데이터를 RAID 구조상의 여분의 디스크로부터 복구하고 해당 섹터를 다시 쓴다.
핫 스와핑(hot swapping) 허용을 위해 서버 하드웨어를 종종 설계한다.
여기서 핫 스와핑이란, 전기를 끄지 않고도 결함이 있는 디스크를 제거하고 새로운 것으로 교체할 수 있는 것을 말한다.
사실 오늘날 많은 시스템들이 해당 시스템 정지 없이 실패한 디스크를 교체하여 하루 24시간, 일주일에 7일 운영하는, 24 x 7 일정으로 운영되고 있다. 더욱이 많은 RAID 구현은 각 배열을 위한 여분의 디스크를 할당한다.
디스크가 실패하면 여분의 디스크를 즉시 교체용으로 사용한다. 따라서 데이터 복구 평균 시간이 크게 줄어들고, 데이터 손실 가능성이 최소화된다.
5. 디스크 블록 접근
대부분의 디스크 I/O를 담당하는 질의 처리 서브시스템과 함께 데이터베이스 시스템이 디스크 I/O에 대한 요청을 생성한다.
각 요청은 디스크의 디스크 식별자와 논리 블록 번호로 구성된다. 데이터베이스 데이터가 OS파일에 저장되는 경우, I/O 요청은 파일 식별자와 파일 내의 블록 번호로 구성되며, 운영체제는 데이터베이스를 위해 디스크와 메인 메모리 사시에 데이터를 전송한다.
앞서 살펴본 것처럼, 디스크 블록에 대한 일련의 요청을 순차적 접근 유형 또는 임의 접근 유형으로 분류한다.
순차적 접근 유형에서 연속적인 요청(successive request)은 같은 트랙 혹은 인접한 트랙에 있는 연속적인 블록을 대상으로 한다.
이와 대조적으로 임의 접근 유형에서 연속적인 데이터의 요청은 디스크상에 임의 위치에 있는 블록을 대상으로 한다.
각 요청은 탐색 시간이 필요해서 시간이 길어지고 초당 I/O 연산 수가 줄어들게 된다.
접근 횟수를 줄이고, 임의 접근 횟수를 최소화 함으로써 블록에 대한 접근 속도를 향상하기 위한 많은 기법을 개발해 왔다.
▶ 버퍼링 (Buffering)
다음에 있을 요청을 충족하기 위해 디스크로부터 읽는 블록을 메모리 버퍼 내에 임시로 저장하는 기법이다.
버퍼링은 운영체제와 데이터베이스 시스템 모두에서 잘 동작한다.
▶ 미리 읽기 (Read-ahead)
디스크 블록에 접근할 때, 블록에 대한 요청이 없더라도 동일 트랙 내의 연속적인 블록을 일단 메모리 내의 버퍼로 읽어 들이는 기법이다.
순차 접근하는 경우, 이러한 미리 읽기는 많은 블록이 요청되더라도 이미 메모리에 있기 때문에 블록 읽기당 디스크 탐색과 회전 지연에 낭비되는 시간을 최소화할 수 있다.
또한 운영체제는 운영체제 파일의 연속 블록에 대한 미리 읽기를 일상적으로 수행한다.
하지만 임의 블록 접근의 경우 미리 읽기는 크게 유용하지 않다.
▶ 스케줄링(Scheduling)
실린더에 있는 몇 개의 블록을 디스크에서 메인 메모리로 전송할 필요가 있다면, 헤드 아래로 지나갈 순서대로 블록을 요청함으로써 접근 시간을 줄일 수 있다.
만약 원하는 블록이 다른 실린더에 있다면 디스크 암의 움직임을 최소화하는 순서대로 디스크에 해당 블록을 요청하는 것이 이득이다.
디스크 암 스케줄링(disk-arm-scheduling) 알고리즘은 처리할 수 있는 수를 최대한 증가시키는 방식으로 트랙 접근 순서를 정하려고 한다.
일반적으로 승강기 알고리즘(elevator algorithm)을 사용한다.
디스크 컨트롤러는 성능의 향상을 위해 읽기 순서를 재구성하는 일을 수행한다. 이는 디스크 컨트롤러가 디스크 블록의 구성, 디스크 판의 회전 위치, 그리고 디스크 암의 위치에 대해 상세히 알고 있기 때문이다.
이러한 재정렬을 활성화하려면 디스크 컨트롤러 인터페이스에서 대기열에 여러 요청을 추가할 수 있어야 한다.
요청 순서와 다른 순서로 결과가 반환될 수 있다.
▶ 파일 구성(File organization)
블록 접근 시간을 줄이기 위해 데이터에 접근하고자 하는 방식에 가장 부합하는 방식으로 디스크의 블록을 조직할 수 있다.
예를 들어 연속적으로 파일에 접근하고 싶다면, 그 파일의 모든 블록을 인접한 실린더에 연속적으로 있도록 하는 것이다.
최신 OS에서 정확한 블록 위치를 숨기지만, 서로 인접한 블록에 연속 번호를 부여하는 논리적 블록 번호를 사용한다.
연속되는 번호를 매긴 디스크 블록에 파일의 연속 블록(consecutive block)을 할당함으로써 운영체제는 파일을 순차적으로 저장할 수 있다.
하나의 긴 연속 블록의 순차로 대용량 파일을 저장하면 디스크 블록 할당에 문제가 생긴다.
이를 위해 OS에서 한 번에 몇 개의 연속 블록, 즉 확장영역(extent)을 파일에 할당한다.
파일에 할당된 다른 확장영역은 디스크에서 서로 인접하지 않을 수 있다.
블록이 무작위로 할당되는 경우 블록당 하나의 탐색 대신에 파일에 대한 순차 접근은 확장영역당 하나의 탐색이 필요하다.
충분히 큰 확장영역을 사용하면 데이터 전송 비용과 관련된 탐색 비용을 최소화할 수 있다.
시간이 흐르면서 여러 개의 작은 append가 있는 순차 파일은 단편화(fragmented)될 수 있다.
즉 파일의 블록이 디스크 전체에 흩어지게 된 것이다. 이러한 단편화를 줄이기 위해 시스템은 디스크에 있는 데이터의 백업본을 만들어서 전체 디스크를 다시 저장할 수 있다. 이때 복원하면서 파일의 블록을 거의 인접하게 저장한다.
▶ 비휘발성 쓰기 버퍼(Nonvolatile write buffer)
메인 메모리 내용은 정전이 되면 잃어버리기 때문에 시스템 충돌에도 가능한 살아 있게 하려고 데이터베이스 갱신에 대한 정보는 디스크에 기록되어야 한다.
이러한 이유로 트랜잭션 처리 시스템 같은 갱신 중심 데이터베이스 응용 프로그램의 성능은 대부분 디스크의 쓰기 속도에 달려있다.
NVRAM(non-volatile random-access memory)를 사용하여 디스크 쓰기 속도를 높일 수 있다.
NVRAM의 내용은 정전 시 손실되지 않는다. 초기에는 배터리 백업 RAM을 사용하여 NVRAM을 구현했지만, 현재 비휘발성 쓰기 버퍼링에 사용하는 주요한 매체는 플래시 메모리이다.
NVRAM은 데이터베이스 시스템이 디스크에 블록을 write 하도록 요청하면, 디스크 컨트롤러는 해당 블록을 비휘발성 쓰기 버퍼에 기록하고 그 쓰기가 성공적으로 완료되었음을 즉시 운영체제에 알리는 것이다.
비휘발성 버퍼를 사용하지 않고 이러한 쓰기 재순서화를 수행하면 시스템 충돌 시 데이터베이스 상태가 일관되지 않을 수 있다.
DB가 블록을 write 하도록 요청하면 NVRAM 버퍼가 가득 찬 경우에만 시스템은 지연을 알아챌 수 있다.
시스템 충돌로부터 복구하자마자 NVRAM에 계류 중인 버퍼에 채워진 쓰기가 디스크에 다시 기록된다.
NVRAM 버퍼는 특정 고급 디스크에서 찾아볼 수 있으나 요즘은 RAID컨트롤러에서 더 자주 발견된다.
'CS > DB (2022-1)' 카테고리의 다른 글
[DB] 인덱싱 (2) | 2022.10.21 |
---|---|
[DB] 데이터 저장 장치 구조 (1) | 2022.10.18 |
[DB] E-R 모델을 사용한 데이터베이스 설계 (0) | 2022.10.06 |
[DB] 고급 SQL (1) | 2022.10.04 |
[DB] 중급 SQL - 2 (1) | 2022.09.30 |
댓글