스토리지 전략 가이드

Red Hat Ceph Storage 4

Red Hat Ceph Storage 클러스터용 스토리지 전략 생성

Red Hat Ceph Storage Documentation Team

초록

이 문서에서는 CRUSH 계층 구조 생성, 배치 그룹 수 추정, 풀 생성 및 관리할 스토리지 풀 유형을 결정하는 등 스토리지 전략을 생성하는 방법을 설명합니다.
Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 용어를 교체하기 위해 최선을 다하고 있습니다. 먼저 마스터(master), 슬레이브(slave), 블랙리스트(blacklist), 화이트리스트(whitelist) 등 네 가지 용어를 교체하고 있습니다. 이러한 변경 작업은 작업 범위가 크므로 향후 여러 릴리스에 걸쳐 점차 구현할 예정입니다. 자세한 내용은 CTO Chris Wright의 메시지를 참조하십시오.

1장. 개요

Ceph 클라이언트의 관점에서 Ceph 스토리지 클러스터와의 상호 작용은 매우 간단합니다.

  1. 클러스터에 연결
  2. 풀 I/O 컨텍스트 생성

이러한 간단한 인터페이스는 Ceph 클라이언트가 정의한 스토리지 전략 중 하나를 선택하는 방법입니다. 스토리지 전략은 모든 Ceph 클라이언트에 표시되지 않지만 스토리지 용량 및 성능을 제공합니다.

아래 다이어그램은 클라이언트에서 Red Hat Ceph Storage 클러스터로 시작하는 논리 데이터 흐름을 보여줍니다.

arch 데이터 흐름

1.1. 스토리지 전략이란 무엇입니까?

스토리지 전략은 특정 사용 사례에 서비스를 제공하는 데이터를 저장하는 방법입니다. 예를 들어 OpenStack과 같은 클라우드 플랫폼에 볼륨과 이미지를 저장해야 하는 경우 SSD 기반 저널을 사용하여 합리적으로 실행 중인 SAS 드라이브에 데이터를 저장하도록 선택할 수 있습니다. 반대로 S3- 또는 Swift 호환 게이트웨이의 오브젝트 데이터를 저장해야 하는 경우 SATA 드라이브와 같이 더 경제적으로 사용할 수 있습니다. Ceph는 동일한 Ceph 클러스터의 두 시나리오를 수용할 수 있지만 클라우드 플랫폼(예: OpenStack의 Glance 및 Cinder)에 SAS/SSD 스토리지 전략을 제공하고 오브젝트 저장소에 SATA 스토리지를 제공하는 수단이 필요합니다.

스토리지 전략에는 스토리지 미디어(하드 드라이브, SSD 및 나머지), 스토리지 미디어의 성능 및 실패 도메인, 배치 그룹 수 및 풀 인터페이스를 설정하는 CRUSH 맵이 포함됩니다. Ceph는 여러 스토리지 전략을 지원합니다. 사용 사례, 비용/벤치 성능 절충 및 데이터 지속성은 스토리지 전략을 구동하는 주요 고려 사항입니다.

  1. 사용 사례: Ceph는 대규모 스토리지 용량을 제공하며 다양한 사용 사례를 지원합니다. 예를 들어, Ceph Block Device 클라이언트는 OpenStack과 같은 클라우드 플랫폼의 주요 스토리지 백엔드로서 copy-on-write 복제와 같은 고성능 기능을 갖춘 볼륨 및 이미지에 제한이 없는 스토리지를 제공합니다. 반면 Ceph Object Gateway 클라이언트는 audio,sandbox, 비디오 및 기타 데이터와 같은 개체에 RESTful S3 호환 및 Swift 호환 개체 스토리지를 제공하는 클라우드 플랫폼을 위한 선도적인 스토리지 백엔드입니다.
  2. 비용/성능의 이점: 빠른 속도가 더 좋습니다. 더 큰 것이 더 좋습니다. 높은 지속성이 더 좋습니다. 그러나 각 초급 품질 및 해당 비용/벤치 거래에 대한 가격이 있습니다. 성능 관점에서 다음 사용 사례를 살펴보십시오. SSD는 비교적 적은 양의 데이터 및 저널링을 위해 매우 빠른 스토리지를 제공할 수 있습니다. 데이터베이스 또는 오브젝트 인덱스를 저장하면 매우 빠른 SSD 풀의 이점을 얻을 수 있지만 다른 데이터에 대해서는 비용이 너무 많이 들 수 있습니다. SSD 저널링을 사용하는 SAS 드라이브는 볼륨과 이미지의 경제적인 가격으로 빠른 성능을 제공합니다. SSD 저널링이 없는 SATA 드라이브는 전체 성능이 낮은 저렴한 스토리지를 제공합니다. OSD의 CRUSH 계층 구조를 생성할 때 사용 사례와 허용 가능한 비용/성능의 절충을 고려해야 합니다.
  3. 불안정성: 대규모 클러스터에서는 하드웨어 장애도 예외가 아닌 예상입니다. 그러나 데이터 손실 및 서비스 중단은 허용되지 않습니다. 이러한 이유로 데이터 지속성이 매우 중요합니다. Ceph는 개체의 여러 딥 사본 또는 삭제 코딩 및 여러 코딩 청크로 데이터 지속성을 처리합니다. 여러 사본 또는 여러 코딩 청크가 추가 비용/부충을 제공합니다. 복사 또는 코딩 청크를 덜 저장하는 것은 저렴하지만 성능이 저하된 상태에서 서비스 쓰기 요청이 불가능해질 수 있습니다. 일반적으로 두 개의 추가 복사본(즉, size = 3) 또는 두 개의 코딩 청크를 가진 하나의 개체로 인해 클러스터가 복구되는 동안 클러스터가 성능이 저하된 상태의 쓰기를 서비스할 수 있습니다. CRUSH 알고리즘은 Ceph가 클러스터 내의 다른 위치에 추가 사본 또는 코딩 청크를 저장하도록 하여 이 프로세스를 지원합니다. 이렇게 하면 단일 스토리지 장치 또는 노드의 장애가 발생하면 데이터 손실을 사전에 제외하는 데 필요한 모든 사본이나 코딩 청크가 손실되지 않습니다.

스토리지 전략에서 사용 사례, 비용/벤치 성능 절충 및 데이터 지속성을 캡처하여 Ceph 클라이언트에 스토리지 풀로 제공할 수 있습니다.

중요

Ceph의 개체 복사 또는 코딩 청크는 RAID를 더 이상 사용하지 않습니다. Ceph는 이미 데이터 지속성을 처리하므로 RAID를 사용하지 마십시오. 성능이 저하된 RAID는 성능에 부정적인 영향을 미치며 RAID를 사용하여 데이터를 복구하는 것은 깊은 복사본 또는 코딩 청크를 사용하는 것보다 훨씬 느립니다.

1.2. 스토리지 전략 구성

스토리지 전략을 구성하는 것은 Ceph OSD를 CRUSH 계층 구조에 할당하고, 풀의 배치 그룹 수를 정의하며, 풀을 만드는 것입니다. 일반적인 단계는 다음과 같습니다.

  1. 스토리지 전략 정의: 스토리지 전략에서는 사용 사례, 비용/벤치 성능 절충 및 데이터 지속성을 분석해야 합니다. 그런 다음 해당 사용 사례에 적합한 OSD를 생성합니다. 예를 들어 고성능 블록 장치 볼륨 및 이미지에 대해 SAS drive/SSD journal-backed OSD를 위해 SSD 지원 OSD를 생성할 수 있습니다. 또는 저렴한 비용으로 SATA 지원 OSD를 생성할 수 있습니다. 이상적인 경우 각 OSD는 일관된 성능 프로필을 보유하도록 하드웨어 구성이 동일해야 합니다.
  2. CRUSH 계층 구조 정의: Ceph 규칙은 CRUSH 계층에서 노드(일반적으로 루트)를 선택하고 배치 그룹 및 포함된 오브젝트를 저장하는 데 적절한 OSD를 식별합니다. 스토리지 전략에 대한 CRUSH 계층 구조와 CRUSH 규칙을 생성해야 합니다. CRUSH 계층 구조는 CRUSH 규칙 설정을 통해 풀에 직접 할당됩니다.
  3. 배치 그룹 계산: Ceph에서 풀을 배치 그룹으로 분할합니다. 풀에 적절한 배치 그룹을 설정하고 동일한 CRUSH 규칙에 여러 개의 풀을 할당하는 경우 정상 최대 배치 그룹 수에 있어야 합니다.
  4. 풀 생성: finally, 즉, 풀을 생성하고 복제된 스토리지를 사용하는지 확인해야 합니다. 풀에 대한 배치 그룹 수, 풀의 규칙 및 지속성(크기 또는 K+M 코딩 청크)을 설정해야 합니다.

풀은 스토리지 클러스터에 대한 Ceph 클라이언트의 인터페이스이지만 스토리지 전략은 Ceph 클라이언트에 완전히 투명합니다(용량 및 성능을 제외하고).

2장. CRUSH 관리

CRUSH(Controlled Replication Underxtensible Hashing) 알고리즘은 컴퓨팅 데이터 스토리지 위치에 따라 데이터를 저장하고 검색하는 방법을 결정합니다.

 

충분히 발전된 기술은 매직과 구별할 수 없습니다.

 
 -- Arthur C. Clarke

2.1. CRUSH 소개

스토리지 클러스터의 CRUSH 맵은 CRUSH 계층 구조 내의 장치 위치와 Ceph가 데이터를 저장하는 방법을 결정하는 각 계층에 대한 규칙을 설명합니다.

CRUSH 맵에는 하나 이상의 노드 계층과 leaves가 포함되어 있습니다. Ceph에서 "buckets"라고 하는 계층의 노드는 해당 유형에 정의된 스토리지 위치 집계입니다. 예를 들어 행, 랙, 섀시, 호스트 및 장치입니다. 계층 구조의 각 리프는 스토리지 장치 목록에 있는 스토리지 장치 중 하나로 본질적으로 구성됩니다. 리프는 항상 하나의 노드 또는 "bucket"에 포함됩니다. CRUSH 맵에는 CRUSH가 데이터를 저장하고 검색하는 방법을 결정하는 규칙 목록도 있습니다.

참고

클러스터에 OSD를 추가할 때 CRUSH 맵에 스토리지 장치가 추가됩니다.

CRUSH 알고리즘은 장치별 가중치 값에 따라 데이터 개체를 스토리지 장치에 분배하여 균일한 확률 분배를 적용합니다. CRUSH는 관리자가 정의하는 계층적 클러스터 맵에 따라 오브젝트 및 해당 복제본 또는 삭제-코딩 청크를 배포합니다. CRUSH 맵은 사용 가능한 스토리지 장치와 규칙에 대해 포함하는 논리 버킷과 규칙을 사용하는 각 풀을 확장함으로써 나타냅니다.

오류 도메인 또는 성능 도메인에서 배치 그룹을 OSD에 매핑하기 위해 CRUSH 맵은 생성된 CRUSH 맵의 유형에 따라 계층적 버킷 유형 목록을 정의합니다. 버킷 계층 구조를 생성하는 목적은 장애 도메인 또는 성능 도메인 또는 둘 다에 의해 리프 노드를 분리하는 것입니다. 장애 도메인에는 호스트, 섀시, 랙, 전력 분산 장치, pod, 행, 방, 데이터 센터가 포함됩니다. 성능 도메인에는 특정 구성의 장애 도메인 및 OSD가 포함됩니다. 예를 들어 SSD, SAS는 SSD 저널, SATA 드라이브 등으로 구동합니다. RHCS 3에서 장치에는 hdd,ssdnvme 와 같은 클래스의 개념이 더 빠르게 장치 클래스를 사용하여 CRUSH 계층 구조를 빌드하도록 합니다.

OSD를 나타내는 리프 노드를 제외하고 나머지 계층 구조는 임의적이며 기본 유형이 요구 사항에 맞지 않는 경우 고유한 요구 사항에 따라 정의할 수 있습니다. CRUSH 맵 버킷 유형을 조직의 하드웨어 이름 지정 규칙에 수정하고 물리적 하드웨어 이름을 반영하는 인스턴스 이름을 사용하는 것이 좋습니다. 이름 지정 방법을 사용하면 클러스터를 보다 쉽게 관리하고 OSD 또는 기타 하드웨어 결함과 관리자가 호스트 또는 기타 하드웨어에 대한 원격 또는 물리적 액세스가 필요할 때 문제를 해결할 수 있습니다.

다음 예에서 버킷 계층 구조에는 4개의 리프 버킷(osd 1-4), 두 개의 노드 버킷(호스트much)과 1개의 랙 노드(rack 1)가 있습니다.

CRUSH Hierarchy

리프 노드는 CRUSH 맵 시작 부분에 장치 목록 아래에 선언된 스토리지 장치를 반영하므로 이를 버킷 인스턴스로 선언할 필요가 없습니다. 계층 구조의 두 번째 가장 낮은 버킷 유형은 일반적으로 장치를 집계합니다. 즉, 스토리지 미디어를 포함하는 컴퓨터이며 관리자가 "node", "server", "server", "host", "machine" 등과 같은 설명하려는 모든 용어를 사용합니다. 밀도가 높은 환경에서는 카드당 및 섀시당 여러 호스트/노드를 확인하는 것이 점점 더 일반적입니다. 예를 들어, 노드가 실패하는 경우 카드 또는 섀시를 가져와야 하는 경우 카드 및 섀시도 카드 및 섀시를 고려해야 합니다. 이로 인해 수많은 호스트/노드와 OSD가 다운될 수 있습니다.

버킷 인스턴스를 선언할 때 유형을 지정하고, 고유한 이름을 문자열로 지정하고, 음수 정수로 표시된 선택적 고유 ID를 할당하고, 항목의 총 용량 또는 기능에 대한 가중치를 지정하고, straw 와 같은 버킷 알고리즘을 지정하고, 일반적으로 0 으로 해시 알고리즘 rjenkins1 을 반영합니다. 버킷에는 하나 이상의 항목이 있을 수 있습니다. 항목은 노드 버킷 또는 leaves로 구성될 수 있습니다. 항목에 항목의 상대적 가중치를 반영하는 가중치가 있을 수 있습니다.

2.1.1. 동적 데이터 배치

Ceph 클라이언트 및 Ceph OSD는 모두 CRUSH 맵과 CRUSH 알고리즘을 사용합니다.

  • Ceph 클라이언트: CRUSH 맵을 Ceph 클라이언트에 배포하면 Ceph 클라이언트가 OSD와 직접 통신할 수 있습니다. 즉, Ceph 클라이언트는 단일 장애 지점, 성능 병목 현상, 중앙 집중식 조회 서버의 연결 제한 및 스토리지 클러스터 확장성에 대한 물리적 제한으로 작동할 수 있는 중앙 집중식 오브젝트 조회 테이블을 방지합니다.
  • Ceph OSD: CRUSH 맵을 Ceph OSD에 배포하면 OSD에서 복제, 백필링 및 복구를 처리할 수 있습니다. 즉, Ceph OSD는 Ceph 클라이언트를 대신하여 오브젝트 복제본(또는 코딩 청크)의 스토리지를 처리합니다. 또한 Ceph OSD에서 클러스터의 재조정(백분)을 재조정하고 오류를 동적으로 복구할 수 있을 만큼 충분한 정보를 알고 있음을 의미합니다.

2.1.2. 실패 도메인 설정

여러 오브젝트 복제본 또는 M pastsure 코딩 청크가 있으면 데이터 손실을 방지하는 데 도움이 되지만 고가용성을 처리하는 것만으로는 충분하지 않습니다. CRUSH는 Ceph Storage 클러스터의 기본 물리적 조직을 반영하여 장치 오류의 영향을 받을 수 있는 관련 소스를 모델링할 수 있습니다. 클러스터 토폴로지를 클러스터 맵으로 인코딩하면 CRUSH 배치 정책은 원하는 의사 임의 배포를 유지 관리하는 동안 다양한 장애 도메인에서 오브젝트 복제본 또는 삭제 코딩 청크를 분리할 수 있습니다. 예를 들어 동시 오류를 처리할 수 있는 가능성을 해결하려면 데이터 복제본 또는 삭제 코딩 청크가 서로 다른 보류, 랙, 전원 공급 장치, 컨트롤러 또는 물리적 위치를 사용하는 장치에 있는지 확인하는 것이 바람직할 수 있습니다. 이를 통해 데이터 손실을 방지하고 클러스터가 저하된 상태에서 작동할 수 있습니다.

2.1.3. 성능 도메인 설정

Ceph는 여러 계층을 지원하여 한 가지 유형의 하드웨어 성능 프로필을 다른 유형의 하드웨어 성능 프로필과 분리할 수 있습니다. 예를 들어 CRUSH는 하드 디스크 드라이브용 계층 구조와 SSD용 다른 계층 구조를 생성할 수 있습니다. 성능 도메인- 기본 하드웨어의 성능 프로파일을 고려하는 기능은 점점 더 널리 사용되고 있으며, 서로 다른 성능 특성을 지원할 필요성으로 인해 점점 더 널리 사용되고 있습니다. 운영 체제는 두 개 이상의 루트 유형 버킷이 있는 CRUSH 맵일 뿐입니다. 사용 사례 예는 다음과 같습니다.

  • VM: OpenStack, CloudStack, ProxMox 또는 OpenNebula와 같은 클라우드 플랫폼에 대한 백엔드로 사용되는 Ceph 호스트는 XFS가 동시에 저널링 및 쓰기를 위해 고성능 SSD가 분할된 XFS 드라이브의 가장 안정적이고 성능이 뛰어난 파일 시스템을 사용하는 경향이 있습니다. 일관된 성능 프로필을 유지하려면 이러한 사용 사례는 CRUSH 계층 구조에서 유사한 하드웨어를 집계해야 합니다.
  • 오브젝트 스토리지 : S3 및 Swift 인터페이스에 대한 오브젝트 스토리지 백엔드로 사용되는 Ceph 호스트는 VM에 적합하지 않을 수 있는 SATA 드라이브와 같은 저렴한 스토리지 미디어를 활용할 수 있으며, VM당 비용이 절감되는 한편, 클라우드 플랫폼의 볼륨 및 이미지를 저장하기 위한 더 경제적인 스토리지 호스트를 분리할 수 있습니다. HTTP는 오브젝트 스토리지 시스템의 병목 현상이 되는 경향이 있습니다.
  • 콜드 스토리지: 콜드 스토리지(Fold storage)를 위해 설계된 시스템(Fold storage-​infrequentrequentrequentrequently accessed data) 또는 성능 요구 사항을 완화하여 데이터 검색 기능을 설계하면 비용이 적게 드는 스토리지 미디어 및 삭제 코드를 활용할 수 있습니다. 그러나 코딩은 약간의 추가 RAM과 CPU가 필요할 수 있으므로 개체 스토리지 또는 VM에 사용되는 호스트의 RAM 및 CPU 요구 사항이 다릅니다.
  • SSD 지원 풀: SSD는 비용이 많이 들고 하드 디스크 드라이브보다 큰 이점을 제공합니다. SSD에는 검색 시간이 없으며 높은 처리량을 제공합니다. 클러스터는 저널링을 위해 SSD를 사용하는 것 외에도 SSD 지원 풀을 지원할 수 있습니다. 일반적인 사용 사례에는 고성능 SSD 풀이 포함됩니다. 예를 들어, Ceph Object Gateway의 .rgw.buckets.index 풀을 SATA 드라이브 대신 SSD에 매핑할 수 있습니다. Red Hat은 인덱스 풀에 대한 HDD 장치를 지원하지 않습니다. 지원되는 구성에 대한 자세한 내용은 Red Hat Ceph Storage: 지원되는 구성 문서를 참조하십시오.

RHCS 3 이상 릴리스에서 CRUSH 맵은 장치 클래스의 개념을 지원합니다. Ceph는 스토리지 장치의 측면을 검색하고 hdd,ssd 또는 nvme 와 같은 클래스를 자동으로 할당할 수 있습니다. 그러나 CRUSH는 이러한 기본값으로 제한되지 않습니다. 예를 들어 CRUSH 계층 구조를 사용하여 다양한 유형의 워크로드를 분리할 수도 있습니다. 예를 들어 SSD는 저널 또는 write-ahead 로그, 버킷 인덱스 또는 원시 오브젝트 스토리지에 사용할 수 있습니다. CRUSH는 ssd-bucket-index 또는 ssd-object-storage 와 같은 다양한 장치 클래스를 지원할 수 있으므로 Ceph는 다양한 워크로드에 동일한 스토리지 미디어를 사용하지 않으므로 성능을 예측하고 일관되게 조정할 수 있습니다.

2.1.3.1. RHCS 3 및 later에서 다른 장치 클래스 사용

