Multipath I/O pod linuxom cez device mapper

26.10.2007 13:01 | stanojr

Multipath I/O je technika ktora sa pouziva pri uloznych zariadeniach a zabezpecuje viac fyzickych ciest medzi uloznym zariadenim a pocitacom.
Inak povedane predstavte si diskove pole ktore ma 2 kontrolery a je pripojene na server ktory ma 2 radice.
Na serveri je nasledne vidiet 2x, ale chceme ho vidiet iba raz a samnotny system nech na pozadi automaticky prehodi spojenie z jedneho kontroleru na druhy v pripade ak sa na diskove pole neda dostat s toho ktory prave pouziva.
Ukazeme si ako to v linuxe rozbehat.

Konkretny hardware na ktorom som multipath rozbehaval je sunfire x4100 z distribuciou debian etch z kernelom 2.6.23 a diskove pole promise vtrak e310s
prepojene su pomocou SAS (serial attached scsi)
Nazorny obrazok:

na diskovom poli je vytvorene jedno velke LV (logical volume), na servery je vidiet ako normalny scsi disk sdX

ked este multipath nie je rozbehany, vyzera to takto
zobrazime si vsetky pripojene zariadenia ktore pouzivaju scsi

redneck:~# lsscsi
[0:0:0:0]    cd/dvd  AMI      Virtual CDROM    1.00  /dev/scd0
[1:0:0:0]    disk    AMI      Virtual Floppy  1.00  /dev/sdb
[2:0:0:0]    disk    Promise  VTrak E310s      0322  /dev/sda        <---- diskove pole
[3:0:0:0]    disk    Promise  VTrak E310s      0322  /dev/sdc        <---- diskove pole
[4:0:0:0]    disk    SEAGATE  ST973402SSUN72G  0400  -
[4:0:1:0]    disk    SEAGATE  ST973402SSUN72G  0400  -
[4:1:0:0]    disk    LSILOGIC Logical Volume  3000  /dev/sdd

na tom vyexportovanom "disku" z pola mame nahodene linuxove LVM
tu pekne vidime ze pouzije iba jedno pripojenie

redneck:~# pvs
  Found duplicate PV tS0KIb4H0CVGAspUqdWIkZSUVSwMlwib: using /dev/sdc
not /dev/sda
  PV        VG  Fmt  Attr PSize PFree
  /dev/sdc  vg0  lvm2 a-  2.32T 3.00G

teraz by som rad dodal, ze v linuxe su 2 implementacie multipathu, jeden cez md a druhy cez dm (device mapper)
ten cez dm je novsi, pouziva userspace programy multipath a multipathd z baliku multipath-tools
ten cez md som vobec neskusal, mal by sa dat vytvorit cez mdadm, ale ziadnu dokumentaciu som nikde nenasiel

nasledne co potrebujeme k rozbehaniu toho multipathu
staci nainstalovat multipath-tools
v debian etch je ale verzia 0.4.7 ktore mi nefungovala (zamrzalo komplet spojenie z polom), stiahol som teda z testing repozitarov poslednu verziu 0.4.8
a taktiez nejake zavislosti ako novsi dmsetup a libdevmapper

po instalacii sa rovno spustil multipathd, ten automaticky pri kazdej zmene (pridame disk/zobereme disk atd) prekonfiguruje cely multipath
taktiez kazdych X sekund kontroluje spojenie cez jednotlive kanaly a v pripade vypadku jedneho sa zacne pouzivat druhy

zatial nemame vytvoreny ziadny konfig, takze multipath sa automaticky nakonfiguroval nie ako failover ale multibus, to funguje tak ze pristupuje paralelne cez jeden aj druh radic, ale to nechceme, chceme failover
vytvorime teda /etc/multipath.conf

defaults {
        udev_dir        /dev
        polling_interval 5
        selector        "round-robin 0"
        path_grouping_policy    failover
        getuid_callout  "/lib/udev/scsi_id -g -u -s /block/%n"
        prio_callout    "/bin/true"
        path_checker    directio
        rr_min_io      100
        rr_weight      uniform
        failback        immediate
        no_path_retry  queue
        user_friendly_names no
}
blacklist {
        device {
                vendor SEAGATE
        }
        device {
                vendor LSILOGIC
        }
        device {
                vendor AMI
        }
}

