이 페이지에서는 AlloyDB Omni에서 디스크 캐싱을 프로비저닝, 설정, 사용하는 방법을 설명하여 AlloyDB Omni 설치의 성능을 높이는 방법을 설명합니다.
AlloyDB Omni 디스크 캐시는 표준 PostgreSQL 메모리 내 공유 버퍼 외에도 솔리드 스테이트 드라이브 (SSD)와 같은 빠른 스토리지에 버퍼를 저장할 수 있도록 지원합니다. 디스크 캐싱은 느린 저장소에 데이터 디렉터리가 있는 AlloyDB Omni 설치에서 데이터 검색을 가속화합니다.
PostgreSQL 공유 버퍼와 마찬가지로 AlloyDB Omni 디스크 캐시는 영구적이지 않으므로 다시 시작하면 캐시된 데이터가 손실됩니다.
기본적으로 AlloyDB Omni 디스크 캐시는 파일 시스템에서 보고된 모든 스토리지를 사용합니다. omni_disk_cache_file_size
매개변수를 사용하여 데이터 캐싱을 위해 예약된 스토리지 양을 정의할 수 있습니다.
AlloyDB Omni 디스크 캐시 사용 설정
AlloyDB Omni에 디스크 캐시를 사용 설정하는 단계는 AlloyDB Omni를 컨테이너에서 실행하는지 또는 Kubernetes 클러스터에서 실행하는지에 따라 다릅니다.
단일 서버
디스크 프로비저닝 및 파일 시스템 만들기
AlloyDB Omni 디스크 캐시의 경우 디스크 또는 여러 디스크에 파일 시스템을 만들고 AlloyDB Omni을 사용하여 컨테이너 내에 마운트합니다. 또한 mdadm
또는 lvm
와 같은 유틸리티를 사용하여 여러 디스크를 사용하여 용량을 함께 풀링하고 모든 파일 시스템을 사용할 수 있습니다.
다음 단계에서는 NVMe SSD를 사용하는 Ubuntu Compute Engine 인스턴스에서 lvm
및 ext4
를 사용하는 방법을 보여줍니다.
사용 가능한 모든 물리적 기기에서 볼륨 그룹을 만듭니다.
nvme_prefix="STORAGE_PREFIX" nvme_list=$(ls "$nvme_prefix"*) sudo vgcreate VOLUME_GROUP ${nvme_list}
다음을 바꿉니다.
STORAGE_PREFIX
: 비휘발성 메모리 익스프레스 (NVMe) 인터페이스를 사용하여 가상 머신에 연결된 대상 로컬 디스크 경로의 접두사입니다. 예를 들어 Google Cloud의 경우 NVMe 기기 경로는 항상/dev/nvme0n
로 시작합니다.VOLUME_GROUP
: SSD가 결합된 볼륨 그룹의 이름입니다(예:omni-disk-cache-volume
).
-
이전 단계의 볼륨 그룹의 여유 용량으로 논리 볼륨을 만들려면 다음 명령어를 사용합니다.
sudo lvcreate -n LOGICAL_VOLUME -l 100%FREE VOLUME_GROUP
LOGICAL_VOLUME
을 LVM에서 파티션으로 취급하는 논리 볼륨의 이름(예:omni_disk_cache_device
)으로 바꿉니다. - 논리 볼륨에
ext4
파일 시스템을 만듭니다. 필요한 경우 데이터 보안에 적용되는 다른ext4
옵션을 지정할 수 있습니다.sudo mkfs.ext4 /dev/VOLUME_GROUP/LOGICAL_VOLUME
호스트 머신에서 마운트 지점 역할을 하는 디렉터리를 만들고 파일 시스템을 마운트하려면 다음 명령어를 사용합니다.
sudo mkdir /OMNI_DISK_CACHE_DIRECTORY sudo mount /dev/VOLUME_GROUP/LOGICAL_VOLUME /OMNI_DISK_CACHE_DIRECTORY
OMNI_DISK_CACHE_DIRECTORY
을 마운트 지점으로 사용되는 디렉터리의 이름 또는 디렉터리 경로(예:omni_disk_cache_directory
)로 바꿉니다.
AlloyDB Omni 내에서 캐시 디렉터리 마운트
컨테이너에서 실행되는 AlloyDB Omni에 디스크 캐시를 사용 설정하기 전에 AlloyDB Omni 내에서 캐시 디렉터리를 마운트해야 합니다.
Docker 이미지에서 AlloyDB Omni를 설치하고 맞춤설정하는 방법에 관한 자세한 내용은 AlloyDB Omni 설치 맞춤설정을 참고하세요.
AlloyDB Omni를 실행하는 Docker 컨테이너 내에서 OMNI_DISK_CACHE_DIRECTORY
를 마운트하려면 다음 명령어를 사용합니다.
Docker
sudo docker run --name CONTAINER_NAME \ -e POSTGRES_PASSWORD=PASSWORD \ -e PGDATA=/var/lib/postgresql/data/pgdata \ -v DATA_DIR:/var/lib/postgresql/data \ -v /OMNI_DISK_CACHE_DIRECTORY:/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER \ -d google/alloydbomni
다음을 바꿉니다.
CONTAINER_NAME
: 새 AlloyDB Omni 컨테이너에 할당할 이름입니다(예:my-omni
).PASSWORD
: PostgreSQL 데이터베이스 루트 관리자의 비밀번호입니다.DATA_DIR
: AlloyDB Omni에서 데이터 디렉터리에 사용하려는 파일 시스템 경로입니다.CACHE_DIRECTORY_PATH_INSIDE_CONTAINER
: 호스트 머신의 마운트 지점에 매핑되는 AlloyDB Omni 컨테이너 내의 캐시 디렉터리입니다. 예를 들어 컨테이너 내 캐시 디렉터리의 값에 따라OMNI_DISK_CACHE_DIRECTORY
와 유사한/omni_disk_cache_directory
또는/disk/cache/inside/container
이 됩니다.
Podman
podman run --name CONTAINER_NAME \ -e POSTGRES_PASSWORD=PASSWORD \ -e PGDATA=/var/lib/postgresql/data/pgdata \ -v DATA_DIR:/var/lib/postgresql/data \ -v /OMNI_DISK_CACHE_DIRECTORY:/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER \ -d docker.io/google/alloydbomni
다음을 바꿉니다.
CONTAINER_NAME
: 새 AlloyDB Omni 컨테이너에 할당할 이름입니다(예:my-omni
).PASSWORD
: PostgreSQL 데이터베이스 루트 관리자의 비밀번호입니다.CACHE_DIRECTORY_PATH_INSIDE_CONTAINER
: 호스트 머신의 마운트 지점에 매핑되는 AlloyDB Omni 컨테이너 내의 캐시 디렉터리입니다. 예를 들어 컨테이너 내 캐시 디렉터리의 값에 따라OMNI_DISK_CACHE_DIRECTORY
와 유사한/omni_disk_cache_directory
또는/disk/cache/inside/container
이 됩니다.
마운트된 OMNI_DISK_CACHE_DIRECTORY
에 대한 전체 액세스 권한을 부여하려면 다음 명령어를 사용합니다.
Docker
sudo docker exec -it CONTAINER_NAME chown postgres:postgres /CACHE_DIRECTORY_PATH_INSIDE_CONTAINER sudo docker exec -it CONTAINER_NAME chmod -R a+rw /CACHE_DIRECTORY_PATH_INSIDE_CONTAINER
Podman
sudo podman exec -it CONTAINER_NAME chown postgres:postgres /CACHE_DIRECTORY_PATH_INSIDE_CONTAINER sudo podman exec -it CONTAINER_NAME chmod -R a+rw /CACHE_DIRECTORY_PATH_INSIDE_CONTAINER
컨테이너에서 실행되는 AlloyDB Omni에 AlloyDB Omni 디스크 캐시 사용 설정
데이터베이스에 AlloyDB Omni 디스크 캐시를 사용 설정하려면 마운트된 캐시 디렉터리에 Docker 컨테이너 내부에서 액세스할 수 있는지 확인한 후 적절한 Grand Unified Configuration (GUC) 매개변수를 설정하세요.
-
슈퍼 사용자로 컨테이너화된 AlloyDB Omni 데이터베이스에 연결하려면 다음 명령어를 사용하세요.
Docker
sudo docker exec -it CONTAINER_NAME psql -h localhost -U postgres
Podman
sudo podman exec -it CONTAINER_NAME psql -h localhost -U postgres
-
매개변수 값을 설정하려면 AlloyDB Omni 데이터베이스 내에서 다음 명령어를 사용합니다.
alter system set omni_disk_cache_enabled=on; alter system set omni_disk_cache_directory='/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER';
-
기본적으로 AlloyDB Omni는 파일 시스템의 사용 가능한 모든 공간을 사용합니다. 필요한 경우
omni_disk_cache_file_size
매개변수를 사용하여 기본값을 재정의할 수 있습니다.alter system set omni_disk_cache_file_size=SIZE_IN_MB;
-
캐싱 구성 매개변수 변경사항이 적용되도록 AlloyDB Omni로 실행 중인 컨테이너를 다시 시작합니다.
Docker
sudo docker restart CONTAINER_NAME
Podman
sudo podman restart CONTAINER_NAME
Kubernetes
일반 볼륨에서 디스크 캐시 사용 설정
일반 볼륨을 사용하여 디스크 캐시를 사용 설정할 수 있습니다.
AlloyDB Omni Kubernetes 연산자의 일반 볼륨에서 디스크 캐시를 사용 설정하려면 사전에 준비된 영구 볼륨과 storageClass
가 필요합니다.
예를 들어 GKE를 사용 중이고 영구 볼륨과 storageClass
가 준비되지 않은 경우 일반 볼륨에서 디스크 캐시를 사용 설정하기 전에 다음을 실행해야 합니다.
- 로컬 SSD 기반 스토리지를 사용하여 클러스터를 만들었습니다.
- 로컬 볼륨 정적 프로비저닝 도구 실행의 1단계에 따라 볼륨을 ext4 파일 시스템으로 포맷했습니다.
- 스토리지 기기의 영구 저장소를 정의하는
storageClass
를 사용하여 클러스터의 각 SSD에 대해 영구 볼륨을 수동으로 만들었습니다.
데이터베이스의 일반 볼륨에서 디스크 캐시를 사용 설정하려면 다음 단계를 완료하세요.
데이터베이스 클러스터 매니페스트를 수정하여
spec
섹션의features
섹션에ultraFastCache
속성을 추가합니다.apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: CLUSTER_NAME spec: databaseVersion: "15.7.0" primarySpec: features: ultraFastCache: cacheSize: DISK_CACHE_SIZE genericVolume: storageClass: "STORAGE_CLASS_NAME" ...
다음을 바꿉니다.
DB_CLUSTER_NAME
: 데이터베이스 클러스터의 이름입니다. 이는 데이터베이스 클러스터를 만들 때 선언한 데이터베이스 클러스터 이름과 동일합니다.DISK_CACHE_SIZE
: 캐시 크기입니다(예:100Gi
).shared_buffers
보다 커야 합니다. 이 필드는 선택사항입니다. 이 필드의 값을 지정하지 않으면 AlloyDB Omni는 디스크에 남은 모든 공간을 사용합니다. 이는 컨테이너의 AlloyDB Omni와 Kubernetes 클러스터의 AlloyDB Omni 모두에 적용됩니다.STORAGE_CLASS_NAME
: 초고속 캐시 볼륨의storage class
이름입니다(예:local-storage
).
- 매니페스트를 다시 적용합니다.
로컬 볼륨에서 디스크 캐시 사용 설정
로컬 볼륨을 사용하려면 영구 볼륨을 만들 필요가 없습니다. 대신 다음 최적화를 사용할 수 있습니다.
예를 들어 GKE를 사용 중이며 영구 볼륨과 storageClass
가 준비되지 않은 경우 로컬 볼륨에서 디스크 캐시를 사용 설정하기 전에 다음을 실행해야 합니다.
- 로컬 SSD 기반 스토리지를 사용하여 클러스터를 만들었습니다.
- 로컬 볼륨 정적 프로비저닝 도구 실행의 1단계에 따라 볼륨을 ext4 파일 시스템으로 포맷했습니다.
데이터베이스의 로컬 볼륨에서 디스크 캐시를 사용 설정하려면 다음 단계를 따르세요.
데이터베이스 클러스터 매니페스트를 수정하여
spec
섹션의features
섹션에ultraFastCache
속성을 추가합니다.apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: CLUSTER_NAME spec: databaseVersion: "15.7.0" primarySpec: features: ultraFastCache: cacheSize: DISK_CACHE_SIZE localVolume: path: "LOCAL_VOLUME_PATH" nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: "LABEL_KEY" operator: "OPERATOR_VALUE" values: - "LABEL_KEY_VALUE" ...
다음을 바꿉니다.
CLUSTER_NAME
: 데이터베이스 클러스터의 이름입니다. 이는 데이터베이스 클러스터를 만들 때 선언한 데이터베이스 클러스터 이름과 동일합니다.DISK_CACHE_SIZE
: 캐시 크기입니다(예:100Gi
).shared_buffers
보다 커야 합니다. 이 필드는 선택사항입니다. 이 필드의 값을 지정하지 않으면 AlloyDB Omni는 디스크에 남은 모든 공간을 사용합니다. 이는 컨테이너의 AlloyDB Omni와 Kubernetes 클러스터의 AlloyDB Omni 모두에 적용됩니다.STORAGE_CLASS_NAME
: 스토리지 클래스의 이름입니다.LOCAL_VOLUME_PATH
: 로컬 볼륨의 경로입니다(예:/mnt/disks/raid/0
).LABEL_KEY
: 위치 표시기 역할을 하고 클러스터 전반에서 균일한 포드 분배를 용이하게 하는 키의 노드 라벨입니다(예:cloud.google.com/gke-local-nvme-ssd
).OPERATOR_VALUE
: 키와 값 집합의 관계입니다(예:In
). 매개변수를 다음 중 하나로 설정합니다.-
In
: 값 배열은 비어 있지 않아야 합니다. -
NotIn
: 값 배열은 비어 있지 않아야 합니다. -
Exists
: 값 배열은 비어 있어야 합니다. -
DoesNotExist
: 값 배열은 비어 있어야 합니다. -
Gt
: 값 배열에는 정수로 해석되는 단일 요소가 있어야 합니다. -
Lt
: 값 배열에는 정수로 해석되는 단일 요소가 있어야 합니다.
-
LABEL_KEY_VALUE
: 라벨 키의 값입니다(예:true
). 다음과 같이 매개변수를 문자열 값 배열로 설정합니다.- 연산자가
In
또는NotIn
인 경우 값 배열은 비어 있지 않아야 합니다. - 연산자가
Exists
또는DoesNotExist
인 경우 값 배열은 비어 있어야 합니다. - 연산자가
Gt
또는Lt
인 경우 값 배열에는 정수로 해석되는 단일 요소가 있어야 합니다.
- 연산자가
- 매니페스트를 다시 적용합니다.
디스크 캐시 구성 확인
AlloyDB Omni 디스크 캐시를 사용 설정한 후 iotop
또는 iostat
와 같은 사용 가능한 유틸리티를 사용하여 디스크의 읽기 및 쓰기 활동을 모니터링하여 디스크 캐시에 액세스하는지 확인합니다.
또한 AlloyDB Omni 디스크 캐시가 열려 있는지 확인할 수 있습니다.
AlloyDB Omni의 디스크 캐시 구성을 확인하는 단계는 AlloyDB Omni를 컨테이너에서 실행하는지 또는 Kubernetes 클러스터에서 실행하는지에 따라 다릅니다.
단일 서버
Docker
sudo docker logs CONTAINER_NAME 2>&1 | grep "opened omni disk cache"
Podman
sudo podman logs CONTAINER_NAME 2>&1 | grep "opened omni disk cache"
Kubernetes
kubectl exec -i $DATABASE_POD -c database -n $DBCLUSTER_NAMESPACE -- cat /obs/diagnostic/postgresql.log | grep "opened omni disk cache"
디스크 캐싱이 올바르게 구성되면 로그에 Successfully opened omni disk cache ...
메시지가 표시됩니다.