계층형 저장소 설정하기
계층형 저장소 설정하기
Pulsar의 계층형 저장소는 오래된 백로그 데이터를 장기 저장소로 옮겨 BookKeeper의 저장 공간을 아끼게 해주는 기능이에요. 이 글에서는 계층형 저장소를 실제로 설정하고 사용하는 방법을 하나씩 안내해 드릴게요. S3, GCS, 로컬 파일시스템을 오프로드 대상으로 사용하는 설정을 모두 살펴볼 거예요.
출처: 문서
본문
Pulsar는 오래된 백로그 데이터를 장기 저장소로 오프로드해서 BookKeeper의 공간을 확보하고 저장 비용을 줄이는 계층형 저장소 기능을 제공해요. 이 쿡북은 Pulsar 클러스터에서 계층형 저장소를 사용하는 방법을 안내해요.
- 계층형 저장소는 Apache jclouds를 사용해 장기 저장소로 Amazon S3와 Google Cloud Storage(줄여서 GCS)를 지원해요. jclouds 덕분에 향후 더 많은 클라우드 스토리지 제공자를 쉽게 지원할 수 있어요.
- 계층형 저장소는 Apache Hadoop을 사용해 장기 저장소로 파일시스템을 지원해요. Hadoop 덕분에 향후 더 많은 파일시스템을 쉽게 지원할 수 있어요.
계층형 저장소는 언제 사용해야 하나요?
매우 긴 백로그를 오랜 시간 유지하고 싶은 토픽이 있을 때 계층형 저장소를 사용해야 해요. 예를 들어 사용자 행동 데이터를 담고 있어 추천 시스템 학습에 사용하는 토픽이 있다면, 추천 알고리즘을 바꿀 때 전체 사용자 이력으로 다시 실행할 수 있도록 그 데이터를 오래 보관하고 싶을 거예요. 이때 계층형 저장소가 유용해요.
오프로딩 메커니즘
Pulsar의 토픽은 managed ledger로 알려진 로그로 뒷받침돼요. 이 로그는 정렬된 세그먼트 목록으로 구성돼요. Pulsar는 로그의 마지막 세그먼트에만 쓰고, 이전의 모든 세그먼트는 봉인(sealed)돼요. 세그먼트 내부의 데이터는 불변이에요. 이를 세그먼트 지향 아키텍처라고 불러요.
계층형 저장소의 오프로딩 메커니즘은 이 세그먼트 지향 아키텍처를 활용해요. 오프로딩이 요청되면 로그의 세그먼트가 하나씩 계층형 저장소로 복사돼요. 현재 쓰고 있는 세그먼트를 제외한 로그의 모든 세그먼트를 오프로드할 수 있어요.
브로커에서 관리자는 클라우드 저장 서비스의 버킷과 자격 증명을 구성해야 해요. 구성된 버킷은 오프로드를 시도하기 전에 존재해야 해요. 존재하지 않으면 오프로드 작업이 실패해요.
Pulsar는 멀티파트 객체로 세그먼트 데이터를 업로드해요. 업로드 도중 브로커가 충돌할 수도 있어요. 불완전한 업로드에 비용이 청구되지 않도록, 버킷에 며칠 안에 불완전한 멀티파트 업로드가 만료되는 라이프사이클 규칙을 추가하는 것을 권장해요.
오프로드 드라이버 구성
오프로딩은 broker.conf에서 구성돼요. 최소한 관리자는 드라이버, 버킷, 인증 자격 증명을 구성해야 해요. 버킷 리전, 백업 저장소의 최대 블록 크기 등 조정 가능한 다른 옵션도 있어요.
현재 지원하는 드라이버 유형:
- aws-s3: Simple Cloud Storage Service
- google-cloud-storage: Google Cloud Storage
- filesystem: Filesystem Storage
드라이버 이름은 대소문자를 구분하지 않아요.
s3라는 세 번째 드라이버 유형이 있는데aws-s3와 동일하지만,s3ManagedLedgerOffloadServiceEndpoint로 엔드포인트 URL을 지정해야 해요. AWS가 아닌 S3 호환 스토어를 사용할 때 유용해요.
오프로드 드라이버를 broker.conf에서 지정해요:
managedLedgerOffloadDriver=aws-s3
"aws-s3" 드라이버 구성
버킷과 리전
버킷은 데이터를 담는 기본 컨테이너예요. 클라우드 저장소에 저장하는 모든 것은 버킷 안에 있어야 해요. 버킷으로 데이터를 정리하고 데이터 접근을 제어할 수 있지만, 디렉터리나 폴더와 달리 버킷은 중첩할 수 없어요.
s3ManagedLedgerOffloadBucket=pulsar-topic-offload
버킷 리전은 버킷이 위치한 리전이에요. 필수는 아니지만 권장되는 구성이에요. 구성하지 않으면 기본 리전을 사용해요. AWS S3의 기본 리전은 US East (N. Virginia)예요. AWS 리전 및 엔드포인트 페이지에서 자세한 정보를 확인할 수 있어요.
s3ManagedLedgerOffloadRegion=eu-west-3
AWS 인증
AWS S3에 접근하려면 AWS S3로 인증해야 해요. Pulsar는 AWS S3 인증을 구성하는 직접적인 수단을 제공하지 않고, DefaultAWSCredentialsProviderChain이 지원하는 메커니즘에 의존해요.
AWS IAM 콘솔에서 자격 증명 집합을 만든 후에는 여러 방식으로 구성할 수 있어요.
- ec2 인스턴스 메타데이터 자격 증명 사용
자격 증명을 제공하는 인스턴스 프로필이 있는 AWS 인스턴스에서 실행 중이라면, 다른 메커니즘이 제공되지 않을 때 Pulsar가 이 자격 증명을 사용해요.
conf/pulsar_env.sh에서 환경 변수 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY 설정
export AWS_ACCESS_KEY_ID=ABC123456789
export AWS_SECRET_ACCESS_KEY=ded7db27a4558e2ea8bbf0bf37ae0e8521618f366c
"export"가 중요해요. 그래야 변수가 생성된 프로세스의 환경에서 사용 가능해져요.
conf/pulsar_env.sh의 PULSAR_EXTRA_OPTS에 Java 시스템 속성 aws.accessKeyId와 aws.secretKey 추가
PULSAR_EXTRA_OPTS="${PULSAR_EXTRA_OPTS} ${PULSAR_MEM} ${PULSAR_GC} -Daws.accessKeyId=ABC123456789 -Daws.secretKey=ded7db27a4558e2ea8bbf0bf37ae0e8521618f366c -Dio.netty.leakDetectionLevel=disabled -Dio.netty.recycler.maxCapacityPerThread=4096"
~/.aws/credentials에 접근 자격 증명 설정
[default]
aws_access_key_id=ABC123456789
aws_secret_access_key=ded7db27a4558e2ea8bbf0bf37ae0e8521618f366c
- IAM 역할 가정
IAM 역할을 가정하려면 다음을 지정하면 돼요.
s3ManagedLedgerOffloadRole=<aws role arn>
s3ManagedLedgerOffloadRoleSessionName=pulsar-s3-offload
이 설정은 이 역할을 가정하는 데 DefaultAWSCredentialsProviderChain을 사용해요.
pulsar_env에 지정된 자격 증명이 적용되려면 브로커를 재시작해야 해요.
블록 읽기/쓰기 크기 구성
Pulsar는 AWS S3로 보내는 요청의 크기를 구성하는 몇 가지 옵션도 제공해요.
s3ManagedLedgerOffloadMaxBlockSizeInBytes는 멀티파트 업로드 동안 보내는 "파트"의 최대 크기를 구성해요. 5MB보다 작을 수 없어요. 기본값은 64MB예요.s3ManagedLedgerOffloadReadBufferSizeInBytes는 AWS S3에서 데이터를 읽어올 때 개별 읽기의 블록 크기를 구성해요. 기본값은 1MB예요.
두 경우 모두, 확실하지 않으면 건드리지 않는 것이 좋아요.
"google-cloud-storage" 드라이버 구성
버킷은 데이터를 담는 기본 컨테이너예요. 클라우드 저장소에 저장하는 모든 것은 버킷 안에 있어야 해요. 버킷으로 데이터를 정리하고 접근을 제어할 수 있지만, 버킷은 중첩할 수 없어요.
gcsManagedLedgerOffloadBucket=pulsar-topic-offload
버킷 리전은 버킷이 위치한 리전이에요. 필수는 아니지만 권장되는 구성이에요. 구성하지 않으면 기본 리전을 사용해요. GCS에서는 버킷이 기본적으로 us multi-regional location에 생성돼요. 버킷 위치 페이지에서 자세한 정보를 확인할 수 있어요.
gcsManagedLedgerOffloadRegion=europe-west3
GCS 인증
관리자는 브로커가 GCS 서비스에 접근할 수 있도록 broker.conf에서 gcsManagedLedgerOffloadServiceAccountKeyFile을 구성해야 해요. gcsManagedLedgerOffloadServiceAccountKeyFile은 서비스 계정의 GCS 자격 증명을 담은 JSON 파일이에요. 이 페이지의 서비스 계정 섹션에 인증용 키 파일을 만드는 방법이 자세히 나와 있어요. Google Cloud IAM에 대한 자세한 정보는 여기에서 확인할 수 있어요.
서비스 계정 자격 증명을 생성하거나 이미 생성한 공개 자격 증명을 보려면 다음 단계를 따르세요.
- 서비스 계정 페이지를 엽니다.
- 프로젝트를 선택하거나 새로 만듭니다.
- 서비스 계정 만들기를 클릭합니다.
- 서비스 계정 만들기 창에서 서비스 계정의 이름을 입력하고 새 비공개 키 제공을 선택합니다. 서비스 계정에 G Suite 도메인 전체 권한을 부여하려면 G Suite 전체 도메인 위임 사용도 선택합니다.
- 만들기를 클릭합니다.
참고 만든 서비스 계정이 GCS에서 작업할 권한이 있는지 확인하세요. 여기에서 서비스 계정에 Storage Admin 권한을 할당해야 해요.
gcsManagedLedgerOffloadServiceAccountKeyFile="/Users/hello/Downloads/project-804d5e6a6f33.json"
블록 읽기/쓰기 크기 구성
Pulsar는 GCS로 보내는 요청의 크기를 구성하는 몇 가지 옵션도 제공해요.
gcsManagedLedgerOffloadMaxBlockSizeInBytes는 멀티파트 업로드 동안 보내는 "파트"의 최대 크기를 구성해요. 5MB보다 작을 수 없어요. 기본값은 64MB예요.gcsManagedLedgerOffloadReadBufferSizeInBytes는 GCS에서 데이터를 읽어올 때 개별 읽기의 블록 크기를 구성해요. 기본값은 1MB예요.
두 경우 모두, 확실하지 않으면 건드리지 않는 것이 좋아요.
"filesystem" 드라이버 구성
연결 주소 구성
broker.conf 파일에서 연결 주소를 구성할 수 있어요.
fileSystemURI="hdfs://127.0.0.1:9000"
Hadoop 프로필 경로 구성
구성 파일은 Hadoop 프로필 경로에 저장돼요. 여기에는 base path, 인증 등 다양한 설정이 포함돼요.
fileSystemProfilePath="../conf/filesystem_offload_core_site.xml"
토픽 데이터를 저장하는 모델은 org.apache.hadoop.io.MapFile을 사용해요. Hadoop에 대해 org.apache.hadoop.io.MapFile의 모든 구성을 사용할 수 있어요.
예시
<property>
<name>fs.defaultFS</name>
<value></value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>pulsar</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<property>
<name>io.seqfile.compress.blocksize</name>
<value>1000000</value>
</property>
<property>
<name>io.seqfile.compression.type</name>
<value>BLOCK</value>
</property>
<property>
<name>io.map.index.interval</name>
<value>128</value>
</property>
org.apache.hadoop.io.MapFile의 구성에 대한 자세한 정보는 Filesystem Storage에서 확인할 수 있어요.
오프로드를 자동으로 실행하도록 구성
네임스페이스 정책으로 임계값에 도달하면 데이터를 자동으로 오프로드하도록 구성할 수 있어요. 임계값은 토픽이 pulsar 클러스터에 저장한 데이터 크기에 기반해요. 토픽이 임계값에 도달하면 오프로드 작업이 트리거돼요. 임계값에 음수 값을 설정하면 자동 오프로딩이 비활성화돼요. 임계값을 0으로 설정하면 브로커가 가능한 한 빨리 데이터를 오프로드해요.
bin/pulsar-admin namespaces set-offload-threshold --size 10M my-tenant/my-namespace
자동 오프로드는 새 세그먼트가 토픽 로그에 추가될 때 실행돼요. 네임스페이스에 임계값을 설정했더라도 토픽에 생산되는 메시지가 적으면, 현재 세그먼트가 가득 찰 때까지 오프로드되지 않아요.
오프로드된 메시지의 읽기 우선순위 구성
기본적으로 메시지가 장기 저장소로 오프로드되면 브로커는 장기 저장소에서 읽어요. 하지만 메시지는 관리자 구성에 따른 기간 동안 BookKeeper에도 여전히 존재해요. BookKeeper와 장기 저장소 양쪽에 존재하는 메시지를 BookKeeper에서 읽는 것을 선호한다면, 명령으로 이 구성을 변경할 수 있어요.
# default value for -orp is tiered-storage-first
bin/pulsar-admin namespaces set-offload-policies my-tenant/my-namespace -orp bookkeeper-first
bin/pulsar-admin topics set-offload-policies my-tenant/my-namespace/topic1 -orp bookkeeper-first
오프로드 수동 트리거
오프로딩은 Pulsar 브로커의 REST 엔드포인트를 통해 수동으로 트리거할 수 있어요. 이 REST 엔드포인트를 호출해 주는 CLI를 제공해요.
오프로드를 트리거할 때는 bookkeeper에 로컬로 보존될 백로그의 최대 크기(바이트)를 지정해야 해요. 오프로드 메커니즘은 이 조건이 충족될 때까지 토픽 백로그의 시작 부분부터 세그먼트를 오프로드해요.
bin/pulsar-admin topics offload --size-threshold 10M my-tenant/my-namespace/topic1
Offload triggered for persistent://my-tenant/my-namespace/topic1 for messages before 2:0:-1
오프로드를 트리거하는 명령은 오프로드 작업이 완료될 때까지 기다리지 않아요. 오프로드 상태를 확인하려면 offload-status를 사용하세요.
bin/pulsar-admin topics offload-status my-tenant/my-namespace/topic1
Offload is currently running
오프로드 완료를 기다리려면 -w 플래그를 추가하세요.
bin/pulsar-admin topics offload-status -w my-tenant/my-namespace/topic1
Offload was a success
오프로드 중 오류가 있으면 그 오류가 offload-status 명령에 전파돼요.
bin/pulsar-admin topics offload-status persistent://public/default/topic1
Error in offload
null
Reason: Error offloading: org.apache.bookkeeper.mledger.ManagedLedgerException: java.util.concurrent.CompletionException: com.amazonaws.services.s3.model.AmazonS3Exception: Anonymous users cannot initiate multipart uploads. Please authenticate. (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 798758DE3F1776DF; S3 Extended Request ID: dhBFz/lZm1oiG/oBEepeNlhrtsDlzoOhocuYMpKihQGXe6EG8puRGOkK6UwqzVrMXTWBxxHcS+g=), S3 Extended Request ID: dhBFz/lZm1oiG/oBEepeNlhrtsDlzoOhocuYMpKihQGXe6EG8puRGOkK6UwqzVrMXTWBxxHcS+g=
더 알아보기 (Learn more)
- 계층형 저장소 개념 — 동작 원리와 지원 저장 백엔드를 이해해요.
- 보존 및 만료 쿡북 — 보존·백로그 정책을 함께 조합해 봐요.
- 네임스페이스 관리 — set-offload, set-backlog-quota 등을 다뤄요.