RHCS 3에서 성능 도메인을 생성하려면 장치 클래스 및 단일 CRUSH 계층 구조를 사용합니다. CLI를 사용하여 RHCS 2와 동일한 방식으로 OSD를 CRUSH 계층에 추가하기만 하면 됩니다. 다음 작업을 수행합니다.

  1. 각 장치에 클래스를 추가합니다. 예:

    # ceph osd crush set-device-class <class> <osdId> [<osdId>]
    # ceph osd crush set-device-class hdd osd.0 osd.1 osd.4 osd.5
    # ceph osd crush set-device-class ssd osd.2 osd.3 osd.6 osd.7
  2. 그런 다음 장치를 사용할 규칙을 만듭니다.

    # ceph osd crush rule create-replicated <rule-name> <root> <failure-domain-type> <class>
    # ceph osd crush rule create-replicated cold default host hdd
    # ceph osd crush rule create-replicated hot default host ssd
  3. 마지막으로 규칙을 사용하도록 풀을 설정합니다.

    ceph osd pool set <poolname> crush_rule <rule-name>
    ceph osd pool set cold_tier crush_rule cold
    ceph osd pool set hot_tier crush_rule hot

RHCS 3 이상을 사용하면 CRUSH 맵을 수동으로 편집할 필요가 없습니다.

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의 드로잉과 유사한 프로세스를 통해 복제 배치를 위해 모든 항목을 서로 상대적으로 "결합"할 수 있습니다.

2.3. CRUSH의 Ceph OSD

OSD의 CRUSH 계층 구조가 있으면 OSD를 CRUSH 계층에 추가합니다. 기존 계층에서 OSD를 이동하거나 제거할 수도 있습니다. Ceph CLI 사용에는 다음과 같은 값이 있습니다.

id
설명
OSD의 숫자 ID입니다.
유형
정수
필수 항목
있음
예제
0
name
설명
OSD의 전체 이름입니다.
유형
문자열
필수 항목
있음
예제
osd.0
weight
설명
OSD의 CRUSH 가중치입니다.
유형
double
필수 항목
있음
예제
2.0
루트
설명
OSD가 상주하는 계층 또는 트리의 루트 버킷의 이름입니다.
유형
키-값 쌍입니다.
필수 항목
있음
예제
root=default,root=replicated_rule
bucket-type
설명
하나 이상의 이름-값 쌍입니다. 여기서 name은 버킷 유형이며 값은 버킷의 이름입니다. CRUSH 계층 구조에서 OSD의 CRUSH 위치를 지정할 수 있습니다.
유형
키-값 쌍입니다.
필수 항목
없음
예제
datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1

2.3.1. CRUSH에서 OSD 보기

ceph osd crush tree 명령은 트리 보기에 CRUSH 버킷 및 항목을 출력합니다. 특정 버킷의 OSD 목록을 확인하려면 이 명령을 사용합니다. ceph osd 트리 와 유사한 출력을 출력합니다.

추가 세부 정보를 반환하려면 다음을 실행합니다.

# ceph osd crush tree -f json-pretty

이 명령은 다음과 유사한 출력을 반환합니다.

[
    {
        "id": -2,
        "name": "ssd",
        "type": "root",
        "type_id": 10,
        "items": [
            {
                "id": -6,
                "name": "dell-per630-11-ssd",
                "type": "host",
                "type_id": 1,
                "items": [
                    {
                        "id": 6,
                        "name": "osd.6",
                        "type": "osd",
                        "type_id": 0,
                        "crush_weight": 0.099991,
                        "depth": 2
                    }
                ]
            },
            {
                "id": -7,
                "name": "dell-per630-12-ssd",
                "type": "host",
                "type_id": 1,
                "items": [
                    {
                        "id": 7,
                        "name": "osd.7",
                        "type": "osd",
                        "type_id": 0,
                        "crush_weight": 0.099991,
                        "depth": 2
                    }
                ]
            },
            {
                "id": -8,
                "name": "dell-per630-13-ssd",
                "type": "host",
                "type_id": 1,
                "items": [
                    {
                        "id": 8,
                        "name": "osd.8",
                        "type": "osd",
                        "type_id": 0,
                        "crush_weight": 0.099991,
                        "depth": 2
                    }
                ]
            }
        ]
    },
    {
        "id": -1,
        "name": "default",
        "type": "root",
        "type_id": 10,
        "items": [
            {
                "id": -3,
                "name": "dell-per630-11",
                "type": "host",
                "type_id": 1,
                "items": [
                    {
                        "id": 0,
                        "name": "osd.0",
                        "type": "osd",
                        "type_id": 0,
                        "crush_weight": 0.449997,
                        "depth": 2
                    },
                    {
                        "id": 3,
                        "name": "osd.3",
                        "type": "osd",
                        "type_id": 0,
                        "crush_weight": 0.289993,
                        "depth": 2
                    }
                ]
            },
            {
                "id": -4,
                "name": "dell-per630-12",
                "type": "host",
                "type_id": 1,
                "items": [
                    {
                        "id": 1,
                        "name": "osd.1",
                        "type": "osd",
                        "type_id": 0,
                        "crush_weight": 0.449997,
                        "depth": 2
                    },
                    {
                        "id": 4,
                        "name": "osd.4",
                        "type": "osd",
                        "type_id": 0,
                        "crush_weight": 0.289993,
                        "depth": 2
                    }
                ]
            },
            {
                "id": -5,
                "name": "dell-per630-13",
                "type": "host",
                "type_id": 1,
                "items": [
                    {
                        "id": 2,
                        "name": "osd.2",
                        "type": "osd",
                        "type_id": 0,
                        "crush_weight": 0.449997,
                        "depth": 2
                    },
                    {
                        "id": 5,
                        "name": "osd.5",
                        "type": "osd",
                        "type_id": 0,
                        "crush_weight": 0.289993,
                        "depth": 2
                    }
                ]
            }
        ]
    }
]
참고

RHCS 3 이상에서는 OSD 오브젝트에 device_class 속성도 있습니다.

2.3.2. CRUSH에 OSD 추가

CRUSH 계층에 OSD를 추가하는 것은 OSD를 시작하고(대부분의) Ceph 에서배치 그룹을 OSD에 할당하는 마지막 단계입니다.

참고

RHCS 3에서는 장치 클래스를 추가할 수도 있습니다.

CRUSH 계층 구조에 추가하기 전에 OSD를 준비해야 합니다. 배포 유틸리티(Ansible 자동화 애플리케이션)는 이 단계를 수행합니다. 자세한 내용은 OSD 추가/제거를 참조하십시오.

CRUSH 계층 구조로 표시되지 않으므로 ceph osd crush add 명령을 사용하면 원하는 위치에서 OSD를 CRUSH 계층에 추가할 수 있습니다. 지정한 위치는 실제 위치를 반영 해야 합니다. 하나 이상의 버킷을 지정하면 명령에서 지정한 가장 구체적인 버킷에 OSD를 배치하고 지정한 다른 버킷 아래에 해당 버킷을 이동합니다.

CRUSH 계층 구조에 OSD를 추가하려면 다음을 수행합니다.

ceph osd crush add {id-or-name} {weight}  [{bucket-type}={bucket-name} ...]
중요

루트 버킷만 지정하는 경우 이 명령은 OSD를 루트에 직접 연결합니다. 그러나 CRUSH 규칙은 OSD가 호스트 또는 섀시 내에 있어야 하며 호스트 또는 섀시는 클러스터 토폴로지를 반영하는 다른 버킷 내부에 있어야 합니다.

다음 예제에서는 osd.0 을 계층에 추가합니다.

ceph osd crush add osd.0 1.0 root=default datacenter=dc1 room=room1 row=foo rack=bar host=foo-bar-1
참고

ceph osd crush set 또는 ceph osd crush-hiera를 사용하여 OSD를 CRUSH 계층에 추가할 수도 있습니다.

2.3.3. CRUSH 계층 구조 내에서 OSD 이동

Ansible 자동화 애플리케이션과 같은 배포 유틸리티에서 기본 CRUSH 위치의 CRUSH 맵에 OSD를 추가하거나 클러스터 토폴로지가 변경되면 CRUSH 계층에서 OSD를 이동하여 실제 위치를 반영할 수 있습니다.

중요

CRUSH 계층에서 OSD를 이동하면 Ceph에서 OSD에 할당되는 배치 그룹을 다시 계산하여 데이터를 많이 재배포할 수 있습니다.

CRUSH 계층 구조 내에서 OSD를 이동하려면 다음을 수행합니다.

ceph osd crush set {id-or-name} {weight} root={pool-name}  [{bucket-type}={bucket-name} ...]
참고

ceph osd crush create-or- hiera를 사용하여 CRUSH 계층 구조 내에서 OSD를 이동할 수도 있습니다.

2.3.4. CRUSH Hierarchy에서 OSD 제거

CRUSH 계층에서 OSD를 제거하는 것이 클러스터에서 OSD를 제거하려는 첫 번째 단계입니다. CRUSH 맵에서 OSD를 제거하면 CRUSH가 배치 그룹을 가져오는 OSD를 재계산하고 그에 따라 데이터를 재조정할 수 있습니다. 자세한 내용은 OSD 추가/제거를 참조하십시오.

실행 중인 클러스터의 CRUSH 맵에서 OSD를 제거하려면 다음을 실행합니다.

ceph osd crush remove {name}

2.4. 장치 클래스

Ceph의 CRUSH 맵은 데이터 배치를 제어하는 데 특별한 유연성을 제공합니다. Ceph의 가장 큰 장점 중 하나입니다. 초기 Ceph 배포에서는 하드 디스크 드라이브를 거의 독점적으로 사용했습니다. 현재 Ceph 클러스터는 종종 HDD, SSD, NVMe 또는 다양한 클래스의 스토리지 장치와 함께 구축됩니다. 예를 들어 Ceph Object Gateway 배포에서는 클라이언트가 속도가 느린 HDD에 데이터를 저장할 수 있는 스토리지 정책 및 빠른 SSD에 데이터를 저장하기 위한 스토리지 정책을 사용하는 것이 일반적입니다. Ceph Object Gateway 배포에는 버킷 인덱스에 대한 빠른 SSD가 지원하는 풀이 있을 수 있습니다. 또한 OSD 노드에는 종종 CRUSH 맵에 표시되지 않는 저널 또는 쓰기 로그에만 사용되는 SSD가 있습니다. 이전에는 이러한 복잡한 하드웨어 시나리오에는 CRUSH 맵을 수동으로 편집해야 하므로 시간이 오래 걸리고 번거롭습니다. RHCS 3에서 Red Hat은 새로운 'device 클래스'를 추가하여 CRUSH 계층 생성을 크게 단순화합니다. RHCS 3 이상에서는 다른 스토리지 장치 클래스에 대해 서로 다른 CRUSH 계층을 사용할 필요가 없습니다.

CRUSH 규칙은 CRUSH 계층 구조 측면에서 작동합니다. 그러나 스토리지 장치의 다른 클래스가 동일한 호스트에 있는 경우 프로세스가 각 장치 클래스에 대해 여러 CRUSH 계층을 생성하기 위해 더 복잡해진 후 CRUSH 계층 구조 관리를 자동화하는 시작 옵션에서 osd crush 업데이트를 비활성화했습니다. 장치 클래스는 CRUSH 규칙에 사용할 장치 클래스를 지시하여 CRUSH 관리 작업을 크게 단순화하여 이러한 번거로움을 제거합니다.

참고

RHCS 3 이상에서는 ceph osd tree 명령에 장치 클래스를 반영하는 열이 있습니다.

다음 섹션에서는 장치 클래스 사용에 대해 자세히 설명합니다. 추가 예는 RHCS 3 및 later 및 CRUSH 스토리지 전략에서 다른 장치 클래스 사용을 참조하십시오.

2.4.1. 장치 클래스 설정

OSD의 장치 클래스를 설정하려면 다음을 실행합니다.

# ceph osd crush set-device-class <class> <osdId> [<osdId>...]

예:

# ceph osd crush set-device-class hdd osd.0 osd.1
# ceph osd crush set-device-class ssd osd.2 osd.3
# ceph osd crush set-device-class bucket-index osd.4
참고

Ceph에서 자동으로 클래스를 장치에 할당할 수 있습니다. 그러나 클래스 이름은 단순히 임의의 문자열입니다. hdd,ssd 또는 nvme 을 준수할 필요는 없습니다. foregoing 예에서 bucket-index 라는 장치 클래스는 Ceph Object Gatway 풀이 독점적 버킷 인덱스 워크로드를 사용한다는 SSD 장치를 나타낼 수 있습니다. 이미 설정된 장치 클래스를 변경하려면 ceph osd crush rm-device-class 를 먼저 사용합니다.

2.4.2. 장치 클래스 제거

OSD의 장치 클래스를 제거하려면 다음을 실행합니다.

# ceph osd crush rm-device-class <class> <osdId> [<osdId>...]

예:

# ceph osd crush rm-device-class hdd osd.0 osd.1
# ceph osd crush rm-device-class ssd osd.2 osd.3
# ceph osd crush rm-device-class bucket-index osd.4

2.4.3. 장치 클래스 이름 변경

해당 클래스를 사용하는 모든 OSD의 장치 클래스의 이름을 변경하려면 다음을 실행합니다.

# ceph osd crush class rename <oldName> <newName>

예:

# ceph osd crush class rename hdd sas15k

2.4.4. 장치 클래스 나열

CRUSH 맵의 장치 클래스를 나열하려면 다음을 실행합니다.

# ceph osd crush class ls

출력은 다음과 같습니다.

[
    "hdd",
    "ssd",
    "bucket-index"
]

2.4.5. 장치 클래스의 OSD 나열

특정 클래스에 속하는 모든 OSD를 나열하려면 다음을 실행합니다.

# ceph osd crush class ls-osd <class>

예:

# ceph osd crush class ls-osd hdd

출력은 단순히 OSD 번호 목록입니다. 예:

0
1
2
3
4
5
6

2.4.6. 클래스별 CRUSH 규칙 나열

동일한 클래스를 참조하는 모든 crush 규칙을 나열하려면 다음을 실행합니다.

# ceph osd crush rule ls-by-class <class>

예:

# ceph osd crush rule ls-by-class hdd

2.5. CRUSH Weights

CRUSH 알고리즘은 새 데이터 오브젝트를 PGs 및 PGs에 할당하는 쓰기 요청에 대한 일관된 확률 분배를 적용하여 OSD 장치당 테라바이트 단위로 가중치 값을 할당합니다. 이러한 이유로 모범 사례로 동일한 유형과 크기의 장치를 사용하여 CRUSH 계층을 만들고 동일한 가중치를 할당하는 것이 좋습니다. 또한 성능 특성이 데이터 배포에 영향을 미치지 않더라도 CRUSH 계층 구조에서 일관된 성능 특성을 갖도록 I/O 및 처리량 특성이 동일한 장치를 사용하는 것이 좋습니다.

균일한 하드웨어를 사용하는 것은 항상 실용적이지 않기 때문에 서로 다른 크기의 OSD 장치를 통합하고 상대적 가중치를 사용하여 더 많은 데이터를 더 큰 장치에 배포하고 데이터를 더 작은 장치에 배포할 수 있습니다.

2.5.1. Terabytes에서 OSD의 가중치 설정

CRUSH 맵 내에서 Terabytes의 OSD CRUSH 가중치를 설정하려면 다음 명령을 실행합니다.

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. 버킷의 OSD 가중치 설정

ceph osd crush reweight 을 사용하면 시간이 오래 걸릴 수 있습니다. 다음을 실행하여 버킷(row, rack, node 등)에서 모든 Ceph OSD 가중치를 설정(또는 재설정)할 수 있습니다.

osd crush reweight-subtree <name>

여기서,

name 은 CRUSH 버킷의 이름입니다.

2.5.3. Weight 에서 OSD 설정

에서 ceph osdceph osd 의 목적으로 OSD는 클러스터에 있거나 클러스터 외부에 있습니다. 이렇게 하면 모니터가 OSD 상태를 기록합니다. 그러나 OSD가 클러스터 에있는 경우에도 문제를 해결할 때까지 사용하지 않으려는 등 오작동이 발생할 수 있습니다(예: 스토리지 드라이브를 교체하고 컨트롤러 교체 등).

다음을 실행하여 특정 OSD(즉, Terabytes 에서 가중치를 변경하지 않고)의 가중치를 늘리거나 줄일 수 있습니다.

ceph osd reweight {id} {weight}

다음과 같습니다.

  • ID 는 OSD 번호입니다.
  • weight 는 0.0-1.0의 범위이며, 여기서 0 은 클러스터에 없는 경우(즉, PG가 할당되지 않음) 클러스터에는 1.0입니다(즉, OSD는 다른 OSD와 동일한 수의 PG를 수신함).

2.5.4. Utilization으로 OSD의 가중치 설정

CRUSH는 새로운 데이터 오브젝트 PG 및 PG를 OSD에 할당하는 쓰기 요청에 대해 균일한 확률 분포를 근접하도록 설계되었습니다. 그러나 클러스터는 어쨌든 불균형이 될 수 있습니다. 이는 여러 가지 이유로 발생할 수 있습니다. 예:

  • 다중 풀: CRUSH 계층 구조에 여러 개의 풀을 할당할 수 있지만 풀에는 배치할 수 있는 배치 그룹, 크기(복제본 수) 및 개체 크기 특성이 다를 수 있습니다.
  • 사용자 지정 클라이언트: 블록 장치, 오브젝트 게이트웨이 및 파일 시스템 shard 데이터와 같은 Ceph 클라이언트는 클라이언트에서 데이터를 스트라이핑하고 클러스터 전체의 개체가 작은 RADOS 오브젝트로 데이터를 스트라이핑합니다. 예상 시나리오를 제외하고 CRUSH는 일반적으로 목표를 달성할 수 있습니다. 그러나 클러스터가 불균형이 될 수있는 또 다른 경우가 있습니다 : librados 를 사용하여 개체 크기를 정규화하지 않고 데이터를 저장합니다. 이 시나리오로 인해 불균형 클러스터가 발생할 수 있습니다(예: 100개의 1MB 오브젝트와 10 4MB 오브젝트를 저장하면 몇 개의 OSD에서 다른 오브젝트보다 많은 데이터가 더 많은 데이터를 보유하게 됩니다).
  • 확률: 균일한 배포로 인해 일부 OSD가 더 많은 PG가 있고 일부는 더 적은 OSD가 됩니다. OSD가 많은 클러스터의 경우 통계 이상값이 더 높아집니다.

다음을 실행하여 OSD 사용률을 다시 구성할 수 있습니다.

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

다음과 같습니다.

  • 임계값 은 사용률이므로 높은 데이터 스토리지 로드를 처리하는 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-reweight-by-utilization 명령을 사용할 때 osd 가중치를 늘릴 수 있습니다. 이 옵션을 이러한 명령과 함께 사용하면 OSD가 활용도가 낮은 경우에도 OSD 가중치가 증가하지 않습니다. 선택 사항:
중요

대규모 클러스터의 경우 reweight-by-utilization 을 실행하는 것이 권장되며 다소 불가피합니다. 사용률은 시간이 지남에 따라 변경될 수 있으며 클러스터 크기 또는 하드웨어 변경으로 인해 사용률 변경을 반영하려면 가중치를 업데이트해야 할 수 있습니다. 사용률로 다시 스케일링을 선택하는 경우 이 명령을 사용률, 하드웨어 또는 클러스터 크기 변경으로 다시 실행해야 할 수 있습니다.

가중치를 할당하는 이 또는 기타 weight 명령을 실행하면 이 명령에서 할당한 가중치를 재정의합니다(예: osd reweight-by-utilization,osd crush weight,osd weight,in 또는 out).

2.5.5. PG 배포를 통해 OSD의 가중치 설정

OSD 수가 적은 CRUSH 계층에서는 일부 OSD에서 다른 OSD보다 더 많은 PG를 가져올 수 있으므로 부하가 증가할 수 있습니다. 다음을 실행하여 이러한 상황을 해결하기 위해 PG 배포로 OSD를 다시 정렬할 수 있습니다.

osd reweight-by-pg <poolname>

다음과 같습니다.

  • Poolname 은 풀의 이름입니다. Ceph는 풀이 PG를 OSD에 할당하고 이 풀의 PG 배포에 따라 OSD를 다시 구성하는 방법을 검사합니다. 동일한 CRUSH 계층 구조에 여러 풀을 할당할 수 있습니다. 하나의 풀 배포에 따른 OSD를 다시 가중하면 동일한 크기(복제 수) 및 PG(복제 수)가 없는 경우 동일한 CRUSH 계층에 할당된 다른 풀에 의도하지 않은 효과가 있을 수 있습니다.

2.5.6. CRUSH 트리의 가중치 재계산

CRUSH 트리 버킷은 리프 가중치의 합계여야 합니다. CRUSH 맵 가중치를 수동으로 편집하는 경우 CRUSH 버킷 트리가 버킷 아래의 리프 OSD의 합계를 정확하게 반영하도록 다음을 실행해야 합니다.

osd crush reweight-all

2.6. 기본 유사성

