메모리에서만 PostgreSQL 실행

Bilal Shahid 2023년6월20일
  1. 인메모리 데이터베이스 소개
  2. 메모리에 있는 데이터베이스를 사용하는 PostgreSQL 지원 여부
메모리에서만 PostgreSQL 실행

우리가 만든 데이터베이스는 하드 디스크 또는 SSD(Solid State Drive)의 영구 메모리에 저장됩니다.

그러나 이 메모리는 RAM(Random Access Memory)보다 느립니다. 그래서 더 효율적이고 빠르게 하기 위해 메모리라는 램에 데이터베이스를 만들어서 사용하기도 합니다.

이 기사에서는 PostgreSQL의 메모리에서 데이터베이스를 사용하는 방법에 대해 설명합니다. 그러나 먼저 메모리에서 데이터베이스를 실행한다는 것이 무엇을 의미하는지, 다른 플랫폼에서는 어떻게 허용하는지 알아보겠습니다.

인메모리 데이터베이스 소개

메모리 내 데이터베이스(IMDB)는 디스크 드라이브 대신 컴퓨터의 RAM 또는 주 메모리에 저장되고 실행되는 데이터베이스입니다. 주 메모리에서 데이터를 검색하는 데 CPU에서 더 적은 명령이 필요하므로 보다 효율적이고 빠른 성능을 생성하기 위해 수행됩니다.

따라서 이러한 데이터베이스는 빠른 응답 시간이 필요하기 때문에 주로 실시간 시스템 및 게임 응용 프로그램에 사용됩니다.

이 속도는 데이터의 변환 또는 암호화를 수반하지 않기 때문에 보장됩니다. 이러한 방식으로 데이터는 바로 사용할 수 있는 형태로 유지되므로 응답 시간이 빨라집니다.

메모리에서 데이터베이스를 사용할 때의 한 가지 단점은 RAM이 휘발성이라는 것입니다. 또한 RAM은 영구 저장 솔루션이 아니기 때문에 전원이 끊기거나 데이터베이스 또는 서버가 충돌하면 데이터를 잃게 됩니다.

그러나 플래시 메모리 및 NVRAM(Non-Volatile Random Access Memory)과 같은 기술은 메모리 내 데이터베이스의 이러한 변동성에 대응하는 데 사용됩니다. 또한 많은 SQL 플랫폼이 메모리 내 데이터베이스를 지원합니다.

예를 들어 SQL Server는 In-Memory OLTP가 있기 때문에 메모리에서 데이터베이스 실행을 지원합니다. SQL Server에서 WITH (MEMORY_OPTIMIZED = ON) 또는 이와 유사한 명령을 생성하여 테이블을 메모리에 저장할 수 있습니다.

그러나 주목할만한 점은 PostgreSQL에서 할 수 있습니까? 이 문서에는 이 질문에 대한 답변이 포함되어 있습니다.

메모리에 있는 데이터베이스를 사용하는 PostgreSQL 지원 여부

불행하게도 PostgreSQL은 메모리에서 데이터베이스 또는 그 구성 요소를 사용하는 것을 지원하지 않습니다. 주된 이유는 PostgreSQL이 컴파일 언어인 C로 구현되었기 때문입니다.

그러나 메모리에서 데이터베이스를 실행하는 것은 유익한 품질이며 주로 결과를 빠르게 하기 위해 단위 테스트에 사용됩니다. 메모리 내 데이터베이스 지원이 없는 경우 개발자는 PostgreSQL에서 이를 어떻게 수행합니까?

이 기사에서 몇 가지 대안을 살펴보겠습니다. 이를 수행하는 한 가지 방법은 테이블스페이스를 생성하는 것입니다. 이것이 무엇이며 좋은 대안인지 아닌지 살펴봅시다.

PostgreSQL에서 TABLESPACE 사용

PostgreSQL의 테이블스페이스는 생성 중에 데이터베이스 관리자가 위치를 정의할 수 있는 데이터베이스 개체입니다. 테이블스페이스는 데이터의 효율성 요구에 따라 메모리 위치를 할당하는 데 도움이 됩니다.