v podstate skoro vsetko je na defaultnych hodnotach
okrem path_grouping_policy, to mame nastavene na failover, pouzije teda jedno spojenie a druhe si nechava
v blacklist povieme multipathd nech ignoruje lokalne disky a nejake virtualne zariadenia
taktiez polling_interval zabezpecuje ako casto sa bude kontrolovat spojenie ci zije, ale neviem preco pouzije sa defaultnych 20 sekund
ale to mi nevadi :)

nasledne restartneme cely server

po nabehnuti systemu voila, vsetko funguje
spustime multipathd -k
to nam da taky konzolovy pristup k beziacemu multipathd

multipathd> show paths
hcil    dev dev_t pri dm_st  chk_st  next_check
3:0:0:0 sdc 8:32  0  [active][ready] XXXXXXXXX. 19/20
2:0:0:0 sda 8:0  0  [active][ready] XXXXXXX... 14/20
multipathd> show maps
name              sysfs uuid
222330001558f8e27 dm-0  222330001558f8e27
multipathd> show topology
222330001558f8e27dm-0  Promise ,VTrak E310s
[size=2.3T][features=1 queue_if_no_path][hwhandler=0        ]
\_ round-robin 0 [prio=0][active]
\_ 3:0:0:0 sdc 8:32  [active][ready]
\_ round-robin 0 [prio=0][enabled]
\_ 2:0:0:0 sda 8:0  [active][ready]

LVM automaticky prestane pouzivat jednotlive pripojenia k diskovemu pou a pouzije vytvoreny multipath device

multipathd> redneck:~# pvs
  PV        VG  Fmt  Attr PSize PFree
  /dev/dm-0  vg0  lvm2 a-  2.32T 3.00G

teraz si otestujeme ci prezije vypadok
cez multipathd -k a prikaz show paths sledujem ako to vyzera, na diskovom poli restartnem jeden z kontrolerov, ktory sa akurat pouziva

multipathd> show topology
reload: 222330001558f8e27dm-0  Promise ,VTrak E310s
[size=2.3T][features=1 queue_if_no_path][hwhandler=0        ]
\_ round-robin 0 [prio=0][active]                  <------- ten co je active pouziva
\_ 2:0:1:0 sda 8:0  [active][ready]
\_ round-robin 0 [prio=0][enabled]
\_ 3:0:2:0 sdc 8:32  [active][ready]
multipathd> show topology
reload: 222330001558f8e27dm-0  Promise ,VTrak E310s
[size=2.3T][features=1 queue_if_no_path][hwhandler=0        ]
\_ round-robin 0 [prio=0][enabled]
\_ 2:0:1:0 sda 8:0  [failed][faulty]            <------- padol
\_ round-robin 0 [prio=0][active]
\_ 3:0:2:0 sdc 8:32  [active][ready]
multipathd> show topology
reload: 222330001558f8e27dm-0  Promise ,VTrak E310s
[size=2.3T][features=0      ][hwhandler=0        ]
\_ round-robin 0 [prio=0][enabled]
\_ 3:0:2:0 sdc 8:32  [active][ready]            <------- zacal pouzivat druhy

ked nabehne spojenie s tym povodnym radicom, tak sa automaticky prida, ale nemam z testovania cut&pastnute

pred restartom toho kontroleru som spustil find na suborove systemy a monitoroval cez dstat -D sda,sdc pristup na jednotlive spojenia z diskovym polom
vyzeralo to takto:

----total-cpu-usage---- --dsk/sda-----dsk/sdc--
usr sys idl wai hiq siq|_read _writ:_read _writ
  0  0  99  0  0  0|  0    0 : 848k    0
  0  0 100  0  0  0|  0    0 : 660k    0
  0  0 100  0  0  0|  0    0 : 832k    0
  0  0 100  0  0  0|  0    0 : 752k    0
  0  0 100  0  0  0|  0    0 : 716k    0
  0  0 100  0  0  0|  0    0 : 672k    0
  0  0 100  0  0  0|  0    0 : 736k    0
  0  0  99  0  0  0|  0    0 : 696k    0
  0  1  99  0  0  0|  0    0 : 904k    0
  0  0 100  0  0  0|  0    0 : 696k    0
  0  0 100  0  0  0|4096B    0 : 748k    0
  0  0 100  0  0  0|  0    0 : 440k    0
  0  0 100  0  0  0|  0    0 :  0    0
  0  0 100  0  0  0|  0    0 :  0    0
  0  0 100  0  0  0|  0    0 :  0    0
  0  0  99  1  0  0|  0    0 :  0    0
  0  0 100  0  0  0|  0    0 :4096B    0
  0  0 100  0  0  0|  0    0 :  0    0
  0  0  82  18  0  0|  0    0 :  -    0
  0  0  75  25  0  0|  0    0 :  0    0
----total-cpu-usage---- --dsk/sda-----dsk/sdc--
usr sys idl wai hiq siq|_read _writ:_read _writ
  0  0  75  25  0  0|  0    0 :  0    0
  0  0  75  25  0  0|  0    0 :  0    0
  0  0  88  11  0  0| 308k    0 :  0    0
  0  1  99  0  0  0| 812k    0 :  0    0
  0  0 100  0  0  0|1224k    0 :  0    0
  1  1  98  0  0  0|2720k    0 :  0    0
  0  0 100  0  0  0| 852k    0 :  0    0
  0  0  99  0  0  0| 852k    0 :  0    0
  0  1  99  0  0  0| 772k    0 :  0    0
  0  0 100  0  0  0| 648k    0 :  0    0
  0  0 100  0  0  0| 648k    0 :  0    0

pekne vidime ako pouzival najskor sdc, po vypadnuti nam na chvilu zamrzol a za niekolko sekund ho prehodil na sda

(ak ste si vsimli ze vo vypise z dstat vypadlo sdc a zacalo sa pouzivat sda a v tom vyssom vypise z multipathd -k je to opacne, tak to je z dovodu ze mam cut&paste z viacerych testov a nechcelo sa mi to falsovat aby to sedelo)

to je vsetko co som chcel napisat

    • Re: Multipath I/O pod linuxom cez device mapper 26.10.2007 | 21:45
      Avatar blackhole   Návštevník

      dobry clanok :-}

    • Re: Multipath I/O pod linuxom cez device mapper 27.10.2007 | 18:16
      Avatar blackhole   Návštevník

      Pekne, v linuxe som sa s multipath este nehral.
      Na HP-UX takyto failover multipath podporuje samotne LVM, proste ked najde "duplicitne" PV tak si to zariadenie prida ako alternate path k tomu prvemu. V konfiguracii si aj pamata ktore je "primarne" a teda vies mat kopu diskov a na polku z nich pristupovat cez 1 radic a na druhu cez druhy radic. Takze pokial funguju oba, tak mas 2nasobny performance. Ked jeden vypadne, zacne ist vsetko len cez jeden (co nemusi stihat), takze rychlost klesne, ale vsetky data su stale pristupne. Vyzera to asi takto:

      [ROOT sgpux048]home/mareksu # pvdisplay /dev/dsk/c17t10d0
      --- Physical volumes ---
      PV Name /dev/dsk/c17t10d0
      PV Name /dev/dsk/c5t10d0 Alternate Link
      VG Name /dev/vg02
      PV Status available
      Allocatable yes
      VGDA 2
      Cur LV 9
      PE Size (Mbytes) 4
      Total PE 4340
      Free PE 0
      Allocated PE 4340
      Stale PE 0
      IO Timeout (Seconds) default
      Autoswitch On

      Load balancing cez viac ciest LVM nevie, ale je na to specialny soft. Vacsinou sa ale z diskovych poli exportuje viac virtualnych diskov a na nich sa robi LVM, takze nie je problem kazdemu z nich dat inu cestu ako primarnu. Samozrejme to neriesi ze kazdy z nich moze byt inac zatazeny a teda je tazke odhadnut ktore dat spolu cez jednu cestu...