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 에 있습니다.

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