2.2. CRUSH Hierarchies

CRUSH 맵은 지시된 acyclic 그래프이므로 여러 계층 구조(예: 성능 도메인)를 수용할 수 있습니다. CRUSH 계층 구조를 만들고 수정하는 가장 쉬운 방법은 Ceph CLI를 사용하는 것입니다. 그러나 CRUSH 맵을 컴파일하고, 편집하고, 다시 컴파일하고, 활성화할 수도 있습니다.

Ceph CLI를 사용하여 버킷 인스턴스를 선언할 때 유형을 지정하고 고유한 이름(문자열)을 지정해야 합니다. Ceph는 버킷 ID를 자동으로 할당하고, 알고리즘을 straw 로 설정하고, 해시를 rjenkins1 을 반영하고 가중치를 설정합니다. 역 컴파일된 CRUSH 맵을 수정할 때 버킷에 음수 정수(선택 사항)로 표시된 고유 ID를 할당하고 해당 항목의 총 용량/실행 가능성에 대한 가중치를 지정하고, 버킷 알고리즘을 지정합니다(일반적으로 0 인 경우 rjenkins1).

버킷에는 하나 이상의 항목이 있을 수 있습니다. 항목은 노드 버킷(예: 랙, 행, 호스트) 또는 leaves(예: OSD 디스크)로 구성될 수 있습니다. 항목에 항목의 상대적 가중치를 반영하는 가중치가 있을 수 있습니다.

분리 분리 CRUSH 맵을 수정할 때 다음 구문을 사용하여 노드 버킷을 선언할 수 있습니다.

[bucket-type] [bucket-name] {
    id [a unique negative numeric ID]
    weight [the relative capacity/capability of the item(s)]
    alg [the bucket type: uniform | list | tree | straw ]
    hash [the hash type: 0 by default]
    item [item-name] weight [weight]
}

예를 들어 위의 다이어그램을 사용하여 두 개의 호스트 버킷과 하나의 랙 버킷을 정의합니다. OSD는 호스트 버킷 내에서 항목으로 선언됩니다.

host node1 {
    id -1
    alg straw
    hash 0
    item osd.0 weight 1.00
    item osd.1 weight 1.00
}

host node2 {
    id -2
    alg straw
    hash 0
    item osd.2 weight 1.00
    item osd.3 weight 1.00
}

rack rack1 {
    id -3
    alg straw
    hash 0
    item node1 weight 2.00
    item node2 weight 2.00
}
참고

위의 예에서 랙 버킷에는 OSD가 포함되어 있지 않습니다. 대신 하위 수준 호스트 버킷을 포함하며 항목 항목에 가중치 합계를 포함합니다.

2.2.1. CRUSH 위치

CRUSH 위치는 CRUSH 맵 계층 측면에서 OSD의 위치입니다. 명령행 인터페이스에서 CRUSH 위치를 표현할 때 CRUSH 위치 지정자는 OSD의 위치를 설명하는 이름/값 쌍 목록의 형식을 취합니다. 예를 들어 OSD가 특정 행, 랙, 섀시 및 호스트에 있고 기본 CRUSH 트리의 일부인 경우 해당 crush 위치를 다음과 같이 설명할 수 있습니다.

root=default row=a rack=a2 chassis=a2a host=a2a1

참고:

  1. 키 순서는 중요하지 않습니다.
  2. 키 이름( = 왼쪽)은 유효한 CRUSH 유형 이어야 합니다. 기본적으로 루트,데이터 센터,,,pod, du ,,섀시호스트가 포함됩니다. CRUSH 맵을 편집하여 필요에 따라 유형을 변경할 수 있습니다.
  3. 모든 버킷/키를 지정할 필요는 없습니다. 예를 들어 기본적으로 Ceph는 ceph-osd 데몬의 위치를 root=default host={HOSTNAME} (호스트 이름 -s의 출력에 기반)로 자동 설정합니다.

2.2.2. 버킷 추가

CRUSH 계층에 버킷 인스턴스를 추가하려면 버킷 이름과 해당 유형을 지정합니다. 버킷 이름은 CRUSH 맵에서 고유해야 합니다.

ceph osd crush add-bucket {name} {type}

예를 들어 다양한 하드웨어 성능 프로필의 경우 여러 계층을 사용하려는 경우 하드웨어 유형 또는 사용 사례에 따라 버킷 이름을 지정하는 것이 좋습니다.

예를 들어 SSD 저널이 있는 SAS 디스크의 계층 구조(sd), SATA 드라이브용 다른 계층 구조(hdd )를 생성할 수있습니다.

ceph osd crush add-bucket ssd-root root
ceph osd crush add-bucket hdd-journal-root root
ceph osd crush add-bucket hdd-root root

Ceph CLI 출력:

added bucket ssd-root type root to crush map
added bucket hdd-journal-root type root to crush map
added bucket hdd-root type root to crush map
중요

버킷 이름에 콜론(:) 사용은 지원되지 않습니다.

계층 구조에 필요한 각 버킷 유형의 인스턴스를 추가합니다. 다음 예제에서는 SSD 호스트 랙과 오브젝트 스토리지용 호스트 랙을 사용하여 행에 대한 버킷을 추가하는 방법을 보여줍니다.

