2.2. CRUSH 계층 구조
CRUSH 맵은 대상 acyclic 그래프이므로 여러 계층 구조(예: 성능 도메인)를 수용할 수 있습니다. CRUSH 계층 구조를 생성하고 수정하는 가장 쉬운 방법은 Ceph CLI를 사용하는 것입니다. 그러나 CRUSH 맵을 컴파일하고 편집하고 다시 컴파일한 후 활성화할 수도 있습니다.
Ceph CLI를 사용하여 버킷 인스턴스를 선언할 때 유형을 지정하고 고유한 문자열 이름을 지정해야 합니다. Ceph는 버킷 ID를 자동으로 할당하고 알고리즘을 straw2
로 설정하고, rjenkins1
을 반영하는 해시를 0
으로 설정하고 가중치를 설정합니다. 컴파일되지 않은 CRUSH 맵을 수정할 때 버킷에 음수 정수(선택 사항)로 표시되는 고유한 ID를 할당하고(선택 사항), 해당 항목의 총 용량/프로덕션에 대한 가중치를 지정하고, 버킷 알고리즘을 지정합니다(일반적으로 straw2
) 및 해시(일반적으로 0
, 해시 알고리즘 rjenkins1
)를 지정합니다.
버킷에는 하나 이상의 항목이 있을 수 있습니다. 항목은 노드 버킷(예: 랙, 행, 호스트) 또는 휴가(예: 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 | straw2 ] hash [the hash type: 0 by default] item [item-name] weight [weight] }
예를 들어 위의 다이어그램을 사용하여 두 개의 호스트 버킷과 하나의 랙 버킷을 정의합니다. OSD는 호스트 버킷 내에서 항목으로 선언됩니다.
host node1 { id -1 alg straw2 hash 0 item osd.0 weight 1.00 item osd.1 weight 1.00 } host node2 { id -2 alg straw2 hash 0 item osd.2 weight 1.00 item osd.3 weight 1.00 } rack rack1 { id -3 alg straw2 hash 0 item node1 weight 2.00 item node2 weight 2.00 }
위 예에서 랙 버킷에는 OSD가 포함되어 있지 않습니다. 대신 더 낮은 수준의 호스트 버킷을 포함하며 항목 항목에 가중치 합계를 포함합니다.
2.2.1. CRUSH 위치
CRUSH 위치는 CRUSH 맵의 계층 구조 측면에서 OSD의 위치입니다. 명령줄 인터페이스에서 CRUSH 위치를 표현하면 CRUSH 위치 지정자는 OSD의 위치를 설명하는 이름/값 쌍 목록의 형태를 취합니다. 예를 들어 OSD가 특정 행, rack, 섀시 및 호스트에 있고 기본
CRUSH 트리의 일부인 경우 CRUSH 위치는 다음과 같이 설명될 수 있습니다.
root=default row=a rack=a2 chassis=a2a host=a2a1
참고:
- 키 순서는 중요하지 않습니다.
-
키 이름(
=
= )은 유효한 CRUSH유형
이어야 합니다. 기본적으로root
,datacenter
,room
,row
,pod
,pdu
,rack
,섀시
및호스트가
포함됩니다. CRUSH 맵을 편집하여 필요에 맞게 유형을 변경할 수 있습니다. -
모든 버킷/키를 지정할 필요는 없습니다. 예를 들어 기본적으로 Ceph는
ceph-osd
데몬 위치를root=default host={HOSTNAME}
(hostname -s
의 출력에 기반)으로 자동으로 설정합니다.
2.2.2. 버킷 추가
CRUSH 계층 구조에 버킷 인스턴스를 추가하려면 버킷 이름과 해당 유형을 지정합니다. 버킷 이름은 CRUSH 맵에서 고유해야 합니다.
ceph osd crush add-bucket {name} {type}
예를 들어 다른 하드웨어 성능 프로필의 경우 여러 계층 구조를 사용하려는 경우 하드웨어 유형 또는 사용 사례에 따라 버킷 이름을 지정하는 것이 좋습니다.
예를 들어 솔리드 스테이트 드라이브(sd)를 위한 계층 구조, SSD 저널이 있는 SAS 디스크의 계층 구조(hdd-journal
) 및 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
이러한 단계를 완료하면 트리를 확인하십시오.
ceph osd tree
계층 구조는 그대로 유지됩니다. CRUSH 맵에 버킷을 추가한 후 계층 구조 위치로 이동해야 합니다.
2.2.3. 버킷 이동
초기 클러스터를 생성할 때 Ceph에는 default
라는 루트 버킷이 있는 기본 CRUSH 맵이 있고 초기 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-move
를 사용하여 위치를 생성할 수도 있습니다.
2.2.4. 버킷 제거
CRUSH 계층에서 버킷 인스턴스를 제거하려면 버킷 이름을 지정합니다. 예를 들면 다음과 같습니다.
ceph osd crush remove {bucket-name}
또는 다음을 수행합니다.
ceph osd crush rm {bucket-name}
제거하려면 버킷이 비어 있어야 합니다.
상위 수준 버킷(예: 기본
과 같은 루트)을 제거하는 경우 풀이 해당 버킷을 선택하는 CRUSH 규칙을 사용하는지 확인합니다. 이 경우 CRUSH 규칙을 수정해야 합니다. 그러지 않으면 피어링이 실패합니다.
2.2.5. CRUSH 버킷 알고리즘
Ceph CLI를 사용하여 버킷을 생성할 때 Ceph는 기본적으로 알고리즘을 straw2
로 설정합니다. Ceph는 각각 성능과 재구성 효율성 간의 절충을 나타내는 네 가지 버킷 알고리즘을 지원합니다. 어떤 버킷 유형을 사용할지 확실하지 않은 경우 straw2
버킷을 사용하는 것이 좋습니다. 버킷 알고리즘은 다음과 같습니다.
-
Uniform buckets: 정확히 동일한 가중치를 가진 장치를 집계합니다. 예를 들어 기업이 하드웨어를 교체하거나 해제하는 경우 일반적으로 동일한 물리적 구성(예: 대량 구매)이 있는 많은 시스템에서 이를 수행합니다. 스토리지 장치의 가중치가 정확히 동일한 경우 CRUSH가 일관된 시간 내에 복제본을
균일한
버킷에 매핑할 수 있는 균일한 버킷 유형을 사용할 수 있습니다. 비균형 가중치를 사용하면 다른 버킷 알고리즘을 사용해야 합니다. - list: 버킷이 콘텐츠를 연결된 목록으로 집계합니다. RUSH (Replication Under Scalable Hashing) P 알고리즘에 따라 목록은 확장 클러스터를 위한 자연적이고 직관적인 선택입니다 : 적절한 확률을 가진 최신 장치로 개체를 재배치하거나 이전 장치에 남아 있습니다. 결과가 버킷에 항목을 추가할 때 최적의 데이터 마이그레이션입니다. 그러나 목록의 중간 또는 테일에서 제거된 항목은 상당한 양의 불필요한 이동이 발생할 수 있으므로 목록 버킷을 가장 적합한 상황에 가장 적합 하거나 거의 축소되지 않을 수 있습니다.
- 트리: 트리 버킷은 바이너리 검색 트리를 사용합니다. 버킷에 더 많은 항목 세트가 포함된 경우 버킷을 나열하는 것보다 더 효율적입니다. RUSH(Replication Under Scalable Hashing) R 알고리즘을 기반으로 트리 버킷은 배치 시간을 0(로그 n)으로 줄여 훨씬 더 큰 장치 세트 또는 중첩된 버킷을 관리하는 데 적합합니다.
-
Straw2(기본값): 목록 및 트리 버킷은 특정 항목에 우선 순위를 부여하는 방식으로 분할 및 삭제 전략을 사용합니다. 예를 들어 목록 시작 부분에 있는 사용자는 항목의 전체 하위 트리를 전혀 고려해야 합니다. 이로 인해 복제본 배치 프로세스의 성능이 향상되지만 항목의 추가, 제거 또는 다시 가중치로 인해 버킷 내용이 변경될 때 최적의 재조직 동작이 발생할 수도 있습니다.
straw2
버킷 유형을 사용하면 모든 항목이 straws의 드로잉과 유사한 프로세스를 통해 복제본 배치를 위해 서로 상당히 "경고"할 수 있습니다.