Ceph 클라이언트가 데이터를 읽거나 쓸 때 항상 작동 세트의 기본 OSD에 연결합니다. set [2, 3, 4] 의 경우 osd.2 가 기본입니다. OSD가 다른 OSD와 비교하여 기본 역할을 수행하는 데 적합하지 않은 경우도 있습니다(예: 느린 디스크 또는 느린 컨트롤러가 있음). 하드웨어 활용도를 극대화하면서 성능 병목 현상(특히 읽기 작업)을 방지하기 위해 Ceph OSD의 기본 선호도를 설정하여 CRUSH가 작동 세트의 기본 설정으로 OSD를 사용할 가능성이 줄어듭니다.

ceph osd primary-affinity <osd-id> <weight>

기본 선호도는 기본적으로 1 입니다(즉, OSD가 1로 작동할 수 있음). 0-1 으로부터 OSD 기본 범위를 설정할 수 있습니다. 여기서 0 은 OSD를 1차로 사용하지 않을 수 있음을 의미합니다. 즉, OSD를 1 차로 사용할 수 있습니다. weight가 & lt; 1 이면 CRUSH가 기본 역할을 할 Ceph OSD 데몬을 선택할 가능성이 적습니다.

2.7. CRUSH 규칙

CRUSH 규칙은 Ceph 클라이언트가 버킷과 오브젝트를 저장하기 위해 기본 OSD를 선택하는 방법과 기본 OSD가 버킷과 보조 OSD를 선택하여 복제본 또는 코딩 청크를 저장하는 방법을 정의합니다. 예를 들어 두 오브젝트 복제본에 대해 SSD가 지원하는 대상 OSD 쌍을 선택하는 규칙과 3개의 복제본에 대해 다른 데이터 센터의 SAS 드라이브가 지원하는 3개의 대상 OSD를 선택하는 규칙을 만들 수 있습니다.

규칙은 다음 형식을 취합니다.

rule <rulename> {

    ruleset <ruleset>
    type [ replicated | raid4 ]
    min_size <min-size>
    max_size <max-size>
    step take <bucket-type> [class <class-name>]
    step [choose|chooseleaf] [firstn|indep] <N> <bucket-type>
    step emit
}
규칙 세트
설명
(더 이상 사용되지 않음) 규칙 세트에 속하는 규칙을 분류하는 수단입니다. 풀에서 ruleset을 설정하여 활성화합니다. RHCS 2 및 이전 릴리스에서 지원됩니다. RHCS 3 및 이후 릴리스에서는 지원되지 않습니다.
목적
규칙 마스크의 구성 요소입니다.
유형
정수
필수 항목
있음
기본값
0
type
설명
스토리지 드라이브(복제) 또는 RAID에 대한 규칙을 설명합니다.
목적
규칙 마스크의 구성 요소입니다.
유형
문자열
필수 항목
있음
기본값
replicated
유효한 값
현재 복제만 가능
min_size
설명
풀에서 이 수보다 복제본 수를 줄이는 경우 CRUSH는 이 규칙을 선택하지 않습니다.
유형
정수
목적
규칙 마스크의 구성 요소입니다.
필수 항목
있음
기본값
1
max_size
설명
풀에서 이 수보다 많은 복제본을 생성하는 경우 CRUSH는 이 규칙을 선택하지 않습니다.
유형
정수
목적
규칙 마스크의 구성 요소입니다.
필수 항목
있음
기본값
10
Step take <bucket-name> [class <class-name>]
설명
버킷 이름을 사용하고 트리를 반복하기 시작합니다. RHCS 3 이상에서 장치 클래스 이름을 사용할 수 있습니다.
목적
규칙의 구성 요소입니다.
필수 항목
있음
예제
Step take datastep take data class ssd
Step choose firstn <num> type <bucket-type>
설명

지정된 유형의 버킷 수를 선택합니다. 숫자는 일반적으로 풀의 복제본 수입니다(즉, 풀 크기).

  • &lt ;num> == 0인 경우 pool-num-replicas 버킷(모든 사용 가능)을 선택합니다.
  • < num> > 0 && < pool-num-replicas 이면 그 많은 버킷을 선택합니다.
  • < num& gt; <0 인 경우 pool-num-replicas - {num} 을 의미합니다.
목적
규칙의 구성 요소입니다.
사전 요구 사항
다음 단계 또는 단계 선택.
예제
첫 번째 1 유형 행 선택
Step chooseleaf firstn <num> type <bucket-type>
설명

{bucket-type} 의 버킷 세트를 선택하고 버킷 세트에 있는 각 버킷의 하위 트리에서 리프 노드를 선택합니다. 세트의 버킷 수는 일반적으로 풀 크기(풀 크기)의 복제본 수입니다.

  • &lt ;num> == 0인 경우 pool-num-replicas 버킷(모든 사용 가능)을 선택합니다.
  • < num> > 0 && < pool-num-replicas 이면 그 많은 버킷을 선택합니다.
  • &lt ;num > <0 이면 pool-num-replicas - <num>.
목적
규칙의 구성 요소입니다. 사용법은 두 단계를 사용하여 장치를 선택할 필요가 없습니다.
사전 요구 사항
다음 단계 또는 단계 선택.
예제
Step chooseleaf firstn 0 type row
Step emit
설명
현재 값을 출력하고 스택을 선점합니다. 일반적으로 규칙 끝에 사용되지만 동일한 규칙에서 다른 트리에서 선택하는 데 사용할 수도 있습니다.
목적
규칙의 구성 요소입니다.
사전 요구 사항
다음 단계를 선택합니다.
예제
Step emit
FirstN 대 Indep
설명
CRUSH 맵에 OSD가 표시되면 CRUSH에서 사용하는 대체 전략을 제어합니다. 이 규칙을 복제된 풀과 함께 사용해야 하는 경우 firstn 이어야 하며 삭제로 코딩된 풀의 경우 indep 이어야 합니다.
예제
OSD 1, 2, 3, 4, 5에 PG를 저장한 후 3이 다운됩니다. 첫 번째 시나리오에서 CRUSH는 번째 모드에서 계산을 조정하여 1과 2를 선택한 다음 3을 선택한 다음 3을 선택하므로 4 및 5를 다시 시도하여 새 OSD 6을 선택합니다. 최종 CRUSH 매핑 변경은 1, 2, 3, 4, 5 에서 1, 2, 4, 5, 6 입니다. 두 번째 시나리오에서는 삭제 코딩 된 풀에서 indep 모드가 있고, CRUSH는 실패한 OSD 3을 선택하고, 다시 시도하여 1, 2, 3, 4, 5, 4, 5 으로부터 최종 변환에 대해 6 을 선택하려고 합니다.
중요

지정된 CRUSH 규칙을 여러 풀에 할당할 수 있지만 단일 풀에 여러 CRUSH 규칙이 있을 수 없습니다.

2.7.1. 규칙 나열

명령줄에서 CRUSH 규칙을 나열하려면 다음을 실행합니다.

ceph osd crush rule list
ceph osd crush rule ls

2.7.2. 규칙 덤프

특정 CRUSH 규칙의 내용을 덤프하려면 다음을 실행합니다.

ceph osd crush rule dump {name}

2.7.3. 간단한 규칙 추가

CRUSH 규칙을 추가하려면 사용할 계층 구조의 루트 노드, 복제하려는 버킷 유형(예: 'rack', 'row' 등)을 지정해야 합니다.

ceph osd crush rule create-simple {rulename} {root} {bucket-type} {firstn|indep}

Ceph는 지정한 유형의 리프와 버킷 1개를 선택하여 규칙을 생성합니다.

예:

ceph osd crush rule create-simple deleteme default host firstn

다음 규칙을 생성합니다.

{ "rule_id": 1,
  "rule_name": "deleteme",
  "ruleset": 1,
  "type": 1,
  "min_size": 1,
  "max_size": 10,
  "steps": [
        { "op": "take",
          "item": -1,
          "item_name": "default"},
        { "op": "chooseleaf_firstn",
          "num": 0,
          "type": "host"},
        { "op": "emit"}]}
참고

ruleset 은 RHCS 3 이상 릴리스에서 지원되지 않습니다. Ceph의 RHCS 2 및 이전 릴리스의 이전 버전과의 호환성을 위해서만 제공됩니다.

2.7.4. 복제된 규칙 추가

복제된 풀에 대한 CRUSH 규칙을 생성하려면 다음을 실행합니다.

# ceph osd crush rule create-replicated <name> <root> <failure-domain> <class>

다음과 같습니다.

  • &lt ;name >: 규칙의 이름입니다.
  • < root >: CRUSH 계층의 루트입니다.
  • &lt ;failure-domain >: 실패 도메인. 예: host 또는 rack.
  • < class >: 스토리지 장치 클래스입니다. 예: hdd 또는 ssd. RHCS 3 이상에서만 발생합니다.

예:

# ceph osd crush rule create-replicated fast default host ssd

2.7.5. 제거 코드 규칙 추가

삭제 코딩된 풀과 함께 사용할 CRUSH 규칙을 추가하려면 규칙 이름과 삭제 코드 프로필을 지정할 수 있습니다.

ceph osd crush rule create-erasure {rulename} {profilename}

2.7.6. 규칙 제거

규칙을 제거하려면 다음을 실행하고 CRUSH 규칙 이름을 지정합니다.

ceph osd crush rule rm {name}

2.8. CRUSH 튜닝 가능s

Ceph 프로젝트는 많은 변경 사항 및 많은 새로운 기능을 통해 기하급수적으로 증가했습니다. Ceph, v0.48(Argonaut)의 첫 번째 상용 지원 주요 릴리스부터 Ceph는 CRUSH 알고리즘의 특정 매개변수를 조정하는 기능을 제공합니다. 즉, 설정은 소스 코드에 고정되지 않습니다.

고려해야 할 몇 가지 중요한 사항:

  • CRUSH 값을 조정하면 스토리지 노드 간에 일부 PG가 변경될 수 있습니다. Ceph 클러스터가 이미 많은 데이터를 저장하고 있는 경우 일부 데이터를 이동할 수 있도록 준비합니다.
  • ceph-osdceph-mon 데몬은 업데이트된 맵을 수신하는 즉시 새로운 연결의 기능 비트를 필요로 합니다. 그러나 이미 연결된 클라이언트는 효과적으로 할 수 있으며 새 기능을 지원하지 않는 경우 잘못 설치될 것입니다. Ceph 클라이언트도 업데이트하는 Ceph Storage 클러스터 데몬을 업그레이드해야 합니다.
  • CRUSH 튜닝 가능 항목이 기존 값이 아닌 값으로 설정된 후 나중에 레거시 값으로 다시 변경되는 경우 기능을 지원하기 위해 ceph-osd 데몬이 필요하지 않습니다. 그러나 OSD 피어링 프로세스에서는 이전 맵을 검사하고 이해해야 합니다. 따라서 기존 기본값을 사용하여 최신 버전의 맵이 다시 전환되어도 클러스터에서 이전에 existing CRUSH 값을 사용한 경우 이전 버전의 ceph-osd 데몬을 실행하면 안 됩니다.

2.8.1. CRUSH 튜닝 가능 항목Keys

버전 0.48 이전의 Ceph 클라이언트 및 데몬은 튜닝 가능 항목을 탐지하지 않으며 버전 0.48 이상과 호환되지 않습니다. 튜닝 가능한 CRUSH 값을 조정하는 기능도 주요 Ceph 릴리스와 함께 개선되었습니다.

기존 값

CRUSH Tunables를 사용하여 최신 클러스터에 배포된 레거시 값은 잘못된 것일 수 있습니다. 문제는 다음과 같습니다.

  • 리프 버킷에 장치가 적은 Hierarchies에서 일부 PG는 원하는 복제본 수보다 적은 수에 매핑됩니다. 이는 일반적으로 각 노드 아래에 중첩된 OSD(1-3)의 작은 수가 있는 "호스트" 노드를 사용하는 계층에서 일반적으로 발생합니다.
  • 대규모 클러스터의 경우 PGs의 일부 작은 백분율이 원하는 OSD 수에 매핑됩니다. 이는 계층 구조의 여러 계층이 있는 경우 보다 우선합니다. 예를 들어, row, rack, host, osd입니다.
  • 일부 OSD가 표시된 경우 전체 계층 구조에서 데이터가 가까운 OSD에 재배포되는 경향이 있습니다.
중요

Red Hat은 CRUSH 튜닝 가능 항목을 활용하기 위해 Ceph 클라이언트와 Ceph 데몬을 모두 지원되는 주요 릴리스로 업그레이드하는 것이 좋습니다. 모든 클러스터 데몬 및 클라이언트가 동일한 릴리스 버전을 사용하는 것이 좋습니다.

Argonaut ( legacy)

이는 Ceph의 상업적으로 지원되는 첫 번째 릴리스입니다.

  • 버전 요구 사항:

    • Ceph 0.48, 0.49 이상
    • RBD 커널 클라이언트를 포함한 Linux 커널 3.6 이상
  • 지원되는 CRUSH Tunables:

    • choose_local_tries: 로컬 재시도 횟수입니다. 레거시 값은 2이고 최적 값은 0입니다.
    • choose_local_fallback_tries: legacy 값은 5입니다. 최적 값은 0입니다.
    • choose_total_tries: 항목을 선택하려는 시도의 총 수입니다. 레거시 값은 19이며 후속 테스트는 50의 값이 일반 클러스터에 더 적합한 것을 나타냅니다. 대규모 클러스터의 경우 더 큰 값이 필요할 수 있습니다.

서치 (Bettail)

  • 버전 요구 사항:

    • Ceph 0.55, 0.56.x 이상
    • RBD 커널 클라이언트를 포함한 Linux 커널 3.9 이상
  • 지원되는 CRUSH 튜닝 가능:

    • Selectleaf_descend_once: 재귀적인 선택리프트 시도에서 재시도하거나 한 번만 시도하며 원래 배치를 재시도할 수 있는지 여부입니다. 기존 기본값은 0이며 최적 값은 1입니다.

firefly

이는 Red Hat이 지원하는 첫 번째 Ceph 버전입니다.

  • 버전 요구 사항:

    • Red Hat Ceph Storage 1.2.3 이상
    • RBD 커널 클라이언트를 포함한 Red Hat Enterprise Linux 7.1 이상
  • 지원되는 CRUSH Tunables:

    • chooseleaf_vary_r: 재귀적인 선택리프트 시도에서 상위가 이미 수행 한 시도 횟수에 따라 0이 아닌 r 값으로 시작할지 여부입니다. 레거시 기본값은 0이지만 이 값이 CRUSH인 경우 매핑을 찾을 수 없는 경우가 있습니다. 컴퓨팅 비용 및 정확성 측면에서 최적의 값은 1입니다. 그러나 기존 데이터가 많이 있는 기존 클러스터의 경우 0에서 1로 변경되는 경우 많은 데이터가 이동하게 됩니다. 4 또는 5의 가치가 있으면 CRUSH가 유효한 매핑을 찾을 수 있지만 데이터 이동이 줄어듭니다.
    • straw_calc_version: 정지 버킷을 위해 CRUSH 맵에 계산되어 저장된 내부 가중치에 몇 가지 문제가 발생했습니다. 특히 CRUSH 가중치가 0 또는 둘 다 혼합된 경우 CRUSH가 데이터를 잘못 분산합니다. 즉, 가중치에 비례하지 않습니다. 값이 0이면 이전, 손상된 내부 가중치 계산이 유지됩니다. 1 값은 동작을 수정합니다. straw_calc_version 을 1로 설정한 다음, 항목을 추가, 제거, 다시 가중치를 다시 배치하거나 reweight-all 명령을 사용하여 straw 버킷을 조정하면 클러스터가 문제가 있는 조건 중 하나에 도달하면 중간 정도의 데이터 이동을 트리거할 수 있습니다. 이 튜닝 가능 옵션은 클라이언트 측의 필수 커널 버전에 전혀 영향을 미치지 않기 때문에 특별합니다.

Hammer

hammer 튜닝 가능 프로필은 튜닝 가능 프로필을 변경하여 기존 CRUSH 맵의 매핑에 영향을 미치지 않지만 새 버킷 유형인 straw2 가 지원됩니다.

  • 버전 요구 사항:

    • Red Hat Ceph Storage 1.3 이상
    • RBD 커널 클라이언트를 포함한 Red Hat Enterprise Linux 7.1 이상
  • 새로운 버킷 유형:

    • 새로운 straw2 버킷 유형은 원래 서랍 버킷의 몇 가지 제한 사항을 해결합니다. 특히, 이전 서랍 버킷은 가중치를 조정할 때 변경해야 하는 일부 매핑을 변경하는 반면 straw2 버킷은 가중치가 변경된 버킷 항목에 대한 매핑만 변경하는 원래의 목표를 달성할 수 있습니다. straw2 버킷은 새로 생성된 모든 버킷의 기본값입니다. 버킷 유형을 straw2에서 straw2로 변경하면 버킷 항목 가중치가 서로 다를 수 있습니다. 가중치가 모두 동일하지 않으면 데이터가 이동되지 않으며 항목 가중치가 크게 달라지면 더 많은 이동이 발생합니다.

jewel

Red Hat Ceph Storage 2는 Red Hat Enterprise Linux 7.2 이상에서 지원되지만 Jewel 튜닝 가능 프로필은 Red Hat Enterprise Linux 7.3 이상에서만 지원됩니다. jewel 튜닝 가능 항목은 CRUSH의 전반적인 동작을 향상시켜 OSD가 클러스터에서 부족할 때 매핑 변경 사항을 크게 줄입니다.

  • 버전 요구 사항:

    • Red Hat Ceph Storage 2 이상
    • RBD 커널 클라이언트 및 CephFS 커널 클라이언트를 포함한 Red Hat Enterprise Linux 7.3 이상
  • 지원되는 CRUSH 튜닝 가능:

    • chooseleaf_stable: 재귀적 선택리적 시도에서 내부 루프에 더 나은 값을 사용할지 여부에 따라 OSD가 표시될 때 매핑 변경 횟수를 크게 줄일 수 있습니다. legacy 값은 0이고 새 값 1은 새 접근 방식을 사용합니다. 기존 클러스터에서 이 값을 변경하면 거의 모든 PG 매핑이 변경될 수 있으므로 매우 많은 양의 데이터 이동이 발생합니다.

2.8.2. CRUSH 튜닝

CRUSH를 튜닝하기 전에 모든 Ceph 클라이언트 및 모든 Ceph 데몬이 동일한 버전을 사용하는지 확인해야 합니다. 최근에 업그레이드한 경우 데몬을 다시 시작하고 클라이언트를 다시 연결했는지 확인합니다.

CRUSH 튜닝 가능 항목을 조정하는 가장 간단한 방법은 알려진 프로필로 변경하는 것입니다. 다음은 다음과 같습니다.

  • legacy: v0.47 (이전-Argonaut)의 레거시 동작입니다.
  • Argonaut: v0.48 (Argonaut) 릴리스에서 지원하는 레거시 값입니다.
  • v0.56 (Bobtail) 릴리스에서 지원하는 값입니다.
  • firefly: v0.80 (Firefly) 릴리스에서 지원하는 값입니다.
  • Hammer: v0.94 (Hammer) 릴리스에서 지원하는 값입니다.
  • jewel: v10.0.2 (Jewel) 릴리스에서 지원하는 값입니다.
  • optimal: 현재 최적의 값입니다.
  • 기본값: 새 클러스터의 현재 기본값입니다.

명령을 사용하여 실행 중인 클러스터에서 프로필을 선택할 수 있습니다.

# ceph osd crush tunables <profile>
참고

이로 인해 일부 데이터 이동이 발생할 수 있습니다.

