부키 격리
부키 격리 (Isolate bookies)
부키(bookie)를 격리한다는 것은 메시지 저장소를 격리한다는 뜻이에요. 특정 토픽에 격리와 안전성을 제공하는 데이터 저장 메커니즘이죠. 부키 격리는 BookKeeper 클라이언트가 제어하며, 이 페이지에서는 부키 데이터 배치 정책의 세 종류(rack-aware, region-aware, zone-aware)와 활성화·구성 방법을 설명해요.
출처: 문서
본문
부키를 격리한다는 것은 메시지 저장소를 격리한다는 뜻이에요. 특정 토픽에 격리와 안전성을 제공하는 데이터 저장 메커니즘이죠.
부키 격리는 BookKeeper 클라이언트가 제어해요. Pulsar에서는 데이터를 읽고 쓰는 두 종류의 BookKeeper 클라이언트가 있어요.
- 브로커 쪽의 BookKeeper 클라이언트: Pulsar 브로커가 토픽 메시지를 읽고 쓰는 데 이 클라이언트를 사용해요.
- 부키 자동-복구 쪽의 BookKeeper 클라이언트:
- 부키 감사자(auditor)는 레저 복제본이 구성된 격리 정책을 충족하는지 확인해요.
- 부키 복제 워커는 구성된 격리 정책에 따라 레저 복제본을 대상 부키에 기록해요.
부키를 격리하려면 다음 작업을 완료해야 해요.
- 요구 사항에 따라 데이터 격리 정책을 선택한다.
- BookKeeper 클라이언트에서 정책을 활성화한다.
- 부키 인스턴스에 정책을 구성한다.
부키 데이터 격리 정책 이해하기 (Understand bookie data isolation policy)
부키 데이터 격리 정책은 기존 BookKeeper rack-aware 배치 정책 위에 구축돼요. "rack" 개념은 무엇이든 될 수 있어요. 예를 들어 랙, 지역, 가용성 영역(availability zone) 등이요. 구성된 격리 정책을 메타데이터 스토어에 기록해요. 브로커와 부키 자동-복구 쪽의 BookKeeper 클라이언트는 모두 구성된 격리 정책을 메타데이터 스토어에서 읽어 메시지를 저장할 부키를 고를 때 적용해요.
BookKeeper는 재해 내성을 위한 세 종류의 데이터 격리 정책을 제공해요.
- Rack-aware 배치 정책 (기본)
- Region-aware 배치 정책
- Zone-aware 배치 정책
tip
- rack-aware 배치 정책과 region-aware 배치 정책은 랙이 지역의 부분집합인 모든 종류의 배포에서 사용할 수 있어요. 두 정책의 주요 차이는 다음과 같아요.
RackawareEnsemblePlacementPolicy를 구성하면 BookKeeper 클라이언트는 단일 장애점을 줄이기 위해 서로 다른 랙에서 부키를 선택해요. 사용 가능한 랙이 하나뿐이면 정책은 사용 가능한 부키 중에서 랜덤 부키를 선택하는 것으로 폴백해요.RegionAwareEnsemblePlacementPolicy를 구성하면 BookKeeper 클라이언트는 서로 다른 지역에서 부키를 선택해요. 선택된 지역에 대해, 하나 이상의 앙상블이 같은 지역에 속하면 서로 다른 랙에서 부키를 선택해요.- Zone-aware 배치 정책(
ZoneAwareEnsemblePlacementPolicy)은 공용 클라우드 인프라에서 사용할 수 있는데, 공용 클라우드 서비스가 시작되고 운영되는 데이터 센터 지역 내의 격리된 위치인 가용성 영역(AZ)이 거기 있기 때문이에요.
Rack-aware 배치 정책 (Rack-aware placement policy)
Rack-aware 배치 정책은 서로 다른 데이터 복제본을 서로 다른 랙에 배치하도록 강제해서, 프로덕션 환경에서 랙 수준의 재해 내성을 보장해요. 데이터 센터에는 보통 랙이 많고 각 랙에는 저장 노드가 많아요. RackAwareEnsemblePlacementPolicy로 각 부키의 랙 정보를 구성할 수 있어요.
자격 있는 부키 랙 크기 (Qualified rack size of bookies)
사용 가능한 부키 랙 크기가 토픽에 구성된 요구 사항을 충족할 수 있으면 rack-aware 배치 정책은 잘 동작하고 추가 구성이 필요 없어요.
예를 들어 BookKeeper 클러스터에 아래 그림처럼 4개 랙과 13개 부키 인스턴스가 있다고 해요. 토픽이 EnsembleSize=3, WriteQuorum=3, AckQuorum=2로 구성되면 BookKeeper 클라이언트는 Bookie2, Bookie8, Bookie12처럼 서로 다른 세 랙에서 부키 인스턴스 하나씩 골라 데이터를 기록해요.
강제된 최소 부키 랙 크기 (Enforced minimum rack size of bookies)
사용 가능한 부키 랙 크기가 토픽에 구성된 요구 사항을 충족할 수 없으면, BookKeeper 클라이언트가 오래된 레저를 복구하고 새 레저를 만들기 위해 부키를 선택하는 전략은 부키의 강제된 최소 랙 크기가 구성되었는지에 따라 달라져요.
이 경우 rack-aware 배치 정책이 평소처럼 동작하게 하려면 부키의 강제된 최소 랙 크기(MinNumRacksPerWriteQuorum)를 구성해야 해요.
예를 들어 위 그림과 같은 BookKeeper 클러스터와 EnsembleSize=3, WriteQuorum=3, AckQuorum=2 토픽 요구 사항이 있다고 해요. Rack3과 Rack4의 모든 부키 인스턴스가 실패하면 사용 가능한 랙은 2개뿐이고 다음 세 가지 가능성이 있어요.
EnforceMinNumRacksPerWriteQuorum=true와MinNumRacksPerWriteQuorum=3을 구성했다면, BookKeeper 클라이언트는 부키 선택에 실패해 새 레저를 만들 수 없고 오래된 레저도 복구할 수 없어요.MinNumRacksPerWriteQuorum=3요구 사항을 충족할 수 없기 때문이에요.EnforceMinNumRacksPerWriteQuorum=true와MinNumRacksPerWriteQuorum=2를 구성했다면, BookKeeper 클라이언트는 Rack1과 Rack2에서 부키 하나씩 골라(예: bookie1, bookie5) 오래된 레저를 복구해 Bookie8과 Bookie12에 2개 복제본을 배치해요. 새 레저 생성에서는 Rack1과 Rack2에서 부키 하나씩(예: Bookie4, Bookie7) 그리고 Rack1 또는 Rack2 중 하나에서 랜덤 부키 하나를 골라 마지막 복제본을 배치해요.
EnforceMinNumRacksPerWriteQuorum=false를 구성했다면, BookKeeper 클라이언트는 사용 가능한 랙과 부키 수에 따라 배치 정책을 적용하려 최선을 다해요. 위 그림처럼 동작할 수도 있고 아래 그림처럼 동작할 수도 있어요.
Region-aware 배치 정책 (Region-aware placement policy)
Region-aware 배치 정책은 서로 다른 데이터 복제본을 서로 다른 지역과 랙에 배치하도록 강제해서, 지역 수준의 재해 내성을 보장해요. 데이터센터 수준의 재해 내성을 달성하려면 데이터 복제본을 서로 다른 데이터 센터에 기록해야 해요. RegionAwareEnsemblePlacementPolicy로 각 부키 노드의 지역과 랙 정보를 구성해서 지역 수준의 재해 내성을 보장할 수 있어요.
예를 들어 아래 그림처럼 BookKeeper 클러스터에 4개 지역이 있고 각 지역에는 부키 인스턴스가 있는 여러 랙이 있다고 해요. 토픽이 EnsembleSize=3, WriteQuorum=3, AckQuorum=2로 구성되면 BookKeeper 클라이언트는 Region A, Region C, Region D처럼 세 개의 서로 다른 지역을 선택해요. 각 지역에 대해 단일 랙에서 부키 하나씩(예: Rack2의 Bookie5, Rack6의 Bookie17, Rack8의 Bookie21) 선택해요.
아래 그림처럼 두 지역(예: Region B와 Region C)이 실패하면, BookKeeper 클라이언트는 Region A 또는 Region D에서 부키 하나를 골라 실패한 Bookie17을 대체해 오래된 레저를 복구해요. 또한 새 레저용 복제본을 기록할 Region A와 Region D를 선택해요. Region A에서는 rack-aware 배치 정책으로 폴백해 Rack1과 Rack2에서 부키 하나씩(예: Bookie4, Bookie7) 선택해요. Region D에서는 Rack8에서 부키 하나(예: Bookie22)를 선택해야 해요.
부키 데이터 배치 정책 활성화 (Enable bookie data placement policy)
기본적으로 rack-aware 배치 정책은 브로커와 부키 양쪽에서 활성화돼 있어요. region-aware 배치 정책으로 전환하려면 브로커와 부키 양쪽에서 region-aware 배치 정책을 활성화해야 해요.
브로커에서 region-aware 배치 정책 활성화
브로커에서 region-aware 배치 정책을 활성화하려면 conf/broker.conf 파일에서 다음 필드를 구성해요.
bookkeeperClientRegionawarePolicyEnabled=true
부키의 최소 랙 크기를 강제하려면 다음 필드를 구성해요.
bookkeeperClientEnforceMinNumRacksPerWriteQuorum=true
bookkeeperClientMinNumRacksPerWriteQuorum=2
다른 부키의 레저 디스크 사용량을 균형 잡으려면 다음 필드를 구성해 디스크 가중치 배치를 활성화할 수 있어요.
bookkeeperDiskWeightBasedPlacementEnabled=true
자동-복구 인스턴스(파드)에서 region-aware 배치 정책 활성화
자동-복구 인스턴스에서 region-aware 배치 정책을 활성화하려면 conf/bookkeeper.conf 파일에서 다음 필드를 구성해요.
ensemblePlacementPolicy=org.apache.bookkeeper.client.RegionAwareEnsemblePlacementPolicy
reppDnsResolverClass=org.apache.pulsar.zookeeper.ZkBookieRackAffinityMapping
부키의 최소 랙 크기를 강제하려면 다음 필드를 구성해요.
enforceMinNumRacksPerWriteQuorum=true
minNumRacksPerWriteQuorum=2
다른 부키의 레저 디스크 사용량을 균형 잡으려면 다음 필드를 구성해 디스크 가중치 배치를 활성화할 수 있어요.
diskWeightBasedPlacementEnabled=true
부키 인스턴스에 데이터 배치 정책 구성 (Configure data placement policy on bookie instances)
부키 인스턴스에 데이터 배치 정책을 구성하려면 다음 방법 중 하나를 사용할 수 있어요.
pulsar-admin CLI · REST API
이 부키가 속한 지역 또는 랙을 나타내는 랙 이름을 지정해요.
bin/pulsar-admin bookies set-bookie-rack
The following options are required: [-b | --bookie], [-r | --rack]
Then we need to update the rack placement information for a specific bookie in the cluster. Note that the bookie address format is `address:port`.
Usage: set-bookie-rack [options]
Options:
* -b, --bookie
Bookie address (format: `address:port`)
-g, --group
Bookie group name
Default: default
--hostname
Bookie host name
* -r, --rack
Bookie rack name
tip
또한 랙이나 지역을 가로질러 부키를 그룹화해 브로커 수준 격리를 제공할 수도 있어요. 각 부키에 그룹 이름을 지정하고 그 그룹 이름을 특정 네임스페이스에 할당하면 돼요. 자세한 내용은 configure bookie affinity groups를 참고해요.
REST API: POST /admin/v2/bookies/racks-info/{bookie}
rack-aware 배치 정책 구성 예시
부키 인스턴스를 랙 속성으로 구성하는 예시는 다음과 같아요.
bin/pulsar-admin bookies set-bookie-rack --bookie bookie1:3181 --hostname bookie1.pulsar.com:3181 --group group1 --rack rack1
bin/pulsar-admin bookies set-bookie-rack --bookie bookie2:3181 --hostname bookie2.pulsar.com:3181 --group group1 --rack rack1
bin/pulsar-admin bookies set-bookie-rack --bookie bookie3:3181 --hostname bookie3.pulsar.com:3181 --group group1 --rack rack1
bin/pulsar-admin bookies set-bookie-rack --bookie bookie4:3181 --hostname bookie4.pulsar.com:3181 --group group1 --rack rack1
bin/pulsar-admin bookies set-bookie-rack --bookie bookie5:3181 --hostname bookie5.pulsar.com:3181 --group group1 --rack rack2
...
region-aware 배치 정책 구성 예시
부키 인스턴스를 지역/랙 속성으로 구성하는 예시는 다음과 같아요.
bin/pulsar-admin bookies set-bookie-rack --bookie bookie1:3181 --hostname bookie1.pulsar.com:3181 --group group1 --rack RegionA/rack1
bin/pulsar-admin bookies set-bookie-rack --bookie bookie2:3181 --hostname bookie2.pulsar.com:3181 --group group1 --rack RegionA/rack1
bin/pulsar-admin bookies set-bookie-rack --bookie bookie3:3181 --hostname bookie3.pulsar.com:3181 --group group1 --rack RegionA/rack1
bin/pulsar-admin bookies set-bookie-rack --bookie bookie4:3181 --hostname bookie4.pulsar.com:3181 --group group1 --rack RegionA/rack1
bin/pulsar-admin bookies set-bookie-rack --bookie bookie5:3181 --hostname bookie5.pulsar.com:3181 --group group1 --rack RegionA/rack2
bin/pulsar-admin bookies set-bookie-rack --bookie bookie6:3181 --hostname bookie6.pulsar.com:3181 --group group1 --rack RegionA/rack2
bin/pulsar-admin bookies set-bookie-rack --bookie bookie7:3181 --hostname bookie7.pulsar.com:3181 --group group1 --rack RegionA/rack2
bin/pulsar-admin bookies set-bookie-rack --bookie bookie8:3181 --hostname bookie8.pulsar.com:3181 --group group1 --rack RegionB/rack3
...
부키 어피니티 그룹 구성 (Configure bookie affinity groups)
네임스페이스의 데이터를 사용자 정의 부키 그룹, 즉 부키 어피니티 그룹(bookie affinity group)으로 격리할 수 있어요. 이는 네임스페이스에 속한 모든 데이터가 원하는 부키에 저장되도록 보장해요.
전제 조건: 부키 어피니티 그룹을 구성하기 전에 먼저 부키를 그룹화해야 해요. 자세한 내용은 configure data placement policy on bookie instances를 참고해요.
부키 어피니티 그룹을 구성하려면 다음 방법 중 하나를 사용할 수 있어요.
pulsar-admin CLI · REST API · Java admin API
pulsar-admin namespaces set-bookie-affinity-group options
pulsar-admin namespaces set-bookie-affinity-group options 명령에 대한 자세한 내용은 Pulsar admin docs를 참고해요.
예제:
bin/pulsar-admin bookies set-bookie-rack \
--bookie 127.0.0.1:3181 \
--hostname 127.0.0.1:3181 \
--group group-bookie1 \
--rack rack1
bin/pulsar-admin namespaces set-bookie-affinity-group public/default \
--primary-group group-bookie1
note
- Pulsar 2.7.5, 2.8.3, 2.9.2 이전 버전을 사용한다면 부키 랙 이름을 슬래시(/)나 빈 문자열("")로 설정하지 마세요. Pulsar 2.7.5, 2.8.3, 2.9.2 이상을 사용하면
/default-rack또는/default-region/default-rack으로 폴백돼요.RackawareEnsemblePlacementPolicy가 활성화되면 랙 이름은 문자열의 시작과 끝을 제외하고 슬래시(/) 하나를 포함할 수 없어요. 예를 들어/rack0같은 랙 이름은 허용되지만/rack/0은 유효하지 않아요.RegionAwareEnsemblePlacementPolicy가 활성화되면 랙 이름은 문자열의 시작과 끝을 제외하고 슬래시(/) 하나만 포함할 수 있어요. 예를 들어/region0/rack0같은 랙 이름은 허용되지만/region0rack0과/region0/rack/0은 유효하지 않아요.- 부키 랙 이름 제한에 대해서는 pulsar-admin bookies set-bookie-rack를 참고해요.
REST API: POST /admin/v2/namespaces/{tenant}/{namespace}/persistence/bookieAffinity
Java admin API로 네임스페이스의 부키 어피니티 그룹을 설정하는 방법은 code를 참고해요.
더 알아보기 (Learn more)
- 브로커 수준 격리 정책은 Isolate brokers 문서를 참고해요.
- Pulsar 격리의 개요와 배포 방식은 Pulsar isolation 문서를 참고해요.
- 부키 관련 명령은 pulsar-admin의 bookies 명령 참고서를 확인해요.
- BookKeeper 배치 정책의 더 자세한 설계는 BookKeeper 문서를 참고해요.