이번 기사에서는 어떻게 이것을 이용해 RAID 를 구현하는가에 대해서알아본다.
단일 파일시스템이 여러개의 물리적 디바이스에 걸쳐 분산되어져야 하는 이유는,
수용량의 증가와 더 큰 신뢰도 이 두가지 이유에 기반된다.
몇몇 설정에서, Throughput 은 두번째 고려사양이라 하더라도,
RAID 를 통해 명확한 워크로드 타잎별로 향상된 throughput 을 제공할 수 있다.
RAID array 는 level 이라고 분류되는 몇가지 설정들이 있으며,
각 파라메터들 사이엔 각각 다양한 부분을 균형적으로 제공한다.
Btrfs 는 모든 RAID 레벨을 지원하지 않으나, 가장 많이들 사용하는 RAID 레벨을 지원하고있다.
RAID 0 (Striping), RAID 1 (mirroring), RAID 10, RAID 5, RAID 6 를 지원하며,
RAID 2, RAID 3, RAID 4 는 지원되지 않는다.
Btrfs 에서 지원되는 RAID 레벨의 주목받을 가치는 메타데이타에 대한 부분인데,
한개의 file data 의 손실이 발생할 동안, 전체 파일시스템의 메타데이타가 손실 될 수 있고,
쉽고 간단하게 처리되지 못한다면, 이것은 대단히 바람직하지 못한 상황을 불러일으키게 되므로,
이 부분에 대한 처리가 매우 중요하다.
Btrfs 는 비록 드라이브 한개만 사용하더라도, 일반적으로 메타데이타를 중복해서 저장한다.
게다가, 관리자가 임의로 어떤 데이타와 메타데이타가 어떻게 어떤 device 에
저장할지
또는 데이터와 메타데이타의 저장방식을 따로 설정 할 수도 있다는 장접이 있다.
즉, 예를들어, RAID5 에 메타데이타는 저장하고, RAID 0 Array 에 데이타를
striped 시키는 설정도 한 파일시스템에서 가능 하다는 것이다.
또한, 이 모든설정을 운영중에 가능하다.
A striping example
앞에 기사에서 mkfs.btrfs 를 이용해 간단하게 filesystem 을 만들어 보았는데,
이 과정에서 raid array level 등을 설정할 수 있다.
mkfs.btrfs -d mode -m mode dev1 dev2 ...
-d 옵션은 지정된 array 에 데이타를 어떻게 저장할지 설정한다. (Raid level)
이 옵션은 single, RAID0, RAID1, RAID10, RAID5, RAID6 가 설정 가능하다.
-m 옵션은 메타데이타에 대한 저장을 어떻게 저장할지 설정하는 옵션이고,
마찬가지로 동일한 레이드 레벨을 지원한다.
추가적으로 -d 와 동일하게 지정 할 수 있고, 중복된 저장도 가능하고, 꼭 같을 필요도 없다.
아래는 RAID0 로 두개의 Device 를 stripe 하는 명령이다 :
mkfs.btrfs -d raid0 /dev/sdb1 /dev/sdc1
자, 여기서는 메타데이타의 저장은 기본적으로 중복되게끔 설정했다.
"df" 명령은 array 중 첫번째 device 만 표시된다 :
# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 274G 30G 241G 11% /mnt
btrfs 커맨드는 더 상세한 상태를 보여준다.
root@dt:~# btrfs filesystem show /mnt
Label: none uuid: 4714fca3-bfcb-4130-ad2f-f560f2e12f8e
Total devices 2 FS bytes used 27.75GiB
devid 1 size 136.72GiB used 17.03GiB path /dev/sdb1
devid 2 size 136.72GiB used 17.01GiB path /dev/sdc1
여기에 17 GiB 정도의 각각 사용량이 나타나는 것은 메타데이타가 저장되어지는 부분이다.
그냥 df 커맨드 보다 btrfs 를 이용하는 것이 더 상세하게 보여짐을 알 수 있다.
Device addition and removal
Device 를 추가하는 것은 더욱 더 간단하다. 다운타운 없이 바로 가능하다. :
# btrfs device add /dev/sdd1 /mnt
# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 411G 30G 361G 8% /mnt
# btrfs filesystem show /mnt
Label: none uuid: 4714fca3-bfcb-4130-ad2f-f560f2e12f8e
Total devices 3 FS bytes used 27.75GiB
devid 1 size 136.72GiB used 17.03GiB path /dev/sdb1
devid 2 size 136.72GiB used 17.01GiB path /dev/sdc1
devid 3 size 136.72GiB used 0.00 path /dev/sdd1
파일시스템을 확장하면 추가된 device 는 사용량이 0으로 나오게 된다.
이를 위해서는 balancing 이 필요한데,
다음과 같은 명령으로 간단하게 rebalancing 이 가능하다 :
# btrfs balance start -d -m /mnt
Done, had to relocate 23 out of 23 chunks
위 메시지는 23개의 chunk 를 relocate 했다는 메시지이다.
Balancing 는 data 의 크기나 양에 따라 완료되는 시간이 다소 필요 할 수 있으며,
이 작업중에는 파일시스템에 접근할때 약간 느려지는 것이 발생 할 수 있다.
해당 작업을 수행중 subcommands 로 pause, resume 또는 cancle 이 제공되며,
이를 이용하여 relocate 를 중단, 재개, 취소 할 수 있다.
# btrfs filesystem show /mnt
Label: none uuid: 4714fca3-bfcb-4130-ad2f-f560f2e12f8e
Total devices 3 FS bytes used 27.78GiB
devid 1 size 136.72GiB used 10.03GiB path /dev/sdb1
devid 2 size 136.72GiB used 10.03GiB path /dev/sdc1
devid 3 size 136.72GiB used 11.00GiB path /dev/sdd1
Device 를 제거하는 것도 간단하다 :
# btrfs device delete /dev/sdb1 /mnt
실제로 물리적인 디바이스의 제거가 이루어 지기 전에, 데이타가 있을 경우,
그 데이타를 다른 device 들로 relocate 하는 작업이 내부적으로 발생하기 때문에,
삭제에는 시간이 걸릴 수 있으며, balance 커맨드와는 달리 중단하거나 재개할 수 없다.
두말할 나위 없이, 이 과정을 실패할 가능성도 있고, 데이타를 유지할 만한 공간이 없을 경우, 문제가 발생 할 수 있다.
이것은 일반적인 물리적 RAID 와 동일한 동작을 하기 때문에,
primary 드라이브는 반드시 남아있는 상태여야만 한다.
Other RAID levels
다른 레이드 레벨을 설정하는 것 역시 앞서 본 RAID 0 에 대한 설정과 같다. :
mkfs.btrfs -d raid1 -m raid1 /dev/sdb1 /dev/sdc1
위 설정에서는 metadata 와 data 모두 raid 1 방식으로 저장하겠다고 하는 것이며,
반드시 두개의 드라이브가 요구된다.
# du -sh /mnt
28G /mnt
# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 280G 56G 215G 21% /mnt
여기에서 du 와 df 는사용량의 차이가 있어 혼동이 발생 할 수 있는데,
이는, du 의 경우 실제저장된 데이타를 나타내는 부분이기 때문에,
블럭 자체를 계산하는 df 와는 다를 수 있다는 점이며,
정확한 값을 보기 위해서는 다음 명령으로 확인해야 한다.
# btrfs filesystem show /mnt
Label: none uuid: e7e9d7bd-5151-45ab-96c9-e748e2c3ee3b
Total devices 2 FS bytes used 27.76GiB
devid 1 size 136.72GiB used 30.03GiB path /dev/sdb1
devid 2 size 142.31GiB used 30.01GiB path /dev/sdc1
RAID 10 array 는 다수의 device 를 필요로 하며, 최소 4개 의 drive 가 필요하다.
RAID 5, 6 모두 물리적인 RAID 의 구성조건이 동일하기 때문에 이부분을 주의 할 필요가 있다.
Conversion and recovery
3개의 device 를 RAID 0 으로 사용한다고 가정 하였을때 :
# mkfs.btrfs -d raid0 -m raid0 /dev/sdb1 /dev/sdc1 /dev/sdd1
# mount /dev/sdb1 /mnt
# cp -r /random-data /mnt
# btrfs filesystem show /mnt
Label: none uuid: 6ca4e92a-566b-486c-a3ce-943700684bea
Total devices 3 FS bytes used 6.57GiB
devid 1 size 136.72GiB used 4.02GiB path /dev/sdb1
devid 2 size 136.72GiB used 4.00GiB path /dev/sdc1
devid 3 size 136.72GiB used 4.00GiB path /dev/sdd1
이렇게 사용할 수 있고, 위와 같을 경우, Disk 장애방지 관점에서,
시스템 관리자는 redundancy 를 위해 RAID 5 로 전향하는 것을 고려 할 수 있다.
보통은 이렇게 하려면 전체 데이타를 백업 후, RAID5 로 재생성하여,
데이타를 다시 복구해야 할 것이다.
하지만, Btrfs 를 사용한 레이드는 운영중에 자동적으로 변환이 가능하다 :
# btrfs balance start -dconvert=raid5 -mconvert=raid5 /mnt
보다시피, balance 커맨드를 이용하여, data 와 metadata 를 raid 5 방식으로
다시 수정할 수 있으며, 중단 없이 바로 RAID 5 로 변경이 가능하다.
물론, checksum 과 relocate 에 걸리는 시간동안, 파일시스템의 access 는 느려질 수 있다.
# btrfs filesystem show /mnt
Label: none uuid: 6ca4e92a-566b-486c-a3ce-943700684bea
Total devices 3 FS bytes used 9.32GiB
devid 1 size 136.72GiB used 7.06GiB path /dev/sdb1
devid 2 size 136.72GiB used 7.06GiB path /dev/sdc1
devid 3 size 136.72GiB used 7.06GiB path /dev/sdd1
Parity block 의 수만큼 총 공간에 대한 사용량은 증가되었다.
물론, RAID 5 라는 메시지등을 나타내 주지는 않고,
redundant 설정이 디스크 장애 예방을 보장해 줄 수는 없지만,
최소한의 장애 대응 계획으로, 데이타의 안전한 유지를 보장해 줄 수 있다.
Device 의 replace 는 아래와 같다 :
btrfs replace start /dev/sdc1 /dev/sde1 /mnt
위 명령은 취소는 가능하지만 중단은 불가능하며,
명령이 완료되는 즉시 sdc1 은 사용이 불가능해 진다.
만약 replace 등이 실패하게 되거나, disk 가 failed 되는 경우,
다음과 같이 해당 filesystem 을 degraded 모드로 마운트 하여 제거 가능하다.
mount -o degraded {btrfs}
btrfs device delete missing /mnt
missing subfilter 는 실제 device 가 아닌,
해당 array 에서 사용이 불가능한 drive 를 뜻하는 것이고,
교체가능한 device 를 추가 하여, balance 작업을 수행해야 한다.
Conclusion
multiple device 기능은 일찍부터 Btrfs 의 한 부분으로 디자인 되었고,
이 코드는 mainline에서 가장 많은 부분을 차지하고, 안정성에 많은 시간을 필요로 했다.
RAID 5 와 RAID6 에 대한 지원을 하게 된 것이 가장 큰 이례적 사건이며, 이것은 3.9 에 병합되었다.
이 기능들은 사실, 기능적으로 아직까지 큰 문제를 보이고 있지는 않지만,
실 사용자들이 많이 없는 Btrfs 의 특성을 고려해 보았을때, 주의가 필요하긴 하다.
내장 RAID 기능은 Btrfs 기능의 키 포인트이긴 하지만, 여기에 멈추지 않고,
지속적인 지원목록 개발을 해 나아가야 한다.
Btrfs 의 또 다른 중요한 측면은 서브 볼륨 및 스냅 샷에 대한 지원이며,
다음 기사에서 논의 될 것이라고 Corbet 은 3번째 Btrfs 에 대한 기사를 마무리 지었다.