일반적으로 업그레이드 후 CRUSH 튜닝 가능 항목을 설정하거나 경고가 표시되면 설정해야 합니다. 버전 v0.74부터 CRUSH 튜닝 가능 항목이 최적 값으로 설정되지 않으면 Ceph에서 상태 경고를 발행합니다. 최적 값은 v0.73의 기본값입니다. 이 경고가 제거되도록 하려면 다음 두 가지 옵션이 있습니다.

  1. 기존 클러스터에서 튜닝 가능 항목을 조정합니다. 일부 데이터 이동 (약 10% 정도)이 발생할 수 있습니다. 이는 기본 경로이지만 데이터 이동이 성능에 영향을 미칠 수 있는 프로덕션 클러스터에 주의하여 수행해야 합니다. 다음을 사용하여 최적의 튜닝 가능 항목을 활성화할 수 있습니다.

    # ceph osd crush tunables optimal

    상황이 좋지 않은 경우(예: 너무 많은 로드가 이루어지지 않았거나 클라이언트 호환성 문제 (이전 커널 cephfs 또는 rbd 클라이언트 또는 이전 브라우저 클라이언트)가 있는 경우 이전 프로필로 다시 전환할 수 있습니다.

    # ceph osd crush tunables <profile>

    예를 들어, pre-v0.48(Argonaut) 값을 복원하려면 다음을 실행합니다.

    # ceph osd crush tunables legacy
  2. ceph.conf 파일의 [mon] 섹션에 다음 옵션을 추가하여 CRUSH를 변경하지 않고 경고가 사라질 수 있습니다.

    mon warn on legacy crush tunables = false

    변경 사항을 적용하려면 모니터를 다시 시작하거나 다음을 사용하여 모니터를 실행하는 옵션을 적용합니다.

    # ceph tell mon.\* injectargs --no-mon-warn-on-legacy-crush-tunables

2.8.3. CRUSH 튜닝, 하드 방법

모든 클라이언트가 최근 코드를 실행 중인지 확인할 수 있는 경우 CRUSH 맵을 추출하고 값을 수정하고 클러스터에 다시 삽입하여 튜닝 가능 항목을 조정할 수 있습니다.

  • 최신 CRUSH 맵을 추출합니다.

    ceph osd getcrushmap -o /tmp/crush
  • 튜닝 가능 항목을 조정합니다. 이러한 값은 테스트한 대규모 클러스터와 소규모 클러스터에 대해 최상의 동작을 제공하는 것으로 나타납니다. 이 작업이 작동하려면 crushtool--enable-unsafe-tunables 인수를 추가로 지정해야 합니다. 이 옵션을 극단적인 주의해서 사용하십시오.

    crushtool -i /tmp/crush --set-choose-local-tries 0 --set-choose-local-fallback-tries 0 --set-choose-total-tries 50 -o /tmp/crush.new
  • 수정된 맵을 다시 삽입합니다.

    ceph osd setcrushmap -i /tmp/crush.new

2.8.4. 기존 값

참조를 위해 CRUSH 튜닝 가능 항목의 레거시 값은 다음을 사용하여 설정할 수 있습니다.

crushtool -i /tmp/crush --set-choose-local-tries 2 --set-choose-local-fallback-tries 5 --set-choose-total-tries 19 --set-chooseleaf-descend-once 0 --set-chooseleaf-vary-r 0 -o /tmp/crush.legacy

다시 말해, 특수 --enable-unsafe-tunables 옵션이 필요합니다. 또한 위에 언급된 대로 기능 비트가 완벽하게 적용되지 않으므로 레거시 값으로 되돌리면 이전 버전의 ceph-osd 데몬을 주의 깊게 실행하십시오.

2.9. CRUSH 맵 편집

일반적으로 Ceph CLI를 사용하여 런타임에 CRUSH 맵을 수정하는 것은 CRUSH 맵을 수동으로 편집하는 것보다 편리합니다. 그러나 기본 버킷 유형 변경 또는 straw 이외의 버킷 알고리즘을 사용하는 등 편집하도록 선택할 수 있는 경우가 있습니다.

기존 CRUSH 맵을 편집하려면 다음을 수행합니다.

  1. CRUSH 맵을 가져옵니다.
  2. CRUSH 맵을 컴파일 합니다.
  3. 하나 이상의 장치 및 버킷 및 규칙을 편집합니다.
  4. CRUSH 맵을 다시 컴파일합니다. ???
  5. CRUSH 맵을 설정합니다.

특정 풀에 대한 CRUSH 맵 규칙을 활성화하려면 일반적인 규칙 번호를 확인하고 풀을 생성할 때 풀에 해당 규칙 번호를 지정합니다.

2.9.1. CRUSH 맵 가져오기

클러스터의 CRUSH 맵을 가져오려면 다음을 실행합니다.

ceph osd getcrushmap -o {compiled-crushmap-filename}

Ceph는 컴파일된 CRUSH 맵을 사용자가 지정한 파일 이름에 출력(-o)합니다. CRUSH 맵은 컴파일된 형태이므로 편집하기 전에 먼저 컴파일해야 합니다.

2.9.2. CRUSH 맵 삭제

CRUSH 맵을 분리하려면 다음을 실행합니다.

crushtool -d {compiled-crushmap-filename} -o {decompiled-crushmap-filename}

Ceph는 컴파일된 CRUSH 맵과 출력(-o)을 사용자가 지정한 파일 이름으로 분해(-d)합니다.

2.9.3. CRUSH 맵 컴파일

CRUSH 맵을 컴파일하려면 다음을 실행합니다.

crushtool -c {decompiled-crush-map-filename} -o {compiled-crush-map-filename}

Ceph는 컴파일된 CRUSH 맵을 사용자가 지정한 파일 이름에 저장합니다.

2.9.4. CRUSH 맵 설정

클러스터의 CRUSH 맵을 설정하려면 다음을 실행합니다.

ceph osd setcrushmap -i  {compiled-crushmap-filename}

Ceph는 클러스터의 CRUSH 맵으로 지정한 파일 이름의 컴파일된 CRUSH 맵을 입력합니다.

2.10. CRUSH 스토리지 전략 예

대부분의 풀이 OSD가 기본적으로 대규모 하드 드라이브로 지원하려고 하지만 일부 풀이 OSD를 지원하는 SSD(빠른 솔리드 스테이트 드라이브)에 매핑되어 있다고 가정합니다. CRUSH는 이러한 시나리오를 쉽게 처리할 수 있습니다.

RHCS 2 및 Earlier

RHCS 2 및 이전 릴리스에서는 동일한 CRUSH 맵 내에 여러 개의 독립 CRUSH 계층을 사용하여 서로 다른 성능 도메인을 반영할 수 있습니다. 다음과 같이 하드 디스크(예: "root Potter")용 및 SSD용(예: "root ssd")의 경우 두 개의 서로 다른 루트 노드를 사용하여 계층 구조를 정의합니다.

device 0 osd.0
device 1 osd.1
device 2 osd.2
device 3 osd.3
device 4 osd.4
device 5 osd.5
device 6 osd.6
device 7 osd.7

  host ceph-osd-ssd-server-1 {
      id -1
      alg straw
      hash 0
      item osd.0 weight 1.00
      item osd.1 weight 1.00
  }

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

  host ceph-osd-platter-server-1 {
      id -3
      alg straw
      hash 0
      item osd.4 weight 1.00
      item osd.5 weight 1.00
  }

  host ceph-osd-platter-server-2 {
      id -4
      alg straw
      hash 0
      item osd.6 weight 1.00
      item osd.7 weight 1.00
  }

  root platter {
      id -5
      alg straw
      hash 0
      item ceph-osd-platter-server-1 weight 2.00
      item ceph-osd-platter-server-2 weight 2.00
  }

  root ssd {
      id -6
      alg straw
      hash 0
      item ceph-osd-ssd-server-1 weight 2.00
      item ceph-osd-ssd-server-2 weight 2.00
  }

  rule data {
      ruleset 0
      type replicated
      min_size 2
      max_size 2
      step take platter
      step chooseleaf firstn 0 type host
      step emit
  }

  rule metadata {
      ruleset 1
      type replicated
      min_size 0
      max_size 10
      step take platter
      step chooseleaf firstn 0 type host
      step emit
  }

  rule rbd {
      ruleset 2
      type replicated
      min_size 0
      max_size 10
      step take platter
      step chooseleaf firstn 0 type host
      step emit
  }

  rule platter {
      ruleset 3
      type replicated
      min_size 0
      max_size 10
      step take platter
      step chooseleaf firstn 0 type host
      step emit
  }

  rule ssd {
      ruleset 4
      type replicated
      min_size 0
      max_size 4
      step take ssd
      step chooseleaf firstn 0 type host
      step emit
  }

  rule ssd-primary {
      ruleset 5
      type replicated
      min_size 5
      max_size 10
      step take ssd
      step chooseleaf firstn 1 type host
      step emit
      step take platter
      step chooseleaf firstn -1 type host
      step emit
  }

그런 다음 다음을 실행하여 SSD 규칙을 사용하도록 풀을 설정할 수 있습니다.

ceph osd pool set <poolname> crush_ruleset 4
참고
Red Hat은 RHCS 3 이상 릴리스에서 rulesetcrush_ruleset 설정을 지원하지 않습니다.

SSD 풀은 빠른 스토리지 풀 역할을 할 수 있습니다. 마찬가지로 ssd- primary 규칙을 사용하여 풀의 각 배치 그룹을 복제본으로 기본 및 플래터와 함께 배치할 수 있습니다.

RHCS 3 및 later

RHCS 3 이상 릴리스에서는 장치 클래스를 사용합니다. 프로세스가 훨씬 더 간단합니다: 각 장치에 클래스를 추가합니다. 예:

# ceph osd crush set-device-class <class> <osdId> [<osdId>]
# ceph osd crush set-device-class hdd osd.0 osd.1 osd.4 osd.5
# ceph osd crush set-device-class ssd osd.2 osd.3 osd.6 osd.7

그런 다음 장치를 사용할 규칙을 만듭니다.

# ceph osd crush rule create-replicated <rule-name> <root> <failure-domain-type> <device-class>:
# ceph osd crush rule create-replicated cold default host hdd
# ceph osd crush rule create-replicated hot default host ssd

마지막으로 규칙을 사용하도록 풀을 설정합니다.

ceph osd pool set <poolname> crush_rule <rule-name>
ceph osd pool set cold crush_rule hdd
ceph osd pool set hot crush_rule ssd

하나의 계층으로 여러 장치 클래스를 제공할 수 있으므로 CRUSH 맵을 수동으로 편집할 필요가 없습니다. RHCS 2의 예에 비해 CRUSH 맵은 장치 클래스를 사용할 때 RHCS 3에서 훨씬 더 간단합니다.

device 0 osd.0 class hdd
device 1 osd.1 class hdd
device 2 osd.2 class ssd
device 3 osd.3 class ssd
device 4 osd.4 class hdd
device 5 osd.5 class hdd
device 6 osd.6 class ssd
device 7 osd.7 class ssd

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

  host ceph-osd-server-2 {
      id -2
      alg straw
      hash 0
      item osd.4 weight 1.00
      item osd.5 weight 1.00
      item osd.6 weight 1.00
      item osd.7 weight 1.00
  }

  root default {
      id -3
      alg straw
      hash 0
      item ceph-osd-server-1 weight 4.00
      item ceph-osd-server-2 weight 4.00
  }


  rule cold {
      ruleset 0
      type replicated
      min_size 2
      max_size 11
      step take default class hdd
      step chooseleaf firstn 0 type host
      step emit
  }


  rule hot {
      ruleset 1
      type replicated
      min_size 2
      max_size 11
      step take default class ssd
      step chooseleaf firstn 0 type host
      step emit
  }

3장. PG(배치 그룹)

PG(배치 그룹)는 Ceph 클라이언트에 표시되지 않지만 Ceph Storage 클러스터에서 중요한 역할을 합니다.

Ceph Storage 클러스터에는 엑사바이트 수준의 스토리지 용량에 도달하기 위해 수천 개의 OSD가 필요할 수 있습니다. Ceph 클라이언트는 전체 클러스터의 논리적 하위 집합인 풀에 오브젝트를 저장합니다. 풀에 저장된 개체의 수는 수백만 개 이상의 개체에 쉽게 실행될 수 있습니다. 수백만 개의 개체가 있는 시스템은 개체별로 배치를 현실적으로 추적할 수 없으며 여전히 잘 수행할 수 없습니다. Ceph는 오브젝트를 배치 그룹에 할당하고 OSD에 배치 그룹을 할당하여 동적의 효율성을 다시 분산합니다.

 

컴퓨터 과학의 모든 문제는 너무 많은 간접적인 문제를 제외하고는 다른 수준의 간접으로 해결할 수 있습니다.

 
 -- David Wheeler

3.1. 배치 그룹 정보

풀 내에서 오브젝트별로 개체 배치를 추적하는 것은 규모에 따라 계산으로 비용이 많이 듭니다. 대규모의 고성능을 용이하게 하는 Ceph는 풀을 배치 그룹으로 세분화하고, 각 개별 오브젝트를 배치 그룹에 할당하고, 배치 그룹을 기본 OSD에 할당합니다. OSD가 실패하거나 클러스터를 재조정하는 경우 Ceph는 전체 배치 그룹을 이동하거나 복제할 수 있습니다. 즉, 각 오브젝트를 개별적으로 처리할 필요 없이 배치 그룹의 모든 오브젝트를 이동하거나 복제할 수 있습니다. 이를 통해 Ceph 클러스터의 효율적인 재조정 또는 복구가 가능합니다.

PG 정보

CRUSH가 OSD에 배치 그룹을 할당할 때 일련의 OSD를 계산합니다. osd_pool_default_size 설정은 복제된 풀의 경우 1 을 제외한 것으로, pastsure-coded 풀의 코딩 청크 M 수는 데이터를 영구적으로 손실하지 않고 실패할 수 있는 배치 그룹을 저장하는 OSD 수를 결정합니다. 기본 OSD는 CRUSH를 사용하여 보조 OSD를 식별하고 배치 그룹의 콘텐츠를 보조 OSD에 복사합니다. 예를 들어 CRUSH가 배치 그룹에 오브젝트를 할당하고 OSD 5에 주 OSD로 할당되면 CRUSH에서 OSD 1과 OSD 8이 배치 그룹의 보조 OSD인 경우 기본 OSD 5는 OSD 1 및 8에 데이터를 복사합니다. Ceph는 클라이언트를 대신하여 데이터를 복사하여 클라이언트 인터페이스를 단순화하고 클라이언트 워크로드를 줄입니다. 동일한 프로세스를 통해 Ceph 클러스터가 동적으로 복구 및 재조정할 수 있습니다.

CRUSH Hierarchy

기본 OSD가 실패하고 클러스터에서 표시되면 CRUSH에서 배치 그룹을 다른 OSD에 할당하고 배치 그룹에서 오브젝트 사본을 받습니다. Up 세트 의 다른 OSD는 기본 OSD의 역할을 가정합니다.

오브젝트 복제본 또는 코딩 청크 수를 늘리면 CRUSH는 필요에 따라 각 배치 그룹을 추가 OSD에 할당합니다.

참고

PGS는 OSD를 소유하고 있지 않습니다. CRUSH는 각 OSD 의사에 많은 배치 그룹을 할당하여 데이터가 클러스터 전체에 균등하게 분배되도록 합니다.

3.2. 배치 그룹 tradeoffs

모든 OSD의 데이터 지속성 및 데이터 배포는 더 많은 배치 그룹을 호출하지만 CPU 및 메모리 리소스를 절약하기 위해 최대 성능을 위해 필요한 최소 용량으로 줄여야 합니다.

3.2.1. 데이터 내결함성

Ceph는 데이터가 영구적으로 손실되는 것을 방지하기 위해 노력합니다. 그러나 OSD가 실패하면 포함된 데이터가 완전히 복구될 때까지 영구 데이터 손실 위험이 증가합니다. 영구적인 데이터 손실은 드문 경우지만 여전히 가능합니다. 다음 시나리오에서는 데이터 사본이 세 개 있는 단일 배치 그룹에서 Ceph가 데이터를 영구적으로 손실하는 방법을 설명합니다.

  • OSD가 실패하고 포함된 오브젝트의 모든 복사본이 손실됩니다. OSD에 저장된 배치 그룹 내의 모든 개체에 대해 복제본 수가 갑자기 3에서 2로 줄어들게 됩니다.
  • Ceph는 새 OSD를 선택하여 각 배치 그룹에 대해 모든 오브젝트의 세 번째 복사본을 다시 만들어 실패한 OSD에 저장된 각 배치 그룹의 복구를 시작합니다.
  • 새 OSD가 완전히 채워지기 전에 동일한 배치 그룹의 복사본이 포함된 두 번째 OSD가 세 번째 사본으로 완전히 채워집니다. 그런 다음 일부 오브젝트에는 Surviving copy가 하나만 있습니다.
  • Ceph는 다른 OSD를 선택하고 오브젝트를 복사하여 원하는 사본 수를 복원합니다.
  • 복구가 완료되기 전에 동일한 배치 그룹의 사본을 포함하는 세 번째 OSD가 실패합니다. 이 OSD에 오브젝트의 나머지 사본이 포함된 경우 개체가 영구적으로 손실됩니다.

하드웨어 장애는 예외가 아니라 기대치를 기대할 수 있습니다. 위의 시나리오를 방지하기 위해 복구 프로세스는 합리적으로 가능한 한 빨리 회복해야합니다. 클러스터의 크기, 하드웨어 구성 및 배치 그룹 수가 총 복구 시간에 중요한 역할을 합니다.

소규모 클러스터는 빠르게 복구되지 않습니다.

3개의 복제본 풀에 512개의 배치 그룹이 있는 OSD 10개가 포함된 클러스터에서 CRUSH는 각 배치 그룹에 3개의 OSD를 제공합니다. 각 OSD는 호스팅 (512 * 3) / 10 = ~150 배치 그룹이 종료됩니다. 첫 번째 OSD가 실패하면 클러스터는 150개의 배치 그룹에 대해 동시에 복구를 시작합니다.

Ceph에서 나머지 150개의 배치 그룹을 9개의 나머지 OSD에 무작위로 저장할 수 있습니다. 따라서 나머지 OSD는 각 오브젝트 복사본을 다른 모든 OSD에 전송하고, 나머지 OSD는 이제 150개의 배치 그룹 중 일부가 할당되어 있으므로 일부 새 오브젝트도 받을 수 있습니다.

총 복구 시간은 풀을 지원하는 하드웨어에 따라 다릅니다. 예를 들어, 10개의 OSD 클러스터에서 호스트에 1TB SSD가 있는 OSD가 있고 10GB/s 스위치가 각각 10개의 호스트를 연결하는 경우 복구 시간은 M 분이 걸립니다. 대조적으로 호스트에 SATA OSD 2개가 포함되어 있고 1GB/s 스위치가 5개의 호스트를 연결하는 경우 복구 시간이 상당히 길어집니다. 이 크기의 클러스터에서는 배치 그룹의 수가 데이터 지속성에 거의 영향을 미치지 않습니다. 배치 그룹 수는 128 또는 8192일 수 있으며 복구 속도가 느리거나 빠르지 않습니다.

그러나 동일한 Ceph 클러스터를 OSD 10개 대신 20개의 OSD로 확장하면 복구 속도가 빨라지고 데이터 지속성이 크게 향상됩니다. 이유가 무엇입니까? 이제 각 OSD는 150개 대신 75개의 배치 그룹만 참여할 수 있습니다. 20개의 OSD 클러스터에는 여전히 복구할 수 있도록 모든 19개의 나머지 OSD가 동일한 크기의 복사 작업을 수행해야 합니다. 10개의 OSD 클러스터에서 각 OSD를 약 100GB의 복사해야 했습니다. 20 OSD 클러스터에서 각 OSD는 각각 50GB만 복사해야 합니다. 네트워크에 병목 현상이 발생하면 복구 속도가 두 번 발생합니다. 즉, OSD 수가 증가할 때 복구 시간이 줄어듭니다.

대규모 클러스터에서 PG 수는 중요합니다.

예시적인 클러스터가 40개의 OSD로 확장되면 각 OSD는 35개의 배치 그룹만 호스팅합니다. OSD가 종료되면 다른 성능 장애가 개선되지 않는 한 복구 시간이 단축됩니다. 그러나 이 클러스터가 200개의 OSD로 확장되면 각 OSD는 약 7개의 배치 그룹만 호스팅합니다. OSD가 종료되면 이러한 배치 그룹의 21개 (7 * 3) OSD 중 대부분의 OSD에서 복구가 수행됩니다. OSD 40개가 있는 때보다 복구 시간이 오래 걸립니다. 배치 그룹의 수를 늘려야 합니다!

중요

복구 시간이 얼마나 짧은지 상관 없이 복구가 진행되는 동안 배치 그룹을 저장하는 다른 OSD가 실패할 가능성이 있습니다.

위에 설명된 10개의 OSD 클러스터에서 OSD가 실패할 경우 약 8개의 배치 그룹(즉, 75 pgs / 9 osds 가 복구됨)은 하나의 남아 있는 사본만 갖습니다. 나머지 8개 OSD 중 하나라도 실패하면 하나의 배치 그룹의 마지막 오브젝트가 손실될 수 있습니다(즉, 남아 있는 복사본이 1개뿐인 8 pgs/8ds ). 따라서 다소 더 큰 클러스터(예: 50개의 OSD)로 시작하는 것이 좋습니다.

클러스터 크기가 20개의 OSD로 증가하면 3개의 OSD가 손실되어 손상된 배치 그룹의 수가 손상됩니다. 두 번째 OSD는 약 2 (즉, 35 pgs / 19 osds 복구) 8 대신 3 개의 OSD가 손실되고 세 번째 OSD가 손실 된 두 개의 OSD가 복사본을 포함하는 두 개의 OSD 중 하나 인 경우에만 데이터가 손실됩니다. 즉, 복구 시간 프레임 중에 하나의 OSD를 손실할 확률이 0.0001% 인 경우 클러스터에서 OSD 10 개의 OSD가 20개인 0.0001%로 클러스터의 8 * 0.0001% 로 이동합니다. Ceph 또는 4096 배치 그룹을 갖는 것은 데이터 지속성과 관련하여 50개 미만의 OSD가 있는 클러스터에서 거의 동일합니다.

작은 정보

간단히 말해, 더 많은 OSD가 더 빠르게 복구되고 배치 그룹 및 해당 오브젝트의 영구 손실이 발생할 수 있는 캐스케이드 오류가 발생할 위험이 줄어 듭니다.

클러스터에 OSD를 추가하면 배치 그룹 및 오브젝트로 새 OSD를 채우는 데 시간이 오래 걸릴 수 있습니다. 그러나 개체의 저하는 없으며 OSD를 추가하면 데이터 지속성에 영향을 미치지 않습니다.

3.2.2. 데이터 배포

Ceph는 핫스팟을 피하려고 합니다. 즉, 일부 OSD는 다른 OSD보다 훨씬 더 많은 트래픽을 수신합니다. CRUSH는 배치 그룹에 오브젝트를 균등하게 할당하므로 배치 그룹을 OSD(ps random)에 할당할 때 기본 OSD 저장소 오브젝트를 클러스터에 균등하게 분산하고 핫 스팟 및 네트워크 초과 구독 문제는 데이터 배포로 인해 개발되지 않습니다.

CRUSH는 각 오브젝트의 배치 그룹을 계산하지만 실제로 이 배치 그룹 내의 각 OSD에 저장된 데이터 양을 알 수 없기 때문에 배치 그룹의 수와 OSD 수 사이의 비율은 데이터 배포에 상당한 영향을 미칠 수 있습니다.

예를 들어 3개의 복제본 풀에서 10개의 OSD가 있는 배치 그룹이 하나뿐인 경우 CRUSH에는 다른 선택 사항이 없기 때문에 Ceph는 3개의 OSD만 사용하여 데이터를 저장합니다. 더 많은 배치 그룹을 사용할 수 있는 경우 CRUSH는 OSD에 오브젝트를 균등하게 분산할 수 있습니다. CRUSH는 OSD에 배치 그룹을 균등하게 할당합니다.

OSD보다 넓게 많은 배치 그룹이 하나 또는 두 개의 순서가 있는 경우 배포도 가능해야 합니다. 예를 들어 OSD 3개, OSD 10용 512개 또는 1024개의 배치 그룹 등 여러 개의 배치 그룹이 있습니다.

OSD와 배치 그룹 간의 비율은 일반적으로 오브젝트 스트라이핑과 같은 고급 기능을 구현하는 Ceph 클라이언트의 중요하지 않은 데이터 배포 문제를 해결합니다. 예를 들어 4TB 블록 장치는 4MB의 오브젝트로 분할될 수 있습니다.

CRUSH는 개체 크기를 고려하지 않기 때문에 OSD와 배치 그룹 간의 비율은 다른 경우에는 중요하지 않은 데이터 배포를 처리하지 않습니다. librados 인터페이스를 사용하여 일부 비교적 작은 오브젝트를 저장하고 매우 큰 오브젝트 중 일부는 중요하지 않은 데이터 배포를 초래할 수 있습니다. 예를 들어 총 4GB의 4K 오브젝트는 10개의 OSD에서 1000개의 배치 그룹에 균등하게 분배됩니다. 각 OSD에서 4GB/ 10 = 400MB 를 사용합니다. 400MB 개체가 풀에 추가되는 경우 개체가 배치된 배치 그룹을 지원하는 3개의 OSD는 400MB + 400MB = 800MB 로 채워지며 나머지 7개는 400MB로만 사용됩니다.

3.2.3. 리소스 사용량

각 배치 그룹인 OSD 및 Ceph 모니터에는 항상 메모리, 네트워크 및 CPU가 필요하며 복구 중에도 더 많은 CPU가 필요합니다. 배치 그룹 내에서 오브젝트를 클러스터링하여 이 오버헤드를 공유하는 것은 배치 그룹의 주요 이유 중 하나입니다.

배치 그룹 수를 최소화하면 상당한 양의 리소스가 절약됩니다.

3.3. PG Count

풀의 배치 그룹 수는 클러스터 피어가 데이터를 분산하고 재조정하는 방법에 중요한 역할을 합니다. 소규모 클러스터는 배치 그룹 수를 늘려 대규모 클러스터에 비해 많은 성능 향상을 볼 수 없습니다. 그러나 동일한 OSD에 액세스하는 많은 풀이 있는 클러스터는 Ceph OSD가 리소스를 효율적으로 사용하도록 PG 수를 신중하게 고려해야 할 수 있습니다.

작은 정보

Red Hat은 OSD당 100개에서 200개의 PG를 권장합니다.

3.3.1. PG 계산기

PG 계산기는 사용자를 위해 배치 그룹 수를 계산하고 특정 사용 사례를 해결합니다. PG 계산기는 일반적으로 동일한 규칙(CRUSH 계층 구조)을 사용하는 많은 풀이 있는 Ceph 오브젝트 게이트웨이와 같은 Ceph 클라이언트를 사용할 때 유용합니다. 소규모 클러스터의 PG 수 및 PG 수 계산에 있는 지침을 사용하여 PG 를 수동으로 계산할 수 있습니다. 그러나 PG 계산기는 PG를 계산하는 데 선호되는 방법입니다.

자세한 내용은 Red Hat Customer Portal 의 풀당 Ceph PG(배치 그룹) 를 참조하십시오.

3.3.2. 기본 PG 수 구성

풀을 생성할 때 풀에 대해 여러 배치 그룹도 생성합니다. 배치 그룹 수를 지정하지 않으면 Ceph는 일부 풀에 대해 낮은 기본값 32 를 사용합니다. 풀의 배치 그룹 수를 늘릴 수 있지만, Ceph 구성 파일에서도 적절한 기본값을 설정하는 것이 좋습니다.

참고

경고 POOL_PG_NUM_NOT_POWER_OF_TWO 메시지의 상태를 방지하려면 배치 그룹의 전원 2개를 사용합니다.

osd pool default pg num = 1024
osd pool default pgp num = 1024

배치 그룹(total) 수와 오브젝트에 사용되는 배치 그룹 수( PG 분할에서 사용됨)를 모두 설정해야 합니다. 이 값은 동일해야 합니다.

3.3.3. 소규모 클러스터용 PG Count

소규모 클러스터는 많은 수의 배치 그룹의 이점을 얻을 수 없습니다. OSD 수가 증가함에 따라 pg_numpgp_num 에 대한 올바른 값을 선택하는 것이 더 중요해졌습니다. 클러스터의 동작에 상당한 영향을 미치고 문제가 발생할 때 데이터의 내구성이 향상되기 때문입니다(즉, 심각한 이벤트가 데이터 손실로 이어질 가능성이 큽니다). 소규모 클러스터에서 PG 계산기 를 사용하는 것이 중요합니다.

3.3.4. PG 수 계산

OSD 50개가 넘는 OSD가 있는 경우 OSD당 약 50~100개의 배치 그룹을 사용하여 리소스 사용량, 데이터 지속성 및 배포를 분산하는 것이 좋습니다. OSD가 50개 미만인 경우 작은 클러스터용 PG 개수 중에서 선택하는 것이 좋습니다. 단일 개체 풀의 경우 다음 수식을 사용하여 기준선을 가져올 수 있습니다.For a single pool of objects, you can use the following formula to get a baseline:

                (OSDs * 100)
   Total PGs =  ------------
                 pool size

여기서 풀 크기는 복제된 풀의 복제본 수 또는 삭제 코딩된 풀에 대한 K+M 합계입니다( ceph osd erasure-code-profile에서 반환됨).

그런 다음 Ceph 클러스터를 설계하여 데이터 지속성, 데이터 배포 및 리소스 사용량을 최소화하는 방법에 적합한지 확인해야 합니다.

결과는 두 개의 가장 가까운 전력으로 반올림됩니다. 반올림은 선택 사항이지만 CRUSH에서 배치 그룹 간 오브젝트 수의 균형을 조정하는 것이 좋습니다.

200개의 OSD 및 풀 크기가 3개의 복제본이 있는 클러스터의 경우 다음과 같이 PG 수를 추정합니다.

   (200 * 100)
   ----------- = 6667. Nearest power of 2: 8192
        3

OSD당 약 41개의 배치 그룹으로 평가되는 200개의 OSD에 분산된 8192 배치 그룹이 있습니다. 또한 각 풀이 배치 그룹을 생성하기 때문에 클러스터에서 사용할 수 있는 풀 수도 고려해야 합니다. 합리적인 최대 PG 수가 있는지 확인하십시오.

3.3.5. 최대 PG 수

여러 데이터 풀을 사용하여 오브젝트를 저장하는 경우, 적절한 총 배치 그룹에 도달하도록 풀당 배치 그룹 수와 OSD당 배치 그룹 수의 균형을 조정해야 합니다. 목표는 시스템 리소스에 대한 비용 절감 또는 피어링 프로세스가 너무 느리지 않고 OSD당 상당히 낮은 분산을 달성하는 것입니다.

10개 풀로 구성된 예시적인 Ceph Storage 클러스터에서는 10개의 OSD에 512개의 배치 그룹이 있는 각 풀에는 총 5개의 OSD가 있으며 OSD당 512개 이상의 배치 그룹이 분배됩니다. 하드웨어 구성에 따라 너무 많은 리소스를 사용하지 않을 수 있습니다. 반면, 각각 512개의 배치 그룹이 있는 1,000개의 풀을 생성하면 OSD에서 각각 ~50,000개의 배치 그룹을 처리하고 더 많은 리소스가 필요합니다. OSD당 너무 많은 배치 그룹으로 작업하면 특히 재조정 또는 복구 중에 성능이 크게 저하될 수 있습니다.

Ceph Storage 클러스터에는 OSD당 최대 300개의 배치 그룹이 있습니다. Ceph 구성 파일에서 다른 최대값을 설정할 수 있습니다.

mon_max_pg_per_osd
작은 정보

Ceph 개체 게이트웨이는 풀 10-15개로 배포되므로 OSD당 100개 미만의 PG를 사용하여 합리적인 최대 수에 도달하는 것을 고려할 수 있습니다.

3.4. 자동 확장 배치 그룹

풀의 배치 그룹(PG) 수는 클러스터 피어가 데이터를 분산하고, 균형을 조정하는 방법에 중요한 역할을 합니다.

PG 수를 자동 확장하여 클러스터를 더 쉽게 관리할 수 있습니다. pg-autoscaling 명령은 PG 확장에 대한 권장 사항을 제공하거나 클러스터 사용 방법에 따라 PG를 자동으로 스케일링합니다.

3.4.1. 배치 그룹 자동 확장

자동 스케일링러 작동 방식

auto-scaler는 풀을 분석하고 각 하위 트리별로 조정합니다. 각 풀은 다른 CRUSH 규칙에 매핑될 수 있으며 각 규칙은 서로 다른 장치에 데이터를 배포할 수 있으므로 Ceph는 계층 구조의 각 하위 트리를 독립적으로 활용합니다. 예를 들어, ssd 의 OSD에 매핑되는 풀과 hdd 의 OSD에 매핑되는 풀은 각 장치 유형의 수에 따라 최적의 PG 수를 갖습니다.

3.4.2. 배치 그룹 분할 및 병합

분할

Red Hat Ceph Storage는 기존 PG(배치 그룹)를 작은 PG로 분할할 수 있으므로 지정된 풀의 PG 수가 증가합니다. PG(기존 배치 그룹)를 분할하면 스토리지 요구 사항이 증가함에 따라 소규모 Red Hat Ceph Storage 클러스터를 시간이 지남에 따라 확장할 수 있습니다. PG 자동 확장 기능은 pg_num 값을 늘릴 수 있으며, 이로 인해 스토리지 클러스터가 확장됨에 따라 기존 PG가 분할됩니다. PG 자동 확장 기능이 비활성화된 경우 pg_num 값을 수동으로 증가시켜 PG 분할 프로세스를 트리거하여 시작할 수 있습니다. 예를 들어 pg_num 값을 4 에서 16 으로 늘리면 4개의 조각으로 나뉩니다. pg_num 값을 늘리면 pgp_num 값도 증가하지만 pgp_num 값은 점진적으로 증가합니다. 오브젝트 데이터를 마이그레이션하면 시스템에 상당한 부하가 추가되기 때문에 스토리지 클러스터의 성능과 클라이언트 워크로드에 미치는 영향을 최소화하기 위해 계속 증가할 수 있습니다. 기본적으로 Ceph 큐는 "misplaced" 상태인 오브젝트 데이터의 5%를 넘지 않습니다. 이 기본 백분율은 target_max_misplaced_ratio 옵션을 사용하여 조정할 수 있습니다.

149 Ceph 자동 호출 0321 분할

병합

Red Hat Ceph Storage는 두 개의 기존 PG를 더 큰 PG에 병합하여 총 PG 수를 줄일 수 있습니다. 두 개의 PG를 함께 병합하면 특히 풀의 상대적 크기가 시간이 지남에 따라 감소하거나 선택한 PG의 초기 수가 너무 크면 유용할 수 있습니다. PG를 병합하는 것은 유용할 수 있지만 복잡하고 섬세한 프로세스이기도 합니다. 병합을 수행하면 PG에 I/O를 일시 중지하면 스토리지 클러스터 성능에 미치는 영향을 최소화하기 위해 한 번에 하나의 PG만 병합됩니다. Ceph는 새 pg_num 값에 도달할 때까지 오브젝트 데이터를 병합하는 데 느리게 작동합니다.

149 Ceph 자동 호출 0321 병합

3.4.3. 배치 그룹 자동 확장 모드 설정

Red Hat Ceph Storage 클러스터의 각 풀에는 PGs의 pg_autoscale_mode 속성이 있으며, 이는 ,on 또는 warn 입니다.

  • off: 풀에 대한 자동 확장을 비활성화합니다. 관리자는 각 풀에 적절한 PG 번호를 선택할 수 있습니다. 자세한 내용은 PG 수 섹션을 참조하십시오.
  • On: 지정된 풀에 PG 수를 자동으로 조정할 수 있습니다.
  • warn: PG 수를 조정해야 할 때 상태 경고를 진단합니다.

pg_autoscale_mode 의 기본값은 warn 모드입니다.

절차

  1. pg_autoscaling_mode 설정 :

    1. 기존 풀의 경우:

      ceph osd pool set pool-name pg_autoscale_mode mode

      예를 들어 testpool 에서 자동 스케일링을 활성화하려면 다음을 수행합니다.

      $ ceph osd pool set testpool pg_autoscale_mode on
    2. 새로 생성된 풀의 경우 기본적으로 다음과 같습니다.

      # ceph config set global osd_pool_default_pg_autoscale_mode <mode>

3.4.4. 배치 그룹 자동 확장 권장 사항 보기

절차

  1. 각 풀, 상대 사용률 및 다음을 사용하여 PG 수에 대한 제안된 변경 사항을 볼 수 있습니다.

    ceph osd pool autoscale-status

    출력은 다음과 유사합니다.

    POOL                        SIZE TARGET SIZE RATE RAW CAPACITY  RATIO TARGET RATIO EFFECTIVE RATIO BIAS PG_NUM NEW PG_NUM AUTOSCALE
    cephfs_data                  65               3.0       449.9G 0.0000                               1.0     32            warn
    cephfs_metadata           78724               3.0       449.9G 0.0000                               1.0      8            warn
    .rgw.root                  3062               3.0       449.9G 0.0000                               1.0     32            warn
    default.rgw.control           0               3.0       449.9G 0.0000                               1.0     32            warn
    default.rgw.meta           1304               3.0       449.9G 0.0000                               1.0     32            warn
    default.rgw.log            6761               3.0       449.9G 0.0000                               1.0     32            warn
    default.rgw.buckets.index     0               3.0       449.9G 0.0000                               1.0     32            warn
    default.rgw.buckets.data   4910               3.0       449.9G 0.0000                               1.0     32            warn
    ocs-ext                   119.2M              3.0       449.9G 0.0008                               1.0     32            warn

SIZE 는 풀에 저장된 데이터의 양입니다. TARGET SIZE 는 관리자가 지정한 데이터의 양이며, 결국 이 풀에 저장됩니다. 시스템은 계산에 두 값 중 더 큰 값을 사용합니다.

RATE 는 풀에서 사용하는 원시 스토리지 용량의 양을 결정하는 풀의 곱값입니다. 예를 들어 3 개의 복제본 풀에는 3.0 의 비율이 있으며 k=4,m=2 pastsure coded 풀에는 1.5 의 비율이 있습니다.

RAW CAPACITY 는 풀 데이터를 저장하는 OSD의 총 원시 스토리지 용량입니다. RATIO 는 풀이 소비하는 총 용량의 비율, 즉 비율 = 크기 * 비율 / 원시 용량입니다.

TARGET RATIO 는 관리자가 지정한 스토리지의 비율이므로 대상 비율이 설정된 다른 풀과 관련하여 소비할 것으로 예상됩니다. 대상 크기 바이트와 비율을 모두 지정하면 비율이 우선합니다.

EFFECTIVE RATIO 는 두 가지 방식으로 조정한 후 대상 비율입니다. 1. 대상 크기 세트가 있는 풀에서 사용할 것으로 예상되는 용량을 뺀 것입니다. 2. 대상 비율이 설정된 풀 간 대상 비율을 정규화하여 나머지 공간을 전체적으로 대상으로 지정합니다. 예를 들어 대상 비율 1.0을 사용하는 4개 풀은 0.25의 유효 비율 을 갖습니다. 이 시스템은 실제 비율보다 크고 계산을 위해 유효한 비율을 사용합니다.

BIAS 는 PG 자동 스케일러가 PG 수의 수에 따라 일부 풀을 다른 풀보다 더 빠르게 스케일링하는 데 사용하는 풀 속성입니다. 기본적으로 기본 PG 수보다 풀에 더 많은 PG를 제공하는 데 사용되는 멀티플라이어입니다. 이 속성은 크기가 작을 수 있지만 크기가 많지만 많은 오브젝트가 있으므로 성능 향상을 위해 더 빠르게 스케일링하는 것이 중요합니다. BIAS의 기본값은 1.0입니다. ceph osd pool set pool-name pg_autoscale_bias 4 명령을 실행하여 이 값을 설정할 수 있습니다. 허용되는 값은 0에서 1000 사이입니다. 그러나 CephFS 메타데이터 풀 및 Ceph Object Gateway 인덱스 풀에 대해 기본적으로 BIAS의 값을 4.0으로 설정하는 것이 좋습니다.

PG_NUM 은 풀에 대한 현재 PG 수 또는 pg_num 변경이 진행 중인 경우 풀의 현재 PG 수입니다. NEW PG_NUM (있는 경우)은 제안된 PG(pg_num)입니다. 항상 2의 힘이며 제안된 값은 항상 현재 값과 3배 이상 다릅니다.

NovaCronSCALEpg_autoscale_mode 풀이며, ,off 또는 warn 입니다.

3.4.5. 배치 그룹 자동 확장 설정

클러스터에서 클러스터 사용량을 기반으로 PG를 자동으로 확장할 수 있도록 허용하는 것이 PG를 스케일링하는 가장 간단한 방법입니다. Red Hat Ceph Storage는 전체 시스템에 사용 가능한 총 스토리지 및 PG의 대상 수를 가져와서 각 풀에 저장된 데이터의 양을 비교하고 PG를 적절하게 조정합니다. 이 명령은 현재 PG(pg_num)가 계산되거나 제안된 PG 번호에서 세 번 이상 꺼져 있는 풀만 변경합니다.

OSD당 PG의 대상 수는 mon_target_pg_per_osd 구성 가능한 를 기반으로 합니다. 기본값은 100 으로 설정됩니다.

절차

  1. To adjust mon_target_pg_per_osd:

    ceph config set global mon_target_pg_per_osd number

    예:

    $ ceph config set global mon_target_pg_per_osd 150

3.4.6. 대상 풀 크기 지정

새로 생성된 풀은 전체 클러스터 용량의 작은 부분을 소비하며 적은 수의 PG가 필요한 시스템에 나타납니다. 그러나 대부분의 경우 클러스터 관리자는 시간이 지남에 따라 대부분의 시스템 용량을 사용할 것으로 예상되는 풀을 인식합니다. 이 정보를 Red Hat Ceph Storage에 대상 크기 라고 하는 경우 이러한 풀은 처음부터 더 적절한 PG(pg_num)를 사용할 수 있습니다. 이 접근 방식은 pg_num 의 후속 변경 및 이러한 조정을 할 때 데이터 이동과 관련된 오버헤드를 방지합니다.

다음과 같은 방법으로 풀의 대상 크기를 지정할 수 있습니다.

3.4.6.1. 풀의 절대 크기를 사용하여 대상 크기 지정

절차

  1. 풀의 절대 크기를 바이트 단위로 사용하여 대상 크기를 설정합니다.

    ceph osd pool set pool-name target_size_bytes value

    예를 들어 mypool 에 100T 공간을 사용할 것으로 예상되는 시스템에 지시하려면 다음을 수행합니다.

    $ ceph osd pool set mypool target_size_bytes 100T

선택적 --target-size-bytes <bytes > 인수를 ceph osd pool create 명령에 추가하여 생성 시 풀의 대상 크기를 설정할 수도 있습니다.

3.4.6.2. 총 클러스터 용량을 사용하여 대상 크기 지정

절차

  1. 전체 클러스터 용량의 비율을 사용하여 대상 크기를 설정합니다.

    ceph osd pool set pool-name target_size_ratio ratio

    예를 들면 다음과 같습니다.

    $ ceph osd pool set mypool target_size_ratio 1.0

    mypool 풀에 target_size_ratio 가 설정된 다른 풀과 관련하여 1.0을 사용할 것으로 예상되는 시스템에 지시합니다. mypool 이 클러스터의 유일한 풀인 경우 총 용량의 100%를 사용할 것으로 예상됩니다. target_size_ratio 를 1.0으로 사용하는 두 번째 풀이 있는 경우 두 풀 모두 클러스터 용량의 50%를 사용할 것으로 예상됩니다.

선택적 --target-size-ratio <ratio > 인수를 ceph osd pool create 명령에 추가하여 생성 시 풀의 대상 크기를 설정할 수도 있습니다.

참고

예를 들어 총 클러스터보다 큰 용량 또는 합계가 1.0보다 큰 대상 크기 값을 지정하는 경우 클러스터는 POOL_TARGET_ RATIO_OVERCOMMITTED 또는 POOL_TARGET_SIZE_ BYTES _BYTES_BYTES_OVERCOMMITTED 상태 경고를 발생시킵니다.

풀에 target_size_ratiotarget_size_bytes 를 모두 지정하면 클러스터에서 비율만 고려한 후 POOL_HAS_TARGET_SIZE_BYTES_AND_RATIO 상태 경고를 생성합니다.

3.5. PG 명령줄 참조

ceph CLI를 사용하면 풀에 대한 배치 그룹 수를 설정하고 가져올 수 있으며 PG 맵을 보고 PG 통계를 검색할 수 있습니다.

3.5.1. PG 수 설정

풀에서 배치 그룹 수를 설정하려면 풀을 만들 때 배치 그룹 수를 지정해야 합니다. 자세한 내용은 풀 만들기를 참조하십시오. 풀을 생성한 후 배치 그룹 수를 변경하려면 다음을 실행합니다.

ceph osd pool set {pool-name} pg_num {pg_num}

배치 그룹 수를 늘리면 클러스터가 재조정하기 전에 배치(pgp_num)에 대해 배치 그룹 수를 늘려야 합니다. pgp_numpg_num 과 같아야 합니다. pgp_num 은 CRUSH 알고리즘에 의한 배치 그룹에 의해 고려될 배치 그룹의 수입니다. pg_num 이 증가하면 배치 그룹을 분할하지만, 배치 그룹(즉, pgp_num )이 증가할 때까지 데이터가 최신 배치 그룹으로 마이그레이션되지 않습니다. 배치를 위한 배치 그룹 수를 늘리려면 다음을 실행합니다.

ceph osd pool set {pool-name} pgp_num {pgp_num}

PG 수를 줄이면 pgp_num 이 자동으로 조정됩니다.

3.5.2. PG 수를 가져옵니다.

풀의 배치 그룹 수를 가져오려면 다음을 실행합니다.

ceph osd pool get {pool-name} pg_num

3.5.3. 클러스터 PG 통계 가져오기

클러스터에서 배치 그룹에 대한 통계를 가져오려면 다음을 실행합니다.

ceph pg dump [--format {format}]

유효한 형식은 plain (기본값) 및 json 입니다.

3.5.4. Stuck PG에 대한 통계 가져오기

지정된 상태에 있는 모든 배치 그룹에 대한 통계를 가져오려면 다음을 실행합니다.

ceph pg dump_stuck {inactive|unclean|stale|undersized|degraded [inactive|unclean|stale|undersized|degraded...]} {<int>}

비활성 배치 그룹은 최신 데이터가 제공될 OSD를 기다리고 있으므로 읽기 또는 쓰기 작업을 처리할 수 없습니다.

불명확 한 배치 그룹에는 원하는 횟수를 복제하지 않는 오브젝트가 포함되어 있습니다. 그들은 회복되어야 합니다.

오래된 배치 그룹은 알 수 없는 상태임 - 호스트를 호스팅하는 OSD가 잠시 동안 모니터 클러스터에 보고되지 않았습니다( mon_osd_report_timeout로 구성됨).

유효한 형식은 plain (기본값) 및 json 입니다. 임계값은 배치 그룹이 반환된 통계(기본값 300초)에 포함되기 전에 고정되는 최소 시간(초)을 정의합니다.

3.5.5. PG 맵 가져오기

특정 배치 그룹에 대한 배치 그룹 맵을 가져오려면 다음을 실행합니다.

ceph pg map {pg-id}

예:

ceph pg map 1.6c

Ceph는 배치 그룹 맵, 배치 그룹 및 OSD 상태를 반환합니다.

osdmap e13 pg 1.6c (1.6c) -> up [1,0] acting [1,0]

3.5.6. PGs 통계 가져 오기

특정 배치 그룹의 통계를 검색하려면 다음을 실행합니다.

ceph pg {pg-id} query

3.5.7. 배치 그룹 제거

배치 그룹을 스크럽하려면 다음을 실행합니다.

ceph pg scrub {pg-id}

Ceph는 기본 및 모든 복제본 노드를 확인하고, 배치 그룹에 있는 모든 오브젝트 카탈로그를 생성하고 이를 비교하여 오브젝트가 없거나 일치하지 않는지 확인하고, 해당 내용은 일관성을 유지합니다. 복제본이 모두 일치한다고 가정하면 최종 의미 체계 sweep은 모든 스냅샷 관련 개체 메타데이터가 일관되게 유지됩니다. 오류는 로그를 통해 보고됩니다.

3.5.8. Revert Lost

클러스터가 하나 이상의 오브젝트를 손실하고 손실된 데이터를 검색하기로 결정한 경우, unfound 오브젝트를 손실된 것으로 표시해야합니다.

사용 가능한 모든 위치가 쿼리되고 오브젝트가 손실된 경우 손실된 오브젝트를 포기해야 할 수 있습니다. 이를 통해 클러스터가 쓰기 자체를 복구하기 전에 수행된 쓰기를 확인할 수 있는 실패의 비정상적인 조합이 있을 수 있습니다.

현재 지원되는 유일한 옵션은 "revert"이며, 이는 이전 버전의 오브젝트로 롤백되거나 (새 오브젝트인 경우) 완전히 잊어 버립니다. "unfound" 오브젝트를 "lost"로 표시하려면 다음을 실행합니다.

ceph pg {pg-id} mark_unfound_lost revert|delete
중요

이 기능은 오브젝트를 예상하는 애플리케이션을 혼동할 수 있으므로 주의해야 합니다.

4장. 풀

Ceph 클라이언트는 풀에 데이터를 저장합니다. 풀을 생성할 때 클라이언트가 데이터를 저장할 I/O 인터페이스를 생성합니다. Ceph 클라이언트(즉, 블록 장치, 게이트웨이 및 나머지)의 관점에서 Ceph 스토리지 클러스터와 상호 작용은 매우 간단합니다. 클러스터 핸들을 생성하고 클러스터에 연결한 다음, 오브젝트와 해당 확장 속성을 읽고 작성할 I/O 컨텍스트를 생성합니다.

Cluster Handle 및 Connect to the Cluster를 생성

Ceph 스토리지 클러스터에 연결하려면 Ceph 클라이언트에 클러스터 이름(일반적으로 ceph ) 및 초기 모니터 주소가 필요합니다. Ceph 클라이언트는 일반적으로 Ceph 구성 파일의 기본 경로를 사용하여 이러한 매개 변수를 검색한 다음 파일에서 읽을 수 있지만 사용자는 명령줄에 매개 변수를 지정할 수도 있습니다. 또한 Ceph 클라이언트는 사용자 이름 및 시크릿 키(인증은 기본적으로 설정되어 있음) 제공합니다. 그런 다음 클라이언트는 Ceph 모니터에 연결하여 모니터, OSD 및 풀을 포함하여 클러스터 맵의 최근 사본을 검색합니다.

Handle 만들기

풀 I/O 컨텍스트 생성

Ceph 클라이언트는 데이터를 읽고 쓰기 위해 Ceph 스토리지 클러스터의 특정 풀에 i/o 컨텍스트를 생성합니다. 지정된 사용자에게 풀에 대한 권한이 있는 경우 Ceph 클라이언트는 지정된 풀에서 읽고 쓸 수 있습니다.

I/O 컨텍스트

Ceph의 아키텍처를 사용하면 스토리지 클러스터에서 Ceph 클라이언트에 이러한 간단한 인터페이스를 제공할 수 있으므로 클라이언트는 풀 이름을 지정하고 I/O 컨텍스트를 만들어 간단하게 정의한 정교한 스토리지 전략 중 하나를 선택할 수 있습니다. 스토리지 전략은 Ceph 클라이언트에 있지만 용량 및 성능이 표시되지 않습니다. 마찬가지로 Ceph 클라이언트의 복잡성을 블록 장치 표현으로 매핑하여 S3/Swift RESTful 서비스를 제공하는 것은 Ceph 스토리지 클러스터에 표시되지 않습니다.

풀은 다음을 제공합니다.

  • 복원력: 데이터 손실 없이 실패할 수 있는 OSD 수를 설정할 수 있습니다. 복제된 풀의 경우 원하는 오브젝트의 사본/복제본 수입니다. 일반적인 구성에서는 오브젝트와 하나의 추가 복사본(즉, size = 2)을 저장하지만 사본/복제본 수를 결정할 수 있습니다. 복원된 풀의 경우 코드화된 풀의 수(즉, 삭제 코드 프로파일 삭제m=2 )의 코딩 청크 수입니다.
  • 배치 그룹: 풀에 대한 배치 그룹 수를 설정할 수 있습니다. 일반적인 구성에서는 OSD당 약 50~100개의 배치 그룹을 사용하여 너무 많은 컴퓨팅 리소스를 사용하지 않고 최적의 균형을 유지합니다. 여러 풀을 설정할 때 풀과 클러스터 전체에 적절한 수의 배치 그룹을 설정해야 합니다.
  • CRUSH 규칙: 풀에 매핑된 CRUSH 규칙을 풀에 저장하면 CRUSH가 각 오브젝트의 배치와 해당 복제본(또는 삭제 코딩된 풀의 청크)에 대한 규칙을 확인할 수 있습니다. 풀에 대한 사용자 지정 CRUSH 규칙을 생성할 수 있습니다.
  • 스냅샷: ceph osd 풀 mksnap을 사용하여 스냅샷을 만들 때 특정 풀 의 스냅샷을 효과적으로 수행할 수 있습니다.
  • 할당량: ceph osd pool set-quota 를 사용하여 풀에서 할당량을 설정하면 지정된 풀에 저장된 최대 오브젝트 수 또는 최대 바이트 수를 제한할 수 있습니다.

4.1. 풀 및 스토리지 전략

풀을 관리하려면 풀을 나열, 생성 및 제거할 수 있습니다. 각 풀의 사용률 통계를 볼 수도 있습니다.

4.2. 풀 목록

클러스터 풀을 나열하려면 다음을 실행합니다.

ceph osd lspools

4.3. 풀 생성

풀을 생성하기 전에 Red Hat Ceph Storage 4 구성 가이드의 풀, PG 및 CRUSH 구성 참조 장을 참조하십시오.

참고

Red Hat Ceph Storage 3 이상 릴리스에서 시스템 관리자는 Ceph 클라이언트에서 I/O 작업을 수신하도록 풀을 명시적으로 활성화해야 합니다. 자세한 내용은 애플리케이션 사용을 참조하십시오. 풀을 활성화하지 않으면 HEALTH_WARN 상태가 됩니다.

기본값이 필요에 맞게 필요하지 않으므로 Ceph 구성 파일에서 배치 그룹 수의 기본값을 조정하는 것이 좋습니다. 예:

osd pool default pg num = 100
osd pool default pgp num = 100

복제된 풀을 생성하려면 다음을 실행합니다.

ceph osd pool create <pool-name> <pg-num> <pgp-num> [replicated] \
         [crush-rule-name] [expected-num-objects]

삭제-코딩된 풀을 생성하려면 다음을 실행합니다.

ceph osd pool create <pool-name> <pg-num> <pgp-num> erasure \
         [erasure-code-profile] [crush-rule-name] [expected-num-objects]

다음과 같습니다.

pool-name
설명
풀의 이름입니다. 고유해야 합니다.
유형
문자열
필수 항목
네, 필요합니다. 지정하지 않으면 Ceph 구성 파일 또는 기본값에 나열된 값으로 설정됩니다.
기본값
ceph
pg_num
설명
풀에 대한 총 배치 그룹 수입니다. 적절한 수를 계산하는 방법에 대한 자세한 내용은 풀당 PG(배치 그룹) 섹션 및 Ceph 배치 그룹(PG )을 참조하십시오. ??? 기본 값 8 은 대부분의 시스템에 적합하지 않습니다.
유형
정수
필수 항목
있음
기본값
8
pgp_num
설명
배치 목적으로 총 배치 그룹 수입니다. 이 값은 배치 그룹 분할 시나리오를 제외하고 총 배치 그룹 수와 같아야 합니다.
유형
정수
필수 항목
네, 필요합니다. 지정하지 않으면 Ceph 구성 파일 또는 기본값에 나열된 값으로 설정됩니다.
기본값
8
복제 또는 삭제
설명
개체 또는 삭제 의 여러 사본을 유지하여 손실된 OSD에서 복구하도록 복제 할 수 있는 풀 유형은 일종의 일반 RAID5 기능을 가져오도록 합니다. 복제된 풀에는 더 많은 원시 스토리지가 필요하지만 모든 Ceph 작업을 구현합니다. periodsure-coded 풀에는 원시 스토리지가 더 적게 필요하지만 사용 가능한 작업의 하위 집합만 구현합니다.
유형
문자열
필수 항목
없음
기본값
replicated
crush-rule-name
설명
풀에 대한 crush 규칙의 이름입니다. 규칙이 있어야 합니다. 복제된 풀의 경우 name은 osd_pool_default_crush_rule 구성 설정에서 지정하는 규칙입니다. erasure-coded 풀의 경우 기본 period sure 코드 프로파일 또는 {pool-name} 을 지정하지 않으면 name은 clearsure-code 입니다. 규칙이 아직 존재하지 않는 경우 Ceph에서 지정된 이름으로 이 규칙을 생성합니다.
유형
문자열
필수 항목
없음
기본값
Age sure- coded 풀에 삭제 코드를 사용합니다. 복제된 풀의 경우 Ceph 구성의 osd_pool_default_crush_rule 변수 값을 사용합니다.
expected-num-objects
설명
풀에 예상되는 오브젝트 수입니다. 이 값을 음수 filestore_merge_threshold 변수와 함께 설정하면 Ceph에서 풀 생성 시 배치 그룹을 분할하여 런타임 디렉터리 분할을 수행하는 데 대기 시간 영향을 미치지 않도록 합니다.
유형
정수
필수 항목
없음
기본값
0 - 풀 생성 시 분할되지 않음
erasure-code-profile
설명
삭제로 인코딩된 풀의 경우에만 해당합니다. 삭제 코드 프로필을 사용합니다. Ceph 구성 파일의 osd erasure-code-profile set 변수에서 정의한 기존 프로필이어야 합니다. 자세한 내용은 Erasure Code Profiles 섹션을 참조하십시오.
유형
문자열
필수 항목
없음

풀을 생성할 때 배치 그룹 수를 적절한 값(예: 100)으로 설정합니다. OSD당 총 배치 그룹 수를 고려하십시오. 배치 그룹은 계산으로 비용이 많이 들고, 배치 그룹이 100개 이상인 경우 각각 50개의 배치 그룹이 있는 풀(예: 50개 풀)이 있을 때 성능이 저하됩니다. 중단되는 단계는 OSD 호스트의 성능에 따라 달라집니다.

풀에 적절한 배치 그룹을 계산하는 방법에 대한 자세한 내용은 풀당 PG(배치 그룹) 섹션 및 Ceph 배치 그룹(PG )을 참조하십시오.

4.4. 풀 할당량 설정

최대 바이트 수 또는 풀당 최대 오브젝트 수 또는 둘 다에 대해 풀 할당량을 설정할 수 있습니다.

ceph osd pool set-quota <pool-name> [max_objects <obj-count>] [max_bytes <bytes>]

예:

ceph osd pool set-quota data max_objects 10000

할당량을 제거하려면 값을 0 으로 설정합니다.

참고

진행 중인 쓰기 작업에서는 Ceph가 클러스터 전체에서 풀 사용량을 전파할 때까지 짧은 시간 동안 풀 할당량을 오버런할 수 있습니다. 이것은 정상적인 행동입니다. 진행 중인 쓰기 작업에서 풀 할당량을 강제 적용하면 성능에 큰 영향을 미칠 수 있습니다.

4.5. 풀 삭제

풀을 삭제하려면 다음을 실행합니다.

ceph osd pool delete <pool-name> [<pool-name> --yes-i-really-really-mean-it]
중요

RHCS 3 이상 릴리스에서 데이터를 보호하려면 관리자가 기본적으로 풀을 삭제할 수 없습니다. 풀을 삭제하기 전에 mon_allow_pool_delete 설정 옵션을 설정합니다.

중요

Ceph Object Gateway에서 풀을 사용하는 경우 풀을 삭제한 후 RGW 프로세스를 다시 시작합니다.

풀에 자체 규칙이 있는 경우 풀을 삭제한 후 제거하는 것이 좋습니다. 풀에 사용자가 엄격하게 사용하는 경우 풀을 삭제한 후 해당 사용자를 삭제하는 것이 좋습니다.

4.6. 풀 이름 변경

풀의 이름을 변경하려면 다음을 실행합니다.

ceph osd pool rename <current-pool-name> <new-pool-name>

풀 이름을 바꾸고 인증된 사용자에 대한 풀별 기능이 있는 경우 새 풀 이름으로 사용자의 기능(즉, caps)을 업데이트해야 합니다.

4.7. 풀 통계 표시

풀의 사용률 통계를 표시하려면 다음을 실행합니다.

rados df

4.8. 풀 값 설정

값을 풀로 설정하려면 다음 명령을 실행합니다.

ceph osd pool set <pool-name> <key> <value>

Pool Values 섹션에는 설정할 수 있는 모든 키-값 쌍이 나열됩니다.

4.9. 풀 값 가져오기

풀에서 값을 가져오려면 다음 명령을 실행합니다.

ceph osd pool get <pool-name> <key>

Pool Values 섹션에는 가져올 수 있는 모든 키-값 쌍이 나열됩니다.

4.10. 애플리케이션 활성화

RHCS 3 이상 릴리스에서는 권한이 없는 유형의 클라이언트가 풀에 데이터를 쓰는 것을 방지하기 위해 풀에 추가 보호 기능을 제공합니다. 즉, 시스템 관리자는 Ceph Block Device, Ceph Object Gateway, Ceph Filesystem 또는 사용자 지정 애플리케이션에서 I/O 작업을 수신하도록 풀을 명시적으로 활성화해야 합니다.

클라이언트 애플리케이션이 풀에서 I/O 작업을 수행할 수 있도록 하려면 다음을 실행합니다.

[root@host ~]# ceph osd pool application enable <poolname> <app> {--yes-i-really-mean-it}

여기서 &lt ;app> 은 다음과 같습니다.

  • Ceph 파일 시스템용 CephFS.
  • Ceph 블록 장치용 RBD
  • Ceph 개체 게이트웨이의 경우 RGW
참고

사용자 정의 애플리케이션에 대해 다른 <app > 값을 지정합니다.

중요

활성화되지 않은 풀은 HEALTH_WARN 상태를 생성합니다. 이 시나리오에서는 ceph 상태 세부 정보 -f json-pretty 의 출력이 다음과 같이 출력됩니다.

{
    "checks": {
        "POOL_APP_NOT_ENABLED": {
            "severity": "HEALTH_WARN",
            "summary": {
                "message": "application not enabled on 1 pool(s)"
            },
            "detail": [
                {
                    "message": "application not enabled on pool '<pool-name>'"
                },
                {
                    "message": "use 'ceph osd pool application enable <pool-name> <app-name>', where <app-name> is 'cephfs', 'rbd', 'rgw', or freeform for custom applications."
                }
            ]
        }
    },
    "status": "HEALTH_WARN",
    "overall_status": "HEALTH_WARN",
    "detail": [
        "'ceph health' JSON format has changed in luminous. If you see this your monitoring system is scraping the wrong fields. Disable this with 'mon health preluminous compat warning = false'"
    ]
}
참고
rbd 풀 init <pool-name>을 사용하여 Ceph Block Device의 풀을 초기화합니다.

4.11. 애플리케이션 비활성화

클라이언트 애플리케이션이 풀에서 I/O 작업을 수행하지 않도록 하려면 다음을 실행합니다.

[root@host ~]# ceph osd pool application disable <poolname> <app> {--yes-i-really-mean-it}

여기서 &lt ;app> 은 다음과 같습니다.

  • Ceph 파일 시스템용 CephFS.
  • Ceph 블록 장치용 RBD
  • Ceph 개체 게이트웨이의 경우 RGW
참고

사용자 정의 애플리케이션에 대해 다른 <app > 값을 지정합니다.

4.12. 애플리케이션 메타데이터 설정

RHCS 3 이상 릴리스에서는 클라이언트 애플리케이션의 속성을 설명하는 키-값 쌍을 설정하는 기능을 제공합니다.

풀에서 클라이언트 애플리케이션 메타데이터를 설정하려면 다음을 실행합니다.

[root@host ~]# ceph osd pool application set <poolname> <app> <key> <value>

여기서 &lt ;app> 은 다음과 같습니다.

  • Ceph 파일 시스템용 CephFS.
  • Ceph 블록 장치용 RBD
  • Ceph 개체 게이트웨이의 경우 RGW
참고

사용자 정의 애플리케이션에 대해 다른 <app > 값을 지정합니다.

4.13. 애플리케이션 메타데이터 제거

풀에서 클라이언트 애플리케이션 메타데이터를 제거하려면 다음을 실행합니다.

[root@host ~]# ceph osd pool application set <poolname> <app> <key>

여기서 &lt ;app> 은 다음과 같습니다.

  • Ceph 파일 시스템용 CephFS.
  • Ceph 블록 장치용 RBD
  • Ceph 개체 게이트웨이의 경우 RGW
참고

사용자 정의 애플리케이션에 대해 다른 <app > 값을 지정합니다.

4.14. 오브젝트 복제본 수 설정

복제된 풀에서 오브젝트 복제본 수를 설정하려면 다음 명령을 실행합니다.

ceph osd pool set <poolname> size <num-replicas>
중요

& lt;num-replicas& gt; 매개변수는 오브젝트 자체를 포함합니다. 오브젝트와 오브젝트의 총 3개의 인스턴스에 대한 오브젝트 사본 2개를 포함하려면 3 을 지정합니다.

예:

ceph osd pool set data size 3

각 풀에 대해 이 명령을 실행할 수 있습니다.

참고

오브젝트는 풀 크기 설정에서 지정한 것보다 적은 복제본이 적은 I/O 작업의 성능 저하 모드로 수락할 수 있습니다. I/O에 필요한 최소 복제본 수를 설정하려면 min_size 설정을 사용합니다. 예:

ceph osd pool set data min_size 2

이렇게 하면 데이터 풀의 오브젝트가 min_size 설정에서 지정한 것보다 적은 복제본으로 I/O를 수신하지 않습니다.

4.15. 오브젝트 복제본 수를 가져옵니다.

오브젝트 복제본 수를 가져오려면 다음 명령을 실행합니다.

ceph osd dump | grep 'replicated size'

Ceph에서 복제된 size 속성이 강조 표시된 풀을 나열합니다. 기본적으로 Ceph는 총 3개의 복사본 또는 크기가 3 인 오브젝트의 두 개의 복제본을 생성합니다.

4.16. 풀 값

다음 목록에는 설정하거나 가져올 수 있는 키-값 쌍이 나와 있습니다. 자세한 내용은 풀 값 설정 및 풀 값 가져오기 섹션을 참조하십시오.

크기
설명
풀의 오브젝트 복제본 수를 지정합니다. 자세한 내용은 Set the Number of Object Replicas 섹션을 참조하십시오. 복제된 풀에만 적용됩니다.
유형
정수
min_size
설명
I/O에 필요한 최소 복제본 수를 지정합니다. 자세한 내용은 Set the Number of Object Replicas 섹션을 참조하십시오. 복제된 풀에만 적용됩니다.
유형
정수
crash_replay_interval
설명
클라이언트가 승인되었지만 커밋되지 않은 요청을 재생하도록 허용하는 시간(초)을 지정합니다.
유형
정수
pg-num
설명
풀에 대한 총 배치 그룹 수입니다. 적합한 수를 계산하는 방법에 대한 자세한 내용은 Red Hat Ceph Storage 4 구성 가이드풀, PG 및 CRUSH 구성 참조 섹션을 참조하십시오. 기본 값 8 은 대부분의 시스템에 적합하지 않습니다.
유형
정수
필수 항목
네, 필요합니다.
기본값
8
pgp-num
설명
배치 목적으로 총 배치 그룹 수입니다. 이는 배치 그룹 분할 시나리오 를 제외하고 총 배치 그룹 수와 같아야 합니다.
유형
정수
필수 항목
네, 필요합니다. 지정되지 않은 경우 기본값 또는 Ceph 구성 값을 선택합니다.
기본값
8
유효한 범위
pg_num 변수에서 지정한 것과 같거나 작습니다.
crush_rule
설명
클러스터에서 오브젝트 배치를 매핑하는 데 사용할 규칙입니다.
유형
문자열
hashpspool
설명
지정된 풀에서 HASHPSPOOL 플래그를 활성화하거나 비활성화합니다. 이 옵션을 활성화하면 풀 해시 및 배치 그룹 매핑이 변경되어 풀 및 배치 그룹이 겹치는 방식을 개선할 수 있습니다.
유형
정수
유효한 범위
1 플래그를 활성화하며 0 은 플래그를 비활성화합니다.
중요

대규모 OSD 및 데이터가 있는 클러스터의 프로덕션 풀에서 이 옵션을 활성화하지 마십시오. 풀에 있는 모든 배치 그룹을 다시 매핑해야 하는 경우 너무 많은 데이터 이동이 발생했습니다.

fast_read
설명
삭제 코딩을 사용하는 풀에서 이 플래그가 활성화된 경우 읽기 요청 문제는 모든 shard에 대해 후속 읽기 문제를 읽고 클라이언트에 서비스를 제공하기 위해 디코딩할 충분한 shard를 수신할 때까지 기다립니다. jerasureisa age-ins의 경우 첫 번째 K 응답이 반환되면 클라이언트의 요청이 이러한 응답에서 디코딩된 데이터를 사용하여 즉시 제공됩니다. 이는 성능을 높이기 위해 일부 리소스를 할당하는 데 도움이 됩니다. 현재 이 플래그는 삭제 코딩 풀에만 지원됩니다.
유형
부울
기본값
0
allow_ec_overwrites
설명
삭제 코딩된 풀에 쓰는 쓰기가 오브젝트의 일부를 업데이트할 수 있으므로 Ceph Filesystem과 Ceph Block Device가 이를 사용할 수 있습니다.
유형
부울
버전
RHCS 3 이상
compression_algorithm
설명
BlueStore 스토리지 백엔드와 함께 사용할 인라인 압축 알고리즘을 설정합니다. 이 설정은 bluestore_compression_algorithm 구성 설정을 재정의합니다.
유형
문자열
유효한 설정
lz4, snappy, zlib, zstd
compression_mode
설명
BlueStore 스토리지 백엔드에 대한 인라인 압축 알고리즘의 정책을 설정합니다. 이 설정은 bluestore_compression_mode 구성 설정을 재정의합니다.
유형
문자열
유효한 설정
none,passive,aggressive,force
compression_min_blob_size
설명
bluestore는 이 크기보다 작은 청크를 압축하지 않습니다. 이 설정은 bluestore_compression_min_blob_size 구성 설정을 재정의합니다.
유형
서명되지 않은 정수
compression_max_blob_size
설명
bluestore는 데이터를 압축하기 전에 이 크기보다 큰 청크를 compression_max_blob_size 의 더 작은 Blob으로 분할합니다.
유형
서명되지 않은 정수
nodelete
설명
지정된 풀에서 NODELETE 플래그를 설정하거나 설정 해제합니다.
유형
정수
유효한 범위
1 플래그를 설정합니다. 0 은 플래그를 설정 해제합니다.
nopgchange
설명
지정된 풀에서 NOPGCHANGE 플래그를 설정하거나 설정 해제합니다.
유형
정수
유효한 범위
1 플래그를 설정합니다. 0 플래그를 설정 해제합니다.
nosizechange
설명
지정된 풀에서 NOSIZECHANGE 플래그를 설정하거나 설정 해제합니다.
유형
정수
유효한 범위
1 플래그를 설정합니다. 0 플래그를 설정 해제합니다.
write_fadvise_dontneed
설명
지정된 풀에서 WRITE_FADVISE_DONTNEED 플래그를 설정하거나 설정 해제합니다.
유형
정수
유효한 범위
1 플래그를 설정합니다. 0 플래그를 설정 해제합니다.
noscrub
설명
지정된 풀에서 NOSCRUB 플래그를 설정하거나 설정 해제합니다.
유형
정수
유효한 범위
1 플래그를 설정합니다. 0 플래그를 설정 해제합니다.

nodeep-scrub

설명
지정된 풀에서 NODEEP_SCRUB 플래그를 설정하거나 설정 해제합니다.
유형
정수
유효한 범위

1 플래그를 설정합니다. 0 플래그를 설정 해제합니다.

scrub_min_interval
설명
로드가 낮을 때 풀 스크럽에 대한 최소 간격(초)입니다. 0 인 경우 Ceph는 osd_scrub_min_interval 구성 설정을 사용합니다.
유형
double
기본값

0

scrub_max_interval
설명
클러스터 로드와 관계없이 풀 스크럽에 대한 최대 간격(초)입니다. 0 인 경우 Ceph는 osd_scrub_max_interval 구성 설정을 사용합니다.
유형
double
기본값

0

deep_scrub_interval
설명
풀 'deep' 스크럽에 대한 간격(초)입니다. 0 인 경우 Ceph는 osd_deep_scrub_interval 구성 설정을 사용합니다.
유형
double
기본값
0

5장. 복구 코드 풀

Ceph 스토리지 전략에는 데이터 지속성 요구 사항을 정의하는 작업이 포함됩니다. 데이터 지속성은 데이터 손실 없이 하나 이상의 OSD의 손실을 유지할 수 있음을 의미합니다.

Ceph는 풀에 데이터를 저장하고 풀의 두 가지 유형이 있습니다.

  • replicated
  • erasure-coded

Ceph는 기본적으로 복제된 풀을 사용합니다. 즉, Ceph는 기본 OSD 노드의 모든 오브젝트를 하나 이상의 보조 OSD로 복사합니다.

timessure-coded 풀은 데이터 지속성을 보장하는 데 필요한 디스크 공간의 양을 감소시키지만 복제보다 약간 더 비용이 많이 듭니다.

디스큐어 코딩은 오브젝트를 Ceph 스토리지 클러스터에 저장하는 방법입니다. 여기서 삭제 코드 알고리즘은 개체를k) 및 코딩 청크(m)로 분리하고 이러한 청크를 다른 OSD에 저장합니다.