ceph osd crush add-bucket ssd-row1 row
ceph osd crush add-bucket ssd-row1-rack1 rack
ceph osd crush add-bucket ssd-row1-rack1-host1 host
ceph osd crush add-bucket ssd-row1-rack1-host2 host
ceph osd crush add-bucket hdd-row1 row
ceph osd crush add-bucket hdd-row1-rack2 rack
ceph osd crush add-bucket hdd-row1-rack1-host1 host
ceph osd crush add-bucket hdd-row1-rack1-host2 host
ceph osd crush add-bucket hdd-row1-rack1-host3 host
ceph osd crush add-bucket hdd-row1-rack1-host4 host
참고

이미 Ansible 자동화 애플리케이션 또는 다른 툴을 사용하여 클러스터에 OSD를 추가한 경우 호스트 노드가 이미 CRUSH 맵에 있을 수 있습니다.

이 단계를 완료하면 트리를 봅니다.

ceph osd tree

계층 구조는 flat으로 유지됩니다. CRUSH 맵에 추가한 후 버킷을 계층 구조 위치로 이동해야 합니다.

2.2.3. 버킷 이동

초기 클러스터를 생성하면 Ceph에 default 라는 루트 버킷이 있고 초기 OSD 호스트가 기본 버킷에 표시됩니다. CRUSH 맵에 버킷 인스턴스를 추가하면 CRUSH 계층에 표시되지만 특정 버킷 아래에는 표시되지 않습니다.

CRUSH 계층 구조의 특정 위치로 버킷 인스턴스를 이동하려면 버킷 이름과 해당 유형을 지정합니다. 예:

ceph osd crush move ssd-row1 root=ssd-root
ceph osd crush move ssd-row1-rack1 row=ssd-row1
ceph osd crush move ssd-row1-rack1-host1 rack=ssd-row1-rack1
ceph osd crush move ssd-row1-rack1-host2 rack=ssd-row1-rack1

이 단계를 완료하면 트리를 볼 수 있습니다.

ceph osd tree
참고

OSD를 이동하는 동안 ceph osd crush create-or- hiera를 사용하여 위치를 만들 수도 있습니다.

2.2.4. 버킷 제거

CRUSH 계층에서 버킷 인스턴스를 제거하려면 버킷 이름을 지정합니다. 예:

ceph osd crush remove {bucket-name}

또는 다음을 수행합니다.

ceph osd crush rm {bucket-name}
참고

버킷을 제거하려면 비워야 합니다.

상위 수준 버킷(예: 기본과 같은 루트)을 제거하는 경우 풀이 해당 버킷을 선택하는 CRUSH 규칙을 사용하는지 확인합니다. 그러지 않으면 CRUSH 규칙을 수정해야 합니다. 그렇지 않으면 피어링에 실패합니다.

2.2.5. 버킷 알고리즘

Ceph CLI를 사용하여 버킷을 생성할 때 Ceph는 기본적으로 알고리즘을 straw 로 설정합니다. Ceph는 성능 및 재구성 효율성 간의 절충을 나타내는 네 가지 버킷 알고리즘을 지원합니다. 사용할 버킷 유형이 확실하지 않은 경우 straw 버킷을 사용하는 것이 좋습니다. 버킷 알고리즘은 다음과 같습니다.

  1. 균일: 정확히 동일한 가중치를 가진 Uniform 버킷 집계 장치. 예를 들어, 회사의 위임 또는 폐기 하드웨어가 있는 경우 일반적으로 동일한 물리적 구성(예: 대량 구매)이 있는 많은 시스템에서 이러한 작업을 수행합니다. 스토리지 장치에 정확히 동일한 가중치가 있는 경우 CRUSH가 지속적으로 일관된 버킷에 복제본을 매핑할 수 있는 균일한 버킷 유형을 사용할 수 있습니다. 특정 형식이 아닌 가중치를 사용하면 다른 버킷 알고리즘을 사용해야 합니다.
  2. list: 버킷에 연결된 목록으로 콘텐츠를 집계합니다. RUSH (Replication Underxtensible Hashing) P 알고리즘을 기반으로 하는 목록은 확장 클러스터를 위한 자연스럽고 직관적인 선택 사항입니다 : 개체가 몇 가지 적절한 확률이 있는 최신 장치로 재배치되거나 이전 장치에 남아 있습니다. 결과는 항목을 버킷에 추가할 때 최적의 데이터 마이그레이션입니다. 그러나 목록의 중간 또는 tail에서 제거된 항목은 상당한 양의 불필요한 이동으로 인해 목록 버킷을 만들 때 목록 버킷이 축소되지 않는 상황에 가장 적합합니다.
  3. 트리: 트리 버킷은 바이너리 검색 트리를 사용합니다. 버킷에 더 많은 항목 세트가 포함된 경우 목록 버킷보다 더 효율적입니다. RUSH (Replication Underxtensible Hashing) R 알고리즘에 따라 트리 버킷은 O(log n)로 배치 시간을 줄이고 훨씬 더 많은 장치 또는 중첩된 버킷을 관리하는 데 적합합니다.
  4. straw (기본값): List 및 Tree 버킷은 특정 항목 우선 순위(예: 목록 시작 시)를 부여하는 방식으로 분할 및 연속 전략을 사용하거나 모든 항목의 전체 하위 트리를 고려할 필요가 없습니다. 이로 인해 복제본 배치 프로세스의 성능이 향상되지만 항목의 추가, 제거 또는 재가중으로 인해 버킷의 콘텐츠가 변경될 때 대체 재구성 동작을 도입할 수도 있습니다. straw 버킷 유형을 사용하면 straws의 드로잉과 유사한 프로세스를 통해 복제 배치를 위해 모든 항목을 서로 상대적으로 "결합"할 수 있습니다.