Data Distribution with CRUSH

골덕·2024년 11월 26일
  • Data Distribution
    • 불균형 또는 부하 비대칭을 방지하기 위해
      • 예: 새로 배치된 장치가 대부분 유휴 상태이거나 비어 있는 경우, 새로운 장치에만 집중적으로 핫 데이터가 저장되는 경우
    • 새로운 데이터를 무작위로 분산, 기존 데이터의 무작위 샘플을 새 장치로 이동, 제거된 장치의 데이터를 균등하게 재분배하는 전략을 채택(CRUSH)
    • 먼저, ceph는 hash function(+ adjustable bit mask)을 이용해 object를 특정 수의 placement groups(PGs)로 매핑
    • OSD별로 약 100개의 PG를 할당하여 OSD 사용률의 편차를 균형 있게 조정하고, 각 OSD가 유지해야 하는 replication 관련 메타데이터의 양을 관리.
  • CRUSH(Controlled Replication Under Scalable Hashing)

    • pseudo-random data distribution function

    • CRUSH를 통해 각 PG를 정렬된 OSD 리스트(Primary & Replicas)에 매핑

    • 기존 파일 시스템이나 다른 오브젝트 기반 파일 시스템처럼 블록이나 오브젝트 목록(metadata)에 의존하지 않음

    • 오브젝트를 찾기 위해 CRUSH는 Placement Group(PG)과 OSD 클러스터 맵만 필요합니다.

      • 완전히 분산된 구조로, 클라이언트, OSD, 또는 MDS가 독립적으로 모든 오브젝트의 위치를 계산할 수 있음.
      • 클러스터 맵이 드물게 업데이트되므로, 분배 관련 메타데이터 교환이 거의 필요 없음.
    • CRUSH는 데이터 분배 문제("데이터를 어디에 저장해야 하는가")와 데이터 위치 문제("데이터를 어디에 저장했는가")를 동시에 해결

    • 설계상, 스토리지 클러스터에 작은 변경(장치 장애나 클러스터 확장 등)이 발생하더라도 기존 PG 매핑에 미치는 영향을 최소화하여 데이터 마이그레이션을 줄임.

  • cluster map hierarchy

    • OSD (Object Storage Daemon): 데이터를 저장하는 개별 디스크.
    • Shelf: 여러 OSD를 포함하는 선반.
    • Rack: 여러 선반으로 구성된 랙.
    • Row: 여러 랙이 포함된 데이터 센터의 행.
  • 이러한 계층은 장애 구역(failure domain)을 정의하여, 장애가 발생했을 때 영향을 최소화할 수 있도록 설계.

  • 각 OSD는 가중치 값(weight)을 가지고 있어, OSD에 할당되는 데이터 양을 제어.

  • CRUSH는 Placement Rule에 따라 PG를 OSD에 매핑하며, 이 규칙은 Replication 수준과 배치 제한(constraints on placement)을 정의.

    • Placement Rule의 예시:
      • 데이터 복제본(3개)은 동일한 행(row)에 배치하지만,
      • 각 복제본은 서로 다른 캐비닛(cabinet)에 배치하여 특정 장애(전원 문제나 네트워크 스위치 문제)를 방지.
  • cluster map 동기화

    • cluster map은 down 또는 inactive device 리스트와 함께 맵이 업데이트 될때마다 증가하는 epoch number도 포함되어 있음
    • 클라이언트는 OSD에 요청을 보낼 때, 자신이 현재 알고 있는 클러스터 맵의 에포크(epoch) 번호를 함께 전달해 OSD가 해당 맵이 최신 상태인지 확인.
      • 클라이언트의 맵이 최신이면 요청을 그대로 처리.
      • 클라이언트의 맵이 오래된 경우, OSD가 응답 메시지에 최신 맵의 증분 업데이트를 함께 포함시켜 piggy back으로 클라이언트를 업데이트.
    • 맵이 변경되면, 협업하는 OSD 간(cooperating OSDs)에 맵 증분 업데이트(Incremental map updates)가 공유.
      • 클러스터 맵 전체를 다시 전송하는 대신, 변경된 부분만 piggy back으로 전송.
      • 뒤에서 또 설명
profile
다시 시작하는 개발자

0개의 댓글