OSD가 실패하는 경우 Ceph는 다른 OSD에서 나머지 데이터(k) 및 코딩(m) 청크를 검색하고 삭제 코드 알고리즘은 해당 청크에서 오브젝트를 복원합니다.

참고

Red Hat은 미리 코드된 풀에 대해 min_sizeK+2 이상으로 권장하여 쓰기 및 데이터의 손실을 방지할 것을 권장합니다.

삭제 코딩은 복제보다 스토리지 용량을 더 효율적으로 사용합니다. n -replication 접근 방식은 기본적으로 Ceph에서 오브젝트 3x(3x)를 유지 관리하는 반면, pastsure coding은 k + m 청크만 유지합니다. 예를 들어 4개의 데이터 및 2개의 코딩 청크는 원래 오브젝트의 스토리지 공간을 1.5x로 사용합니다.

삭제 코딩은 복제보다 적은 스토리지 오버헤드를 사용하지만 삭제 코드 알고리즘은 개체에 액세스하거나 복구할 때 복제보다 더 많은 RAM과 CPU를 사용합니다. 데이터 스토리지는 지속성 및 내결함성이 있어야 하지만 빠른 읽기 성능(예: 콜드 스토리지, 기록 레코드 등)이 필요하지 않은 경우 고해한 코딩이 유용합니다.

