2.5. CRUSH 가중치
CRUSH 알고리즘은 새 데이터 오브젝트를 PG에 할당하고 PGs에 PGs 및 PGs를 OSD에 할당하는 쓰기 요청의 일관된 확률 배포를 목표로 OSD 장치당 테라바이트 단위로 가중치 값을 할당합니다. 이러한 이유로 동일한 유형과 크기의 장치를 사용하여 CRUSH 계층 구조를 만들고 동일한 가중치를 할당하는 것이 좋습니다. 성능 특성이 데이터 배포에 영향을 미치지 않는 경우에도 CRUSH 계층 구조의 일관된 성능 특성을 갖도록 동일한 I/O 및 처리량의 특성을 가진 장치를 사용하는 것이 좋습니다.
균일한 하드웨어를 사용하는 것이 항상 실용적인 것은 아니므로 다른 크기의 OSD 장치를 통합하고 상대 가중치를 사용하여 더 많은 데이터를 더 큰 장치에 배포하고 더 적은 데이터를 작은 장치에 배포할 수 있습니다.
2.5.1. Terabytes에서 OSD의 Weight 설정
CRUSH 맵에서 OSD CRUSH 가중치를 Terabytes로 설정하려면 다음 명령을 실행합니다.
ceph osd crush reweight {name} {weight}
ceph osd crush reweight {name} {weight}
다음과 같습니다.
- name
- 설명
- OSD의 전체 이름입니다.
- 유형
- 문자열
- 필수 항목
- 있음
- 예제
-
osd.0
- weight
- 설명
-
OSD의 CRUSH 가중치입니다. 이 크기는 Terabytes의 OSD 크기입니다. 여기서
1.0
은 1 Terabyte입니다. - 유형
- double
- 필수 항목
- 있음
- 예제
-
2.0
이 설정은 OSD를 생성하거나 OSD를 추가한 직후 CRUSH 가중치를 조정할 때 사용됩니다. 일반적으로 OSD의 수명 동안 변경되지 않습니다.
2.5.2. Bucket의 OSD 가중치 설정
ceph osd crush reweight
을 사용하면 시간이 오래 걸릴 수 있습니다. 다음을 실행하여 버킷(row, rack, node 등)에서 모든 Ceph OSD 가중치를 설정(또는 재설정)할 수 있습니다.
osd crush reweight-subtree <name>
osd crush reweight-subtree <name>
다음과 같습니다.
name
은 CRUSH 버킷의 이름입니다.
2.5.3. 가중치 에서
OSD 설정
에서 ceph osd
의 용도 및 ceph osd
의 목적을 위해 OSD는 클러스터 out
내에
있거나 클러스터 외부에 있습니다. 이렇게 하면 모니터에서 OSD 상태를 기록합니다. 그러나 OSD가 클러스터에 있지만 문제를 해결할 때까지 사용하지 않으려는 상황이 발생할 수 있습니다(예: 스토리지 드라이브를 교체, 컨트롤러 변경 등).
다음을 실행하여 특정 OSD의 가중치(즉, Terabytes의 가중치를 변경하지 않고)의 가중치를 늘리거나 줄일 수 있습니다.
ceph osd reweight {id} {weight}
ceph osd reweight {id} {weight}
다음과 같습니다.
-
id
는 OSD 번호입니다. -
가중치
는 0.0-1.0의 범위입니다. 여기서0
은 클러스터에 있지 않으며 (즉, PG가 할당되지 않음) 1.0은 클러스터에 있습니다(즉, OSD는 다른 OSD와 동일한 개수의 PG를 받습니다).
2.5.4. 사용률을 통해 OSD의 가중치 설정
CRUSH는 새 데이터 오브젝트 PG와 PG를 OSD에 할당하는 쓰기 요청의 균일한 확률 배포를 대략적으로 처리하도록 설계되었습니다. 그러나 어떤 경우에도 클러스터의 불균형이 발생할 수 있습니다. 이는 여러 가지 이유로 발생할 수 있습니다. 예를 들어 다음과 같습니다.
- 다중 풀: NetNamespace 계층 구조에 여러 개의 풀을 할당할 수 있지만 풀에는 다른 수의 배치 그룹, 크기(스토리지할 복제본 수) 및 개체 크기 특성이 있을 수 있습니다.
-
사용자 지정 클라이언트: 블록 장치, 오브젝트 게이트웨이 및 파일 시스템과 같은 Ceph 클라이언트는 클라이언트의 데이터를 공유하고 균일한 크기의 RADOS 오브젝트로 클러스터의 오브젝트로 데이터를 스트라이프합니다. 따라서 진행 시나리오를 제외하고 CRUSH는 일반적으로 목표를 달성합니다. 그러나 클러스터가 개체 크기를 정상화하지 않고 데이터를 저장하는 데
librados
를 사용하여 데이터를 저장할 수 있는 또 다른 경우가 있습니다. 이 시나리오로 인해 클러스터의 불균형이 발생할 수 있습니다(예: 100MB 오브젝트를 저장하고 10개의 4MB 개체를 저장하면 OSD 수가 다른 것보다 더 많은 데이터를 만들 수 있습니다. - 확률: 균일한 배포로 인해 PG가 더 많아지고 일부는 더 적은 수의 OSD가 발생합니다. OSD 수가 많은 클러스터의 경우 통계값이 더 늘어날 것입니다.
다음을 실행하여 OSD를 다시 스케일링할 수 있습니다.
ceph osd reweight-by-utilization [threshold] [weight_change_amount] [number_of_OSDs] [--no-increasing]
ceph osd reweight-by-utilization [threshold] [weight_change_amount] [number_of_OSDs] [--no-increasing]
예를 들어 다음과 같습니다.
ceph osd test-reweight-by-utilization 110 .5 4 --no-increasing
ceph osd test-reweight-by-utilization 110 .5 4 --no-increasing
다음과 같습니다.
-
임계값
은 데이터 스토리지 로드가 더 높은 OSD에서 더 낮은 가중치를 가지며 그에 더 적은 PG를 할당할 수 있도록 하는 사용률입니다. 기본값은 120 %를 반영하여120
%입니다.100+
의 모든 값은 유효한 임계값입니다. 선택 사항: -
weight_change_amount
는 가중치를 변경할 양입니다. 유효한 값은0.0 - 1.0
보다 큽니다. 기본값은0.05
입니다. 선택 사항: -
number_of_OSDs
는 재사용 할 최대 OSD 수입니다. 대규모 클러스터의 경우 OSD 수를 다시 스케일링하도록 제한하면 상당한 재조정이 방지됩니다. 선택 사항: -
기본적으로
no-increasing
는 해제 되어 있습니다. reweight-by-utilization 또는test-
를 늘릴 수 있습니다. 이 옵션을 이러한 명령과 함께 사용하면 OSD의 사용량이 낮은 경우에도 OSD 가중치가 늘어나지 않습니다. 선택 사항:reweight-by-utilization
명령을 사용하면 osd 가중치
reweight-by-utilization
을 실행하는 것이 권장되며 대규모 클러스터에는 다소 불가피합니다. 사용률은 시간이 지남에 따라 변경될 수 있으며 클러스터 크기 또는 하드웨어 변경에 따라 가중치를 업데이트하여 변경 사용률을 반영해야 할 수 있습니다. 사용률에 따라 재가중을 선택하는 경우 이 명령을 사용률, 하드웨어 또는 클러스터 크기 변경으로 다시 실행해야 할 수 있습니다.
가중치를 할당하는 이 또는 기타 가중치 명령을 실행하면 이 명령에서 할당한 가중치(예: osd reweight-by-utilization
,osd crush weight
,osd weight
,in
또는 out
)가 재정의됩니다.
2.5.5. PG Distribution에서 OSD의 가중치 설정
CRUSH 계층 구조에서 OSD 수가 적은 경우 일부 OSD에서 다른 OSD보다 더 많은 PG를 얻을 수 있으므로 부하가 높아집니다. PG 배포로 OSD를 다시 스케일링하여 다음을 실행하여 이 상황을 해결할 수 있습니다.
osd reweight-by-pg <poolname>
osd reweight-by-pg <poolname>
다음과 같습니다.
-
Poolname
은 풀의 이름입니다. Ceph는 풀에서 OSD에 PG를 할당하고 이 풀의 PG 배포에 따라 OSD를 재사용하는 방법을 검토합니다. 동일한 CRUSH 계층 구조에 여러 개의 풀을 할당할 수 있습니다. 하나의 풀의 배포에 따라 OSD를 다시 스케일링하면 동일한 size(복제본 수) 및 PGs가 없는 경우 다른 풀에 대해 동일한 CRUSH 계층에 할당되는 의도하지 않은 효과가 있을 수 있습니다.
2.5.6. CRUSH 트리의 가중치 재계산
CRUSH 트리 버킷은 리프 가중치의 합계여야 합니다. CRUSH 맵 가중치를 수동으로 편집하는 경우 다음을 실행하여 CRUSH 버킷 트리가 버킷 아래의 리프 OSD의 합계를 정확하게 반영하는지 확인해야 합니다.
osd crush reweight-all
osd crush reweight-all