예를 들어 tablespace를 사용하여 자주 액세스하는 테이블을 SSD와 같은 빠른 메모리에 저장하고 덜 필요한 데이터는 하드 디스크와 같은 느린 메모리에 저장할 수 있습니다.

마찬가지로 테이블스페이스를 사용하여 일부 데이터를 RAM에 저장할 수 있으므로 메모리에서 데이터베이스를 사용하는 것과 동일한 효과를 얻을 수 있습니다. 테이블스페이스 생성 구문은 다음과 같습니다.

CREATE TABLESPACE tablespace_name LOCATION '/ssd/postgresql/data';

LOCATION 키워드 뒤에 tablespace를 생성하려는 주소의 심볼릭 링크를 추가합니다. 그러나 PostgreSQL의 메모리에서 tablespaces를 사용하는 것은 권장되지 않습니다. 공식 PostgreSQL 문서에 경고로 추가되었습니다.

RAM의 변동성으로 인해 시스템 충돌이나 우발적인 삭제로 인해 테이블스페이스가 손실되면 데이터베이스 클러스터의 모든 데이터를 읽을 수 없게 됩니다. 따라서 메모리에서 테이블스페이스를 사용하는 것은 좋지 않습니다.

그렇다면 어떤 옵션이 우리에게 남을까요? 먼저 고려할 수 있는 또 다른 대안을 살펴보겠습니다. 더 빠른 응답 시간을 위해 일회용 PostgreSQL 인스턴스를 생성하는 것입니다.

버리기 PostgreSQL 인스턴스 만들기

이 방법을 이해하기 위해 단위 테스트의 예를 살펴보겠습니다.

데이터베이스를 테스트하려면 빠르고 효율적인 성능 속도가 필요합니다. PostgreSQL에서 이를 수행할 수 있는 한 가지 방법은 사용 후 삭제되는 일회용 PostgreSQL 인스턴스를 생성하는 것입니다.

이 방법은 initdb 명령을 사용하여 PostgreSQL에서 새 데이터베이스 클러스터를 생성해야 합니다. 데이터베이스 클러스터는 동일한 서버에서 실행되는 데이터베이스 그룹입니다.

initdb 명령의 구문은 다음과 같습니다.

initdb [option...] [ --pgdata | -D ] directory

이 명령을 사용하는 방법의 예는 다음 쿼리와 같이 새 데이터베이스 클러스터를 생성하는 것입니다.

initdb --auth=trust --username=postgres -D /path/to/temp/datadir

이 명령은 임시 저장소 데이터베이스 클러스터를 만드는 데 도움이 됩니다. 또한 기본 postgres 데이터베이스에 신뢰를 부여합니다.

이제 위의 쿼리에 지정된 사용자 postgres로 생성된 데이터베이스 클러스터에 연결해야 합니다. 그런 다음 CREATE USER 또는 CREATE DATABASE와 같은 생성 명령을 수행한 다음 코드를 단위 테스트에 넘겨야 합니다.

테스트를 완료한 후 pg_ctl 명령을 사용하여 서버를 중지하고 datadir 데이터 디렉토리를 삭제합니다. 이 프로세스는 메모리에서 데이터베이스를 실행하는 것과 유사하게 테스트하는 동안 더 빠른 응답 시간을 허용합니다.

따라서 PostgreSQL은 SQL Server나 MySQL과 달리 메모리에 있는 데이터베이스 사용을 지원하지 않는다는 결론을 내릴 수 있습니다.

RAM에서 위치를 지정하여 인메모리 테이블스페이스를 생성할 수 있지만 심각한 데이터 손실이 발생할 수 있으므로 되돌리려면 많은 노력이 필요할 수 있으므로 권장하지 않습니다.

테스트를 위한 PostgreSQL의 응답 시간을 단축하기 위해 일회용 PostgreSQL 인스턴스를 생성하고 그에 따라 구성할 수 있습니다. 이러한 개념을 명확하게 이해할 수 있기를 바랍니다. 계속 공부하다!

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub