Macierze RAID w OpenWrt

sobota, 19 marca 2011 14:04 | Cezary Jackiewicz
Drukuj

Co to jest RAID, jakie s? jego typy i na czym to polega doskonale opisane jest w wikipedii: http://pl.wikipedia.org/wiki/RAID.

W OpenWrt jak w ka?dym systemie linuksowym mamy mo?liwo?? utworzenia macierzy programowej. Ma ona jedn? mia?d??c? przewag? - w przypadku awarii sprz?tu nie musimy szuka? identycznego (sprz?towo kontrolery RAID bardzo rzadko s? kompatybilne ze sob?), wystarczy tylko dowolny linux ?eby móc odtworzy? macierz. Rodzi si? pytanie: do czego mo?na wykorzysta? to w OpenWrt? Chocia? by do stworzenia jednolitej ci?g?ej przestrzeni z kilku no?ników lub zapewnienia ochrony przechowywanych danych. Nale?y nadmieni?, ?e w popularnych urz?dzeniach NAS typu Synology czy QNAP tworzona macierz te? jest programowa.

Do testów wykorzystano TP-Linka TL-WR1043ND z hubem USB, do którego zosta?y do??czone dwa czytniki z kartami microSD - po 1GB pojemno?ci ka?dy, jedna karta produkcji Samsunga, druga PQI. Testy wydajno?ci przeprowadzono przy pomocy programu hdparm - zwyk?y odczyt bez cache. Poradnik ma na celu zobrazowanie sposobu tworzenia macierzy; interfejsy USB w routerach nie pozwalaj? jeszcze na wykonywanie gigantycznych transferów, wi?c konkretne wyniki mog? si? ró?ni? w zale?no?ci od zastosowanego routera i no?ników. Nale?y równie? pami?ta? ?e s? to wyniki tylko odczytu z dysku - w praktyce dochodz? jeszcze narzuty zwi?zane z obci??eniem CPU, obs?ug? systemu plików i samej magistrali USB.

Oto wyniki wydajno?ci w testowanym ?rodowisku.

root@OpenWrt:~# hdparm -t /dev/sda /dev/sdb

/dev/sda:
Timing buffered disk reads:   46 MB in  3.03 seconds =  15.19 MB/sec

/dev/sdb:
Timing buffered disk reads:   40 MB in  3.02 seconds =  13.25 MB/sec

Jedna karta pozwala?a na odczyt na poziomie 15MB/s, druga niewiele ponad 13MB/s.

Przed wykonaniem operacji nale?y upewni? si? ?e no?niki s? odmontowane:

root@OpenWrt:~# umount /dev/sda1
root@OpenWrt:~# umount /dev/sdb1

Do tworzenia i obs?ugi macierzy niezb?dny jest program mdadm oraz odpowiednie modu?y z kernela. Dost?pne s? one m.in. w moim (obsy, eko.one.pl) repozytorium.

root@OpenWrt:~t# opkg update
root@OpenWrt:~t# opkg install kmod-md-mod kmod-md-raid0 kmod-md-raid1 mdadm

RAID0, czyli ??czenie przestrzeni no?ników.

1. Tworzymy now? macierz z?o?on? z dwóch partycji:

root@OpenWrt:~# mdadm --create --level=0 --raid-devices=2 /dev/md0 /dev/sda1 /dev/sdb1
mdadm: /dev/sda1 appears to contain an ext2fs file system
size=994688K  mtime=Thu Jan  1 01:00:29 1970
mdadm: /dev/sdb1 appears to contain an ext2fs file system
size=991104K  mtime=Thu Jan  1 01:00:29 1970
Continue creating array? y
mdadm: array /dev/md0 started.

Po tej operacji powsta?o urz?dzenie /dev/md0, które jest w?a?nie oczekiwan? macierz?. W logach mo?e pojawi? si? odpowiednia informacja:

Jan  1 01:05:00 OpenWrt user.info kernel: md: bind
Jan  1 01:05:00 OpenWrt user.info kernel: md: bind
Jan  1 01:05:00 OpenWrt user.info kernel: raid0: looking at sdb1
Jan  1 01:05:00 OpenWrt user.info kernel: raid0:   comparing sdb1(1982080)
Jan  1 01:05:00 OpenWrt user.info kernel:  with sdb1(1982080)
Jan  1 01:05:00 OpenWrt user.info kernel: raid0:   END
Jan  1 01:05:00 OpenWrt user.info kernel: raid0:   ==> UNIQUE
Jan  1 01:05:00 OpenWrt user.info kernel: raid0: 1 zones
Jan  1 01:05:00 OpenWrt user.info kernel: raid0: looking at sda1
Jan  1 01:05:00 OpenWrt user.info kernel: raid0:   comparing sda1(1989248)
Jan  1 01:05:00 OpenWrt user.info kernel:  with sdb1(1982080)
Jan  1 01:05:00 OpenWrt user.info kernel: raid0:   NOT EQUAL
Jan  1 01:05:00 OpenWrt user.info kernel: raid0:   comparing sda1(1989248)
Jan  1 01:05:00 OpenWrt user.info kernel:  with sda1(1989248)
Jan  1 01:05:00 OpenWrt user.info kernel: raid0:   END
Jan  1 01:05:00 OpenWrt user.info kernel: raid0:   ==> UNIQUE
Jan  1 01:05:00 OpenWrt user.info kernel: raid0: 2 zones
Jan  1 01:05:00 OpenWrt user.info kernel: raid0: FINAL 2 zones
Jan  1 01:05:00 OpenWrt user.info kernel: raid0: zone 1
Jan  1 01:05:00 OpenWrt user.info kernel: raid0: checking sda1 ...
Jan  1 01:05:00 OpenWrt user.info kernel:  contained as device 0
Jan  1 01:05:00 OpenWrt user.info kernel:   (1989248) is smallest!.
Jan  1 01:05:00 OpenWrt user.info kernel: raid0: checking sdb1 ...
Jan  1 01:05:00 OpenWrt user.info kernel:  nope.
Jan  1 01:05:00 OpenWrt user.info kernel: raid0: zone->nb_dev: 1, sectors: 7168
Jan  1 01:05:00 OpenWrt user.info kernel: raid0: current zone start: 1989248
Jan  1 01:05:00 OpenWrt user.info kernel: raid0: done.
Jan  1 01:05:00 OpenWrt user.info kernel: raid0 : md_size is 3971328 sectors.
Jan  1 01:05:00 OpenWrt user.info kernel: ******* md0 configuration *********
Jan  1 01:05:00 OpenWrt user.info kernel: zone0=[sda1/sdb1/]
Jan  1 01:05:00 OpenWrt user.info kernel:         zone offset=0kb device offset=0kb size=1982080kb
Jan  1 01:05:00 OpenWrt user.info kernel: zone1=[sda1/]
Jan  1 01:05:00 OpenWrt user.info kernel:         zone offset=1982080kb device offset=991040kb size=3584kb
Jan  1 01:05:00 OpenWrt user.info kernel: **********************************
Jan  1 01:05:00 OpenWrt user.info kernel: md0: detected capacity change from 0 to 2033319936

2. Tworzymy system plików

W tym przypadku by? to ext2.

root@OpenWrt:~# mke2fs -m0 /dev/md0
mke2fs 1.41.11 (14-Mar-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
124160 inodes, 496416 blocks
0 blocks (0.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=511705088
16 block groups
32768 blocks per group, 32768 fragments per group
7760 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912

Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

3. Montowanie

Macierz mo?na zamontowa? ju? normalnie jak ka?dy inny system pliów:

root@OpenWrt:/# mkdir -p /mnt/raid0
root@OpenWrt:/# mount -t ext2 /dev/md0 /mnt/raid0
root@OpenWrt:/# df -h
...
/dev/md0                  1.9G      2.9M      1.9G   0% /mnt/raid0

Jak wida? powierzchnie zosta?y z??czone, i jest to suma no?ników wchodz?cych w sk?ad macierzy (poniewa? by?y takiej samej pojemno?ci). Sprawdzamy wydajno??:

root@OpenWrt:~# hdparm -t /dev/md0

/dev/md0:
Timing buffered disk reads:   76 MB in  3.07 seconds =  24.79 MB/sec

Czyli o wiele wi?cej ni? pojedynczego no?nika. Mo?na jeszcze odczyta? stan macierzy z pliku /proc/mdstat

root@OpenWrt:~# cat /proc/mdstat
Personalities : [raid0] [raid1]
md0 : active raid0 sdb1[1] sda1[0]
1985664 blocks 64k chunks

unused devices:

Po restarcie systemu macierz nale?y ponownie "uruchomi?". Mo?na to wykona? poleceniem:

mdadm --assemble /dev/md0 --run /dev/sda1 /dev/sdb1

Które mo?na doda? np. do /etc/rc.local ?eby wykona?o si? przy starcie systemu.

RAID1 - czyli zdupliowanie zapisu na wiele no?ników

Zasada jest podobna - nale?y utworzy? macierz odpowiedniego typu, utworzy? system plików i go zamontowa?

root@OpenWrt:/#  mdadm --create --level=1 --raid-devices=2 /dev/md0 /dev/sda1 /dev/sdb1
mdadm: /dev/sda1 appears to contain an ext2fs file system
size=1985664K  mtime=Thu Jan  1 01:00:00 1970
mdadm: /dev/sda1 appears to be part of a raid array:
level=raid0 devices=2 ctime=Thu Jan  1 01:05:00 1970
mdadm: /dev/sdb1 appears to be part of a raid array:
level=raid0 devices=2 ctime=Thu Jan  1 01:05:00 1970
Continue creating array? y
mdadm: array /dev/md0 started.

root@OpenWrt:/# mke2fs -m0 /dev/md0
mke2fs 1.41.11 (14-Mar-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
61952 inodes, 247760 blocks
0 blocks (0.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=255852544
8 block groups
32768 blocks per group, 32768 fragments per group
7744 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

root@OpenWrt:/# mkdir -p /mnt/raid1
root@OpenWrt:/# mount -t ext2 /dev/md0 /mnt/raid1

root@OpenWrt:/# df -h
...
/dev/md0                952.6M      1.2M    951.4M   0% /mnt/raid1

Testy wydajno?ci:

root@OpenWrt:/# hdparm -t /dev/md0

/dev/md0:
Timing buffered disk reads:   36 MB in  3.13 seconds =  11.52 MB/sec

Jak wida? wypadkowa szybko?? jest mniejsza nawet od najwolniejszego no?nika. Ale dzi?ki temu mamy jednoczesne przechowywanie danych na ró?nych no?nikach.

 
Share