재밌는 얘기는 1편에 다 몰아서 했고…
재미없는 얘기를 할 때가 왔다.
내부에서 어떤 작업을 하는지 모니터링 메트릭 위주로 살펴봄.
1. backfill
Backfill은 데이터 리밸런싱 작업으로, 내용 자체는 간단하다.
- 한 PG에 두개의 OSD를 할당했다고 했을 때, 산술적으로 50%씩 데이터를 가질 것이다.(replication은 제외하고)
- 해당 PG에 OSD를 하나 더 할당하면, 당연히 33%가 된다.
backfill은 이 작업을 칭하는데, OSD가 추가되고 삭제되는 등의 작업이 이루어질때 backfill을 수행하게 된다.
이거 자체는 뭐 어려운 부분은 아니지만, 백필 작업은 그 특성상 큰 부하를 일으킬 가능성이 높고 마찬가지로 여러 개의 PG가 동시에 백필 작업을 수행할 수 있다.
이를 ‘thundering herd’ 현상이라고 하는데(천둥 소리?) 이를 최소화하기 위한 설정도 존재는 한다(osd_max_backfills)
백필 작업은 ‘Asyncreserver’ 인스턴스를 통해 관리되는데, 각자의 인스턴스는 큐를 통해 데이터를 관리한다. asyncreserver는 remote_reserver, local_reserver 두가지를 한 OSD가 가지고 있고, local은 OSD의 데이터를 내보내고, remote는 받아오는 역할을 하게 됨.
두 reserver는 메시지로 관리되고
- MBackfillReserve
- Ack
- backfill
- BackfillComplete
- BackfillCompleteAck
의 순서대로 데이터를 서로 재분배한다.
백필을 수행할때 PG의 우선순위도 변경할 수 있는데(priority), 이건 자세히 보진 않았다. 대개 이런 옵션들은 잘 쓰는 부분은 아니라서…강제로 force-backfill 명령어 등을 사용해서 수행하게 할 수도 있는 듯.
2. Scrubbing
스크러빙은 fsck같은 무결성 확인 절차로, ‘복제본’을 사용 시에 해당 복제본이 적절한 데이터를 가지고 있는지 판별하는 역할을 한다.
스크러빙은 soft scrubbing, deep scrubbing으로 나뉘어지고, 각자의 비교 항목은 다음과 같음.
1) soft scrubbing
- 주기: 짧음(보통 매일)
- 검사 항목: 데이터 블록, 메타데이터
- 성능 이슈 : 적음
2) deep scrubbing
- 주기: 김(보통 매주)
- 검사 항목: 비트 체크섬
- 성능 이슈: 큼
(스크러빙은 정보가 너무 없다. 왤케 문서가 부실하지.)
스크러빙의 주체는 ‘PG’이다. 무결성을 확인할 때 복제본이라고 했으니 어느 정도 당연하기도 하다.
스크러빙을 할 때는 객체 단위로 수행을 하게 되며, 복제본에 락을 걸고 검증을 수행하므로 일관성에 대해서는 보장된다. 사실 ceph야 스토리지 시스템이라서 일반적으로 수정을 할 일이 많진 않아서 가능할듯.(수정하는 경우도 있긴 있다고 함)
스크러빙이 끝나고 나면, 문제가 있는 객체가 보고될 것이고 해당 상황에 따라서 조치하면 된다.
끝
- 사실 이것 외에도 피어링이나 업맵 등의 개념이 있지만 개인적으로 대충 감을 잡는 정도로만 알기도 하고, 도큐가 부실해서 찾기가 좀 힘든 것 같아서 이만 정리하려고 한다. Tiering 같은거는 S3에도 있는 기능이고.
- 사내에서도 ceph를 통해 데이터를 구성중인데 생각만큼 막 좋은 것은 아닌 것 같고 관리포인트도 이것저것 있어서 그렇게 막 엄청 편하다~ 이건 아닌듯.
- 나중에는 직접 구성해서 실습도 좀 해볼 생각이긴 한데, 장비가 없어서 잘 모르겠다.
- 대규모 스토리지를 복제본, 샤딩까지 다 가능하게 하면서 데이터를 저장할 수 있다는건(심지어 지원기능도 많고) 큰 메리트라, 많이 대세가 되어가지 않나 싶다.
Discover more from Coursity
Subscribe to get the latest posts sent to your email.