dissure 코드가 Ceph에서 작동하는 방법에 대한 수치화 및 자세한 설명은 Red Hat Ceph Storage 4의 아키텍처 가이드Erasure Coded I/O 섹션을 참조하십시오.

Ceph는 k=2m=1 로 클러스터를 초기화할 때 기본 삭제 코드 프로필을 생성합니다. 즉, Ceph가 3개의 OSD(k+m == 3)를 통해 오브젝트 데이터를 분배하고 Ceph가 데이터를 손실하지 않고 해당 OSD 중 하나를 손실할 수 있습니다. 제거 코드 프로파일링에 대한 자세한 내용은 Erasure Code Profiles 섹션을 참조하십시오.

중요

.rgw.buckets 풀만 erasure-coded로 구성하고 다른 모든 Ceph Object Gateway 풀은 복제됨으로 구성합니다. 그렇지 않으면 다음 오류와 함께 새 버킷을 생성하려는 시도가 실패합니다.

set_req_state_err err_no=95 resorting to 500

이러한 이유로 dissure-coded 풀은 omap 작업을 지원하지 않으며 특정 Ceph Object Gateway 메타데이터 풀에는 omap 지원이 필요합니다.

5.1. 샘플 Erasure-coded 풀 생성

가장 간단한 삭제 코딩된 풀은 RAID5와 동일하며 최소 세 개의 호스트가 필요합니다.

$ ceph osd pool create ecpool 50 50 erasure
pool 'ecpool' created
$ echo ABCDEFGHI | rados --pool ecpool put NYAN -
$ rados --pool ecpool get NYAN -
ABCDEFGHI
참고

pool create 의 50은 배치 그룹 수를 나타냅니다.

5.2. 삭제 코드 프로필

Ceph는 프로필을 사용하여 삭제로 인코딩된 풀을 정의합니다. Ceph는 Deletesure-coded 풀 및 관련 CRUSH 규칙을 생성할 때 프로필을 사용합니다.

Ceph는 클러스터를 초기화할 때 기본 삭제 코드 프로필을 생성하고 복제된 풀의 두 복사본과 동일한 수준의 중복성을 제공합니다. 그러나 스토리지 용량이 25% 적게 사용됩니다. 기본 프로필은 k=2m=1 을 정의합니다. 즉, Ceph는 3개의 OSD(k+m=3)에 오브젝트 데이터를 분산하고 Ceph는 데이터 손실 없이 이러한 OSD 중 하나를 잃을 수 있습니다.

기본 삭제 코드 프로필은 단일 OSD의 손실을 유지할 수 있습니다. 크기가 2인 복제된 풀과 동일하지만 1TB 데이터를 저장하기 위해 2TB가 아닌 1.5TB가 필요합니다. 기본 프로필을 표시하려면 다음 명령을 사용합니다.

$ ceph osd erasure-code-profile get default
directory=.libs
k=2
m=1
plugin=jerasure
crush-failure-domain=host
technique=reed_sol_van

새 프로필을 생성하여 원시 스토리지 요구 사항을 늘리지 않고도 중복성을 개선할 수 있습니다. 예를 들어 k=8 m=4 를 사용하는 프로필은 12개(k+m=12) OSD에서 오브젝트를 분산하여 4개(m4 ) OSD의 손실을 유지할 수 있습니다. Ceph는 오브젝트를 8 개의 청크로 나누고 복구를 위해 4 개의 코딩 청크를 계산합니다. 예를 들어 오브젝트 크기가 8MB인 경우 각 데이터 청크는 1MB이며 각 코딩 청크는 데이터 청크와 크기가 동일하며 1MB입니다. 4개의 OSD가 동시에 실패해도 오브젝트가 손실되지 않습니다.

프로파일의 가장 중요한 매개변수는 k,mcrush-failure-domain 인데, 이는 스토리지 오버헤드와 데이터 지속성을 정의했기 때문입니다.

중요

풀을 생성한 후에는 프로필을 변경할 수 없으므로 올바른 프로필을 선택하는 것이 중요합니다. 프로필을 수정하려면 다른 프로필을 사용하여 새 풀을 생성하고 이전 풀에서 새 풀로 오브젝트를 마이그레이션해야 합니다.

예를 들어 원하는 아키텍처가 두 랙의 손실을 50% 오버헤드로 유지해야 하는 경우 다음 프로필을 정의할 수 있습니다.

$ ceph osd erasure-code-profile set myprofile \
   k=4 \
   m=2 \
   crush-failure-domain=rack
$ ceph osd pool create ecpool 12 12 erasure *myprofile*
$ echo ABCDEFGHIJKL | rados --pool ecpool put NYAN -
$ rados --pool ecpool get NYAN -
ABCDEFGHIJKL

기본 OSD는 NYAN 오브젝트를 4개(k=4) 데이터 청크로 나누고 두 개의 추가 청크(m=2)를 생성합니다. m 값은 데이터를 손실하지 않고 동시에 손실될 수 있는 OSD 수를 정의합니다. crush-failure-domain=rack 은 두 청크가 동일한 랙에 저장되지 않도록 하는 CRUSH 규칙을 만듭니다.

삭제 코드
중요

Red Hat은 km 에 대해 다음과 같은 삭제 코딩 값을 지원합니다.

  • k=8 m=3
  • k=8 m=4
  • k=4 m=2
중요

OSD가 손실된 OSD 수가 코딩 청크 수(m)와 같은 경우, 삭제 코딩 풀의 일부 배치 그룹은 불완전한 상태가 됩니다. 손실된 OSD 수가 m 보다 작으면 배치 그룹이 불완전한 상태가 아닙니다. 두 경우 모두 데이터 손실이 발생하지 않습니다. 배치 그룹이 불완전한 상태인 경우 삭제 코딩된 풀의 min_size 를 일시적으로 축소하면 복구할 수 있습니다.

5.2.1. OSD 삭제-code-profile 세트

새 삭제 코드 프로필을 생성하려면 다음을 수행합니다.

ceph osd erasure-code-profile set <name> \
         [<directory=directory>] \
         [<plugin=plugin>] \
         [<stripe_unit=stripe_unit>] \
         [<crush-device-class>]\
         [<crush-failure-domain>]\
         [<key=value> ...] \
         [--force]

다음과 같습니다.

디렉터리
설명
agesure 코드 플러그인이 로드되는 디렉터리 이름을 설정합니다.
유형
문자열
필수 항목
아니요.
기본값
/usr/lib/ceph/erasure-code
plugin
설명
삭제 코드 플러그인을 사용하여 코딩 청크를 계산하고 누락된 청크를 복구합니다. 자세한 내용은 Erasure Code 플러그인 섹션을 참조하십시오.
유형
문자열
필수 항목
아니요.
기본값
jerasure
stripe_unit
설명
스트라이프당 데이터 청크의 데이터 양입니다. 예를 들어 2 데이터 청크와 스트라이프_unit=4K 가 있는 프로필은 청크 0-4K의 청크 0-4K 범위를 청크 1에, 청크 1의 8K-12K를 다시 청크 0으로 배치합니다. 최상의 성능을 위해서는 4K가 여러 개여야 합니다. 풀이 생성될 때 기본값은 모니터 구성 옵션 osd_pool_erasure_code_stripe_unit 에서 가져옵니다. 이 프로필을 사용하는 풀의 스트라이프_width는 이 스트라이프_unit 을 곱한 데이터 청크 수입니다.
유형
문자열
필수 항목
아니요.
기본값
4K
crush-device-class
설명
hdd 또는 ssd 와 같은 장치 클래스입니다. RHCS 3 이상에서만 사용할 수 있습니다.
유형
문자열
필수 항목
없음
기본값
none, 즉 CRUSH는 클래스와 관계없이 모든 장치를 사용합니다.
crush-failure-domain
설명
호스트 또는 과 같은 실패 도메인.
유형
문자열
필수 항목
없음
기본값
host
key
설명
나머지 키-값 쌍의 의미는 erasure 코드 플러그인에 의해 정의됩니다.
유형
문자열
필수 항목
아니요.
--force
설명
동일한 이름으로 기존 프로필을 재정의합니다.
유형
문자열
필수 항목
아니요.

5.2.2. OSD 삭제-code-profile Remove

제거 코드 프로파일을 제거하려면 다음을 수행합니다.

ceph osd erasure-code-profile rm <name>

풀에서 프로필을 참조하는 경우 삭제가 실패합니다.

5.2.3. OSD erasure-code-profile Get

삭제 코드 프로필을 표시하려면 다음을 수행합니다.

ceph osd erasure-code-profile get <name>

5.2.4. OSD 삭제-code-profile 목록

모든 삭제 코드 프로필의 이름을 나열하려면 다음을 수행합니다.

ceph osd erasure-code-profile ls

5.3. 이전: Overwrites

기본적으로 삭제 코딩된 풀은 전체 오브젝트 쓰기 및 추가 작업을 수행하는 Ceph Object Gateway에서만 작동합니다. Red Hat Ceph Storage 3.x에서 삭제 코드 풀에 대한 부분 쓰기는 풀별로 활성화할 수 있습니다.

소거 코딩된 풀을 덮어 쓰기와 함께 사용하면 Ceph 블록 장치 및 CephFS가 데이터를 삭제 목록 내에 저장할 수 있습니다.

구문

ceph osd pool set <erasure_coded_pool_name> allow_ec_overwrites true

예제

$ ceph osd pool set ec_pool allow_ec_overwrites true

덮어쓰기를 사용하여 코딩된 풀을 활성화하면 BlueStore OSD를 사용하는 풀에만 존재할 수 있습니다. BlueStore의 체크섬은 딥 스크러브 동안 비트로트 또는 기타 손상을 감지하는 데 사용됩니다. 삭제와 함께 FileStore를 사용하는 것은 더 안전하지 않으며 BlueStore에 비해 성능이 떨어집니다.

코딩된 풀이 omap을 지원하지 않습니다. Ceph 블록 장치 및 CephFS와 함께 삭제 코딩된 풀을 사용하려면 데이터를 삭제 코딩된 풀에 저장하고 메타데이터를 복제된 풀에 저장합니다.

Ceph 블록 장치의 경우 이미지 생성 중에 --data-pool 옵션을 사용합니다.

구문

rbd create --size <image_size>M|G|T --data-pool <erasure_coded_pool_name> <replicated_pool_name>/<image_name>

예제

$ rbd create --size 1G --data-pool ec_pool rep_pool/image01

CephFS에 코딩된 풀을 사용하는 경우 파일 레이아웃에서 덮어 쓰기를 설정해야 합니다.

5.4. 삭제 코드 플러그인

Ceph는 플러그인 아키텍처와의 이전 코딩을 지원하므로 다양한 유형의 알고리즘을 사용하여 삭제 코딩된 풀을 생성할 수 있습니다. Ceph 지원:

  • Jerasure (기본값)
  • 로컬 복구 가능
  • RuntimeClass(Intel만 해당)

다음 섹션에서는 이러한 플러그인에 대해 자세히 설명합니다.

5.4.1. Jerasure Erasure Code 플러그인

jerasure 플러그인은 가장 일반적이고 유연한 플러그인입니다. 또한 Ceph 삭제 코딩된 풀의 기본값이기도 합니다.

jerasure 플러그인은 JerasureH 라이브러리를 캡슐화합니다. 매개 변수에 대한 자세한 내용은 jerasure 설명서를 참조하십시오.

jerasure 플러그인을 사용하여 새로운 Agesure 코드 프로필을 만들려면 다음 명령을 실행하십시오.

ceph osd erasure-code-profile set <name> \
     plugin=jerasure \
     k=<data-chunks> \
     m=<coding-chunks> \
     technique=<reed_sol_van|reed_sol_r6_op|cauchy_orig|cauchy_good|liberation|blaum_roth|liber8tion> \
     [crush-root=<root>] \
     [crush-failure-domain=<bucket-type>] \
     [directory=<directory>] \
     [--force]

다음과 같습니다.

k
설명
각 오브젝트는 data-chunks 부분으로 분할되며 각각 다른 OSD에 저장됩니다.
유형
정수
필수 항목
네, 필요합니다.
예제
4
m
설명
각 오브젝트에 대한 코딩 청크 를 계산하여 서로 다른 OSD에 저장합니다. 코딩 청크 수는 데이터 손실 없이 다운될 수 있는 OSD 수이기도 합니다.
유형
정수
필수 항목
네, 필요합니다.
예제
2
technique
설명
보다 유연한 기술은 reed_sol_van 입니다; km 을 설정하기에 충분합니다. cauchy_good 기술은 더 빠를 수 있지만 신중하게 패킷을 선택해야합니다. 모든 reed_sol_r6_op,liberation,blaum_roth,liber8tionm=2 로만 구성할 수 있다는 점에서 RAID6 동등한 것입니다.
유형
문자열
필수 항목
아니요.
유효한 Setttings
reed_sol_vanreed_sol_r6_opcauchy_origcauchy_goodliberationblaum_rothliber8tion
기본값
reed_sol_van
packetSize
설명
인코딩은 한 번에 바이트 크기의 패킷에서 수행됩니다. 올바른 패킷 크기를 선택하는 것은 어렵습니다. jerasure 설명서에는 이 문제에 대한 광범위한 정보가 포함되어 있습니다.
유형
정수
필수 항목
아니요.
기본값
2048
crush-root
설명
규칙의 첫 번째 단계에 사용된 CRUSH 버킷의 이름입니다. 예를 들어, 기본 단계는 다음과 같습니다.
유형
문자열
필수 항목
아니요.
기본값
default
crush-failure-domain
설명
동일한 장애 도메인이 있는 버킷에 두 개의 청크가 없는지 확인합니다. 예를 들어 장애 도메인이 호스트 되면 두 개의 청크가 동일한 호스트에 저장되지 않습니다. step chooseleaf host 와 같은 규칙 단계를 생성하는 데 사용됩니다.
유형
문자열
필수 항목
아니요.
기본값
host
디렉터리
설명
agesure 코드 플러그인이 로드되는 디렉터리 이름을 설정합니다.
유형
문자열
필수 항목
아니요.
기본값
/usr/lib/ceph/erasure-code
--force
설명
동일한 이름으로 기존 프로필을 재정의합니다.
유형
문자열
필수 항목
아니요.

5.4.2. 로컬 복구 가능한 LRC(Erasure Code) 플러그인

jerasure 플러그인을 사용하면 Ceph가 여러 OSD에 Agesure-coded 오브젝트를 저장할 때 하나의 OSD가 손실되는 것을 복구하려면 다른 모든 것에서 읽기가 필요합니다. 예를 들어 k=8m=4jerasure 를 구성하는 경우 하나의 OSD를 손실하려면 다른 사람의 수를 복구해야 합니다.

lrc 삭제 코드 플러그인은 로컬 패리티 청크를 생성하여 더 적은 OSD를 사용하여 복구할 수 있습니다. 예를 들어 k=8,m=4l=4 를 사용하여 lrc 를 구성하는 경우 4개 OSD마다 추가 패리티 청크가 생성됩니다. Ceph가 단일 OSD를 손실하면 4개의 OSD만 사용하여 개체 데이터를 복구할 수 있습니다.

모든 호스트가 동일한 스위치에 연결된 경우 흥미로운 사용 사례는 아니지만 lrc agesure 코드 플러그인을 사용할 때 랙 간 대역폭 사용량 감소를 실제로 관찰할 수 있습니다.

$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     k=4 m=2 l=3 \
     crush-failure-domain=host
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

1.2 버전에서는 기본 OSD가 손실된 청크와 동일한 랙에 있는 경우에만 대역폭 감소를 확인할 수 있습니다.

$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     k=4 m=2 l=3 \
     crush-locality=rack \
     crush-failure-domain=host
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

5.4.2.1. LRC 프로파일 생성

새 LRC 삭제 코드 프로파일을 생성하려면 다음 명령을 실행합니다.

ceph osd erasure-code-profile set <name> \
     plugin=lrc \
     k=<data-chunks> \
     m=<coding-chunks> \
     l=<locality> \
     [crush-root=<root>] \
     [crush-locality=<bucket-type>] \
     [crush-failure-domain=<bucket-type>] \
     [directory=<directory>] \
     [--force]

다음과 같습니다.

k
설명
각 오브젝트는 data-chunks 부분으로 분할되며 각각 다른 OSD에 저장됩니다.
유형
정수
필수 항목
네, 필요합니다.
예제
4
m
설명
각 오브젝트에 대한 코딩 청크 를 계산하여 서로 다른 OSD에 저장합니다. 코딩 청크 수는 데이터 손실 없이 다운될 수 있는 OSD 수이기도 합니다.
유형
정수
필수 항목
네, 필요합니다.
예제
2
l
설명
코딩 및 데이터 청크를 크기 지역성 세트로 그룹화합니다. 예를 들어 k=4m=2 의 경우 locality=3 두 그룹이 3개 생성되는 경우입니다. 각 세트는 다른 세트의 청크를 읽지 않고 복구 할 수 있습니다.
유형
정수
필수 항목
네, 필요합니다.
예제
3
crush-root
설명
규칙의 첫 번째 단계에 사용된 crush 버킷의 이름입니다. 예를 들어, 기본 단계는 다음과 같습니다.
유형
문자열
필수 항목
아니요.
기본값
default
crush-locality
설명
l 에 정의된 각 청크 세트가 저장되는 crush 버킷의 유형입니다. 예를 들어, 으로 설정되면 각 l chunk 그룹이 다른 랙에 배치됩니다. 단계 선택 랙 과 같은 규칙 단계를 만드는 데 사용됩니다. 설정하지 않으면 이러한 그룹화가 수행되지 않습니다.
유형
문자열
필수 항목
아니요.
crush-failure-domain
설명
동일한 장애 도메인이 있는 버킷에 두 개의 청크가 없는지 확인합니다. 예를 들어 장애 도메인이 호스트 되면 두 개의 청크가 동일한 호스트에 저장되지 않습니다. step chooseleaf host 와 같은 규칙 단계를 생성하는 데 사용됩니다.
유형
문자열
필수 항목
아니요.
기본값
host
디렉터리
설명
agesure 코드 플러그인이 로드되는 디렉터리 이름을 설정합니다.
유형
문자열
필수 항목
아니요.
기본값
/usr/lib/ceph/erasure-code
--force
설명
동일한 이름으로 기존 프로필을 재정의합니다.
유형
문자열
필수 항목
아니요.

5.4.2.2. 하위 수준 LRC 프로필 생성

km 의 합계는 l 매개변수의 수여야 합니다. 낮은 수준의 구성 매개 변수는 이러한 제한을 부과하지 않으며 특정 목적으로 사용하는 것이 더 편리할 수 있습니다. 예를 들어, 두 개의 그룹을 정의할 수 있으며, 하나는 4개의 청크로, 또 다른 그룹은 3개의 청크로 정의할 수 있습니다. 예를 들어 데이터 센터와 데이터 센터에 랙에 대해 지역성 세트를 재귀적으로 정의할 수도 있습니다. k/m/l 은 낮은 수준의 구성을 생성하여 구현됩니다.

lrc Remosure 코드 플러그인은 반복적으로 삭제 코드 기술을 적용하여 일부 청크 손실을 복구하려면 대부분의 시간 동안 사용 가능한 청크의 하위 집합 만 필요합니다.

예를 들어 세 가지 코딩 단계가 다음과 같이 설명될 때:

chunk nr    01234567
step 1      _cDD_cDD
step 2      cDDD____
step 3      ____cDDD

여기서 c 는 데이터 청크 D 에서 계산된 코딩 청크이며, 청크 7 의 손실은 마지막 4개의 청크로 복구될 수 있습니다. 그리고 chun 2 청크 손실은 처음 4 개의 청크로 복구 할 수 있습니다.

미미디 테스트 시나리오는 기본 erasure-code 프로파일 사용과 엄격하게 동일합니다. DDK=2 를 의미하며 cM=1 을 의미하며, 기본적으로 jerasure 플러그인을 사용합니다.

$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     mapping=DD_ \
     layers='[ [ "DDc", "" ] ]'
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

lrc 플러그인은ack 대역폭 사용을 줄이는 데 특히 유용합니다. 모든 호스트가 동일한 스위치에 연결된 경우 흥미로운 사용 사례는 아니지만 대역폭 사용량 감소를 실제로 확인할 수 있습니다. 청크 레이아웃이 다른 경우에도 k=4,m=2l=3 과 동일합니다.

$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     mapping=__DD__DD \
     layers='[
               [ "_cDD_cDD", "" ],
               [ "cDDD____", "" ],
               [ "____cDDD", "" ],
             ]'
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

firefly에서는 기본 OSD가 손실된 청크와 동일한 랙에 있는 경우에만 대역폭이 관찰됩니다.

$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     mapping=__DD__DD \
     layers='[
               [ "_cDD_cDD", "" ],
               [ "cDDD____", "" ],
               [ "____cDDD", "" ],
             ]' \
     crush-steps='[
                     [ "choose", "rack", 2 ],
                     [ "chooseleaf", "host", 4 ],
                    ]'
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

LRC는 이제 기본 EC 백엔드로 jerasure 를 사용합니다. 낮은 수준의 구성을 사용하여 계층당 EC 백엔드 및 알고리즘을 지정할 수 있습니다. layers='[ [DDc", "" ]'의 두 번째 인수는 실제로 이 수준에 사용할 삭제 코드 프로필입니다. 아래 예제에서는 lrcpool에 사용할 Cauchy 기술을 사용하여 RuntimeClass 백엔드를 지정합니다.

$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     mapping=DD_ \
     layers='[ [ "DDc", "plugin=isa technique=cauchy" ] ]'
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

각 계층에 대해 다른 삭제 코드 프로필을 사용할 수도 있습니다.You can also use a different agesure code profile for each layer:

$ ceph osd erasure-code-profile set LRCprofile \
     plugin=lrc \
     mapping=__DD__DD \
     layers='[
               [ "_cDD_cDD", "plugin=isa technique=cauchy" ],
               [ "cDDD____", "plugin=isa" ],
               [ "____cDDD", "plugin=jerasure" ],
             ]'
$ ceph osd pool create lrcpool 12 12 erasure LRCprofile

5.4.3. CRUSH 배치 제어

기본 CRUSH 규칙은 다른 호스트에 있는 OSD를 제공합니다. 예를 들면 다음과 같습니다.

chunk nr    01234567

step 1      _cDD_cDD
step 2      cDDD____
step 3      ____cDDD

정확히 8 개의 OSD가 필요합니다. 각 청크마다 하나씩 있어야 합니다. 호스트가 두 개의 인접한 랙에 있는 경우 첫 번째 4개의 청크를 첫 번째 랙과 두 번째 랙에서 마지막 4개를 배치할 수 있습니다. 단일 OSD가 손실되는 것을 복구하려면 두 랙 간의 대역폭을 사용할 필요가 없습니다.

예를 들면 다음과 같습니다.

crush-steps='[ [ "choose", "rack", 2 ], [ "chooseleaf", "host", 4 ] ]'

는 유형 의 두 개의 크루쉬 버킷을 선택하고 각각에 대해 4 개의 OSD를 선택합니다. 각 OSD는 서로 다른 유형의 host 에 있습니다.

더 세분화된 제어를 위해 규칙을 수동으로 생성할 수도 있습니다.

5.5. NovaCron Erasure Code 플러그인

isa 플러그인은 RuntimeClass 라이브러리를 캡슐화합니다. Intel 프로세서에서만 실행됩니다.

isa 플러그인을 사용하여 새 삭제 코드 프로필을 생성하려면 다음 명령을 실행합니다.

ceph osd erasure-code-profile set <name> \
     plugin=isa \
     technique=<reed_sol_van|cauchy> \
     [k=<data-chunks>] \
     [m=<coding-chunks>] \
     [crush-root=<root>] \
     [crush-failure-domain=<bucket-type>] \
     [directory=<directory>] \
     [--force]

다음과 같습니다.

technique
설명
RuntimeClass 플러그인은 두 개의 Reed Solomon 형태로 제공됩니다. reed_sol_van 이 설정되면, 캐치 피가 설정된 경우 Vandermonde입니다.
유형
문자열
필수 항목
아니요.
유효한 설정
reed_sol_vancauchy
기본값
reed_sol_van
k
설명
각 오브젝트는 data-chunks 부분으로 분할되며 각각 다른 OSD에 저장됩니다.
유형
정수
필수 항목
아니요.
기본값
7
m
설명
각 오브젝트에 대한 코딩 청크 를 계산하여 서로 다른 OSD에 저장합니다. 코딩 청크 수는 데이터 손실 없이 다운될 수 있는 OSD 수이기도 합니다.
유형
정수
필수 항목
아니요.
기본값
3
crush-root
설명
규칙의 첫 번째 단계에 사용된 crush 버킷의 이름입니다. intance 단계의 경우 기본값은.
유형
문자열
필수 항목
아니요.
기본값
default
crush-failure-domain
설명
동일한 장애 도메인이 있는 버킷에 두 개의 청크가 없는지 확인합니다. 예를 들어 장애 도메인이 호스트 되면 두 개의 청크가 동일한 호스트에 저장되지 않습니다. step chooseleaf host 와 같은 규칙 단계를 생성하는 데 사용됩니다.
유형
문자열
필수 항목
아니요.
기본값
host
디렉터리
설명
agesure 코드 플러그인이 로드되는 디렉터리 이름을 설정합니다.
유형
문자열
필수 항목
아니요.
기본값
/usr/lib/ceph/erasure-code
--force
설명
동일한 이름으로 기존 프로필을 재정의합니다.
유형
문자열
필수 항목
아니요.

5.6. pyramid Erasure 코드

피라미드 파도 코드는 기본적으로 데이터의 액세스 및 복구를 개선하기 위해 원래의 Agesure 코드 알고리즘을 기반으로 개선된 알고리즘입니다. 이는 단순히 주어진 (n, k)에 대해 Reed-Solomon 과 같은 기존 MDS (Maximum Distance Setance Setance Setance Setance Setance Setance Setance Setance Setance Setance Setance Setance Setance Setance Setance Setance Separable) 코드의 파생으로, k 는 원래 데이터 청크 수이고 n 은 코딩 프로세스 후 데이터 청크의 총 수입니다. Pyramid 코드는 표준 MDS 코드를 기반으로 하므로 인코딩/라이코딩 접근 방식이 동일합니다. pyramid 코딩된 데이터 풀은 일반 삭제 코딩된 풀과 같은 임의의 장애와 동일한 쓰기 오버헤드와 동일한 복구 기능을 갖습니다. pyramid 코드의 유일한 장점은 일반 삭제 코드와 비교하여 읽기 오버헤드를 크게 줄일 수 있다는 것입니다.

(11, 8) 코딩된 풀의 예를 보고 pyramid 코드 접근 방식을 적용해 보겠습니다. (11, 8) 코딩된 풀을 (12, 8) Pyramid 코딩된 풀로 변환합니다. 삭제 코딩 풀에는 8 개의 데이터 청크와 11 - 8 = 3 개의 중복 청크가 있습니다. Pyramid 코드는 8 데이터 청크를 2 개의 동일한 크기 그룹으로 분리합니다. 즉 P1 = {a1, a2, a3, a4} 및 P2 = {a5, a6, a7, a8}. 이는 삭제 코드의 중복 청크 두 개를 변경하지 않고 유지합니다(예: b2 및 b3). 이 두 청크는 8개의 데이터 청크를 모두 처리하기 때문에 이제 글로벌 중복 청크라고 합니다. 다음으로 그룹 P1에 대한 중복 청크가 계산되며 이는 그룹 (또는 로컬) 중복 청크 b1,1로 표시됩니다. 계산은 원래의 삭제 코드의 b1이 P2에서 0으로 모든 데이터 청크를 설정하는 것을 제외하고는 수행됩니다. 마찬가지로 P2에 대해 그룹 중복 청크 b1,2가 계산됩니다. 그룹 중복 청크는 해당 그룹의 데이터 청크만 영향을 받으며 다른 그룹의 데이터 청크만 영향을 받지 않습니다. 그룹 중복 청크는 각 그룹(예: b1,1 + b1,2 = b1)에 대한 삭제 코드에서 원래의 중복 청크의 프로젝션으로 해석될 수 있습니다. 따라서 이 방법에서는 하나의 데이터 청크가 실패하면 정상적인 삭제 코딩된 풀에 대해 8 대신 읽기 오버헤드를 사용하여 복구할 수 있습니다. 예를 들어, P1a3 이 실패하고 a1 이 스크럽을 담당하는 기본 OSD인 경우 a1,a2,a4b1,1 을 사용하여 P2 에서 읽는 대신 a3 을 복구할 수 있습니다. 모든 청크를 읽는 것은 동일한 그룹에서 두 개 이상의 청크가 누락된 경우에만 필요합니다.

이 Pyramid 코드는 원래의 agesure 코드와 동일한 쓰기 오버헤드를 갖습니다. 데이터 청크가 업데이트될 때마다 피라미드 코드는 3개의 중복 청크(b2, b3, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1, b1)를 업데이트해야 하며, 삭제 코드는 3개의 중복 청크(b1, b2 및 b3)도 업데이트해야 합니다. 또한 일반적인 삭제 코드와 동일한 3 개의 임의의 삭제 코드를 복구 할 수 있습니다. 앞서 언급한 것처럼 읽기 오버헤드가 유일한 이점은 추가 중복 청크를 사용하는 비용이 발생합니다. 따라서 Pyramid 코드는 액세스 효율성을 위해 스토리지 공간을 처리합니다.

아래 다이어그램은 생성된 pyramid 코드를 보여줍니다.

pyramid Erasure 코드

법적 공지

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.