Cluster na Linuxu: vysoce dostupný web pomocí httpd

5. 10. 2017
Doba čtení: 18 minut

Sdílet

Základ clusteru máme postavený, běží nám i úložiště. Těšíte se, až váš cluster bude reálně poskytovat nějakou službu? V tomto díle si ukážeme, jak nakonfigurovat vysoce dostupný web pomocí httpd.

Aktivní-aktivní, nebo aktivní-pasivní cluster?

Návrh clusteru by měl odpovědět na otázku, jestli mají všechny jeho nody přistupovat k datům simultánně (active-active cluster), nebo budou data v danou chvíli dostupná jen jednomu z nodů (active-passive). Zpravidla to bude záviset na aplikaci/aplikacích, které v clusteru chcete provozovat. Pokud je vaše aplikace schopná běžet na více strojích současně, pravděpodobně zvolíte aktivní-aktivní přístup (s tím, že aplikace musí počítat s možností výpadku nodu, např. z důvodu fencingu). Pokud plánujete cluster využívat hlavně jako rychlé zotavení v případě výpadku nodu/nodů, kde aplikace běží, sáhnete nejspíše po aktivním-pasivním clusteru.

Přístup k datům v clusteru se na distribucích odvozených od Fedory a RHEL řeší pomocí LVM. Veškerá sdílená data by měla být na svazcích LVM, protože právě to poskytuje clusteru potřebné prostředky pro správu přístupu k datům. U aktivního-aktivního clusteru budeme chtít, aby LV byly aktivovány na všech nodech současně. To zajistí CLVM, clustered LVM, jakási nadstavba nad běžné LVM. Pro aktivní-pasivní cluster bude stačit LVM dostupné při instalaci systému. V aktivním-pasivním clusteru je každé z LV, na kterém jsou uložena sdílená data, aktivováno vždy jen na jednom nodu, a to díky tzv. taggingu a exclusive módu.

Pokud jde o filesystémy, pro aktivní-aktivní cluster je potřeba použít takový, který umožňuje čtení a zápis z více nodů najednou. Jedním z nich je GFS2. Ve failover clusteru, tj. aktivním-pasivním, lze použít minimálně ext3, ext4 a XFS. Tyto nemají možnost zápisu z více nodů, a proto u nich nepoužijeme CLVM. Naopak nutné je CLVM při použití GFS2.

Máme sdílené úložiště. Jak ho použít?

Z předchozího dílu byste měli mít připravené úložiště pomocí iSCSI a multipath. To znamená, že na úrovni úložiště mají na LUNy přístup oba nody zároveň. Aby mohla o přístupu na LUNy rozhodovat logika clusteru, bude potřeba zahrnout je do LVM, a to buď CLVM, nebo běžného LVM – viz výše. V tomto díle do clusteru přidáme web server, který bude obsluhovat httpd. To samo o sobě není schopno běžet v aktivním-aktivním módu; proto nakonfigurujeme úložiště jako aktivní-pasivní. V některém z příštích dílů se podíváme na aktivní-aktivní přístup k datům pomocí GFS2.

V tomto díle chceme docílit funkčního webserveru na aktivním-pasivním přístupu na data. Filesystém GFS2 tedy nepoužijeme a data uložíme na jeden z FS, umožňujících přístup jen z jednoho nodu, např. moderní XFS. Protože je v Linuxu zvykem oddělovat konfigurační soubory od dat, budeme se tohoto zvyku držet i v našem clusteru a vytvoříme ve sdílené VG jeden menší LV pro konfigurační soubory webserveru a druhý LV pro samotná data webové aplikace.

Příprava LVM a filesystémů pro použití v clusteru

Na jednom z nodů, např. nodu 1, vytvoříme VG z LUNu exportovaného přes iSCSI. Nejdříve se podíváme, jak se jmenuje mapa, mpath, pod kterou jsou všechny dostupné cesty, paths, k danému LUNu.

[root@f25a ~]# multipath -ll
mpatha (36001405b2ca0e79775f4ef3bf59803e8) dm-1 LIO-ORG ,cluster1lun1
size=1.0G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 3:0:0:1 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
  `- 2:0:0:1 sda 8:0  active ready running

Tuto mpath použijeme jako PV pro naši VG, kterou nazveme třeba  havg1

[root@f25a ~]# pvcreate /dev/mapper/mpatha
  Physical volume "/dev/mapper/mpatha" successfully created.
[root@f25a ~]# vgcreate havg1 /dev/mapper/mpatha
  Volume group "havg1" successfully created

Nyní ve VG havg1 vytvoříme dva LV, configlv a datalv, a na nich XFS. LV configlv alokujeme 100MB a LV datalv bude mít 300 MB. Tím, že ve VG ponecháme volné místo, budeme moci rychle přidat, pokud filesystémům místo dojde.

[root@f25a ~]# lvcreate -n configlv --size 100M havg1
  Logical volume "configlv" created.

[root@f25a ~]# lvcreate -n datalv --size 300M havg1
  Logical volume "datalv" created.

[root@f25a ~]# lvs
  LV       VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root     fedora -wi-ao----   4.49g
  configlv havg1  -wi-a----- 100.00m
  datalv   havg1  -wi-a----- 300.00m

[root@f25a ~]# mkfs.xfs /dev/havg1/configlv
meta-data=/dev/havg1/configlv    isize=512    agcount=4, agsize=6400 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=0, rmapbt=0, reflink=0
data     =                       bsize=4096   blocks=25600, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0


[root@f25a ~]# mkfs.xfs /dev/havg1/datalv
meta-data=/dev/havg1/datalv      isize=512    agcount=4, agsize=19200 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=0, rmapbt=0, reflink=0
data     =                       bsize=4096   blocks=76800, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=855, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

Nakonec na obou nodech vytvoříme adresáře, kam cluster (přesněji pacemaker) tyto FS připojí, až se dané resources spustí.

[root@f25a ~]# mkdir -p /web/{data,config}
[root@f25b ~]# mkdir -p /web/{data,config}

Přidání LVM a filesystémů do clusteru

Abychom mohli použít LVM resource v clusteru, budeme muset na obou cluster nodech nastavit určitý parametr v LVM konfiguraci. Ten parametr se nazývá volume_list a určuje, které VG a LV se v systému aktivují při bootu. Obvykle se použije logika povolit aktivaci všech VG a LV, které nutně potřebujeme při bootu (v našem případě to bude jen systémová VG fedora), a ostatní VG a LV ponechat nedefinováné. Tím se aktivují jen ty VG a LV, které jsou definovány. Což je logické. Na rozdíl od aktivního-aktivního clusteru nepoužíváme v aktivním-pasivním CLVM, a proto by měly být sdílené LV aktivovány jen na jednom z nodů. Kdybychom LVM pomocí parametru volume_list aktivaci neomezili jen na lokální VG a LV, oba nody by aktivovaly všechny LV, které v systému vidí, včetně sdílených.

/etc/lvm/lvm.conf
        # Example
        # volume_list = [ "vg1", "vg2/lvol1", "@tag1", "@*" ]
        volume_list = [ "fedora" ]

Také budeme potřebovat deaktivovat lvmetad, což je subsystém snažící se cachovat LVM metadata a redukovat skenování PV. Nejsnadněji to provedeme příkazem:

# lvmconf --enable-halvm --services --startstopservices

Po každé modifikaci systémové konfiguračního souboru LVM /etc/lvm/lvm.conf, je potřeba rekompilovat initramfs:

# dracut -f

Samotné přidání LVM resource přidáme příkazem:

[root@f25b ~]# pcs resource create havg1 LVM volgrpname=havg1 exclusive=true --group ha-web
Assumed agent name 'ocf:heartbeat:LVM' (deduced from 'LVM')

[root@f25b ~]# pcs status
Cluster name: cluster1
Stack: corosync
Current DC: node1 (version 1.1.16-1.fc25-94ff4df) - partition with quorum
Last updated: Fri Aug 25 01:00:23 2017
Last change: Fri Aug 25 01:00:20 2017 by root via cibadmin on node1

2 nodes configured
2 resources configured

Online: [ node1 node2 ]

Full list of resources:

 xvmfence   (stonith:fence_xvm):    Started node1
 Resource Group: ha-web
     havg1  (ocf::heartbeat:LVM):   Started node1

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

Pozorný čtenář si určitě všimnul následujících detailů:

  • Assumed agent name 'ocf:heartbeat:LVM' (deduced from 'LVM'): Agent tady znamená resource agent neboli skript, který daný resource obsluhuje
  • exclusive=true: exkluzivní aktivace, tzn. jen na jednom z nodů v daný moment
  • --group ha-web: instruuje pacemaker vytvořit RG, resource group, nazvanou ha-web

Informace o jednotlivých resource agentech zjistíte příkazem:

# pcs resource list

# pcs resource describe RA

[root@f25b ~]# pcs resource describe LVM
Assumed agent name 'ocf:heartbeat:LVM' (deduced from 'LVM')
ocf:heartbeat:LVM - Controls the availability of an LVM Volume Group

Resource script for LVM. It manages an Linux Volume Manager volume (LVM)
as an HA resource.

Resource options:
  volgrpname (required): The name of volume group.
  exclusive: If set, the volume group will be activated exclusively. This option works one of two ways. If the volume group has the cluster attribute set, then the volume group will be activated exclusively using
             clvmd across the cluster. If the cluster attribute is not set, the volume group will be activated exclusively using a tag and the volume_list filter. When the tag option is in use, the volume_list in
             lvm.con must be initialized. This can be as simple as setting 'volume_list = []' depending on your setup.
  tag: If "exclusive" is set on a non clustered volume group, this overrides the tag to be used.
  partial_activation: If set, the volume group will be activated partially even with some physical volumes missing. It helps to set to true when using mirrored logical volumes.

Default operations:
  start: interval=0s timeout=30
  stop: interval=0s timeout=30
  monitor: interval=10 timeout=30
[root@f25b ~]#

Pokud se zamýšlíte nad označením ocf:heartbeat:LVM, vězte, že jde o standard:provider:resource agent. Standard je v tomto případě open cluster framework.

Pro přidání FS resource do resource group spusťte:

[root@f25b ~]# pcs resource create webconfigfs Filesystem device=/dev/havg1/configlv directory=/web/config fstype=xfs --group ha-web
Assumed agent name 'ocf:heartbeat:Filesystem' (deduced from 'Filesystem')

[root@f25b ~]# pcs status
Cluster name: cluster1
Stack: corosync
Current DC: node1 (version 1.1.16-1.fc25-94ff4df) - partition with quorum
Last updated: Fri Aug 25 01:38:18 2017
Last change: Fri Aug 25 01:38:15 2017 by root via cibadmin on node1

2 nodes configured
3 resources configured

Online: [ node1 node2 ]

Full list of resources:

 xvmfence   (stonith:fence_xvm):    Started node1
 Resource Group: ha-web
     havg1  (ocf::heartbeat:LVM):   Started node1
     webconfigfs    (ocf::heartbeat:Filesystem):    Started node1

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled
[root@f25b ~]#

Proč jsou parametry device ,directory afstype specifikovány? Protožepcs resource describe Filesystem je označuje za nezbytné, bez nich se resource tohoto typu nevytvoří.--group ha-web je uveden samozřejmě proto, že chceme, aby tento FS byl součástí resource group ha-web.

Stejně budeme postupovat také při přidávání druhého FS:

 [root@f25b ~]# pcs resource create webdatafs Filesystem device=/dev/havg1/datalv directory=/web/data fstype=xfs --group ha-web
Assumed agent name 'ocf:heartbeat:Filesystem' (deduced from 'Filesystem')

[root@f25b ~]# pcs status
Cluster name: cluster1
Stack: corosync
Current DC: node1 (version 1.1.16-1.fc25-94ff4df) - partition with quorum
Last updated: Fri Aug 25 01:55:39 2017
Last change: Fri Aug 25 01:55:36 2017 by root via cibadmin on node1

2 nodes configured
4 resources configured

Online: [ node1 node2 ]

Full list of resources:

 xvmfence   (stonith:fence_xvm):    Started node1
 Resource Group: ha-web
     havg1  (ocf::heartbeat:LVM):   Started node1
     webconfigfs    (ocf::heartbeat:Filesystem):    Started node1
     webdatafs  (ocf::heartbeat:Filesystem):    Started node1

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

Že LV jsou skutečně aktivované jen na jednom z nodů a FS skutečně namountované jen na nodu, kde jsou aktivované LV, si snadno ověříte příkazylvs grep web /proc/mounts .

Instalace webserveru, nastavení správných práv a vlastníka a SElinux kontextu

Nyní máme nody připravené na LVM pomocí taggingu a v clusteru je definovaná skupina ha-web, obsahující LVM resource (VG) a dva FS, kam uložíme konfiguraci webserveru a jeho data. Zbývá se ještě postarat o správná práva, vlastníka a pokud je SElinux aktivovaný, také správný SElinux kontext na webových adresářích, kam se FS připojí. Nejpre ale nainstalujme webserver apache. Tím se vytvoří i uživatel a skupina apache, takže budeme moci změnit vlastníka adresářů. A pokud do instalačního příkazu přidáme i balíky php a mod_php, budeme připraveni také PHP aplikaci. Dále se nám bude hodit balík policycoreutils-devel, obsahující nástroj semanage, po němž sáhneme pro změnu kontextu.

# dnf install -y httpd php mod_php policycoreutils-devel

Na obou nodech změníme vlastníka adresářů /web/{data,config} , upravíme práva…

# chmod 755 -R /web/ ; chown apache:apache -R /web/

… zjistíme, jaký SElinux kontext httpd využívá, a nastavíme ho na adresář /web . Tady je dobré vědět, že httpd standardně ukládá data do/var/www/html a konfiguraci do /etc/httpd . Proto i naše nestandardní umístění dat v /web/data , resp./web/config by mělo mít odpovídající kontext. Pro data to budehttpd_sys_rw_content_t a pro data httpd_config_t

# semanage fcontext --list |  egrep "/etc/httpd|/var/www/html"
/etc/httpd(/.*)?                                   all files          system_u:object_r:httpd_config_t:s0
[...]
/var/www/html(/.*)?/sites/default/files(/.*)?      all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/sites/default/settings\.php    regular file       system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp_backups(/.*)?               all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html/[^/]*/cgi-bin(/.*)?                  all files          system_u:object_r:httpd_sys_script_exec_t:s0
[...]


Obdobně jako jsme použilisemanage ke zjištění vhodného kontextu, použijeme stejný příkaz i pro vytvoření SElinux policy pro adresáře ve /web . Nově vytvořenou policy aplikujeme příkazem restorecon . Budete-li někdy v pokušení měnit SElinux kontext pomocí chcon , mějte na paměti, že taková změna nebude trvalá.

[root@f25a ~]# semanage fcontext -at httpd_sys_rw_content_t '/web/data(/.*)?'
[root@f25a ~]# restorecon -Rv /web/data/
restorecon reset /web/data context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_rw_content_t:s0
[root@f25a ~]# ll -dZ /web/data/
drwxr-xr-x. 2 apache apache unconfined_u:object_r:httpd_sys_rw_content_t:s0 6 Aug 24 01:00 /web/data/

[root@f25a ~]# semanage fcontext -at httpd_config_t '/web/config(/.*)?'
[root@f25a ~]# restorecon -Rv /web/config/
restorecon reset /web/config context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_config_t:s0
[root@f25a ~]# ll -dZ /web/config/
drwxr-xr-x. 2 apache apache unconfined_u:object_r:httpd_config_t:s0 6 Aug 24 01:00 /web/config/

Konfigurace webserveru, spuštění nanečisto a vytvoření cluster resource service IP a httpd. Povolení firewallu

Teď už nám nic nebrání v konfiguraci webserveru, jehož konfigurační soubory zkopírujeme z /etc/httpd  do /web/config, změníme některé direktivy a zkusíme ho spustit na popředí. Toto provedeme na nodu, kde jsou FS namountované, neboli tam, kde je spuštěná RG ha-web

[root@f25a ~]# rsync -av /etc/httpd/ /web/config/
sending incremental file list
./
logs -> ../../var/log/httpd
modules -> ../../usr/lib64/httpd/modules
run -> /run/httpd
conf.d/
conf.d/README
conf.d/autoindex.conf
conf.d/php.conf
conf.d/userdir.conf
conf.d/welcome.conf
conf.modules.d/
conf.modules.d/00-base.conf
conf.modules.d/00-dav.conf
conf.modules.d/00-lua.conf
conf.modules.d/00-mpm.conf
conf.modules.d/00-optional.conf
conf.modules.d/00-proxy.conf
conf.modules.d/00-systemd.conf
conf.modules.d/01-cgi.conf
conf.modules.d/10-h2.conf
conf.modules.d/10-proxy_h2.conf
conf.modules.d/15-php.conf
conf.modules.d/README
conf/
conf/httpd.conf
conf/magic

sent 40,179 bytes  received 409 bytes  81,176.00 bytes/sec
total size is 38,812  speedup is 0.96

Pro přehlednost seznam změn v konfiguračním souboru  httpd.conf:

/etc/httpd/conf/httpd.conf:
ServerRoot "/etc/httpd"

/web/config/conf/httpd.conf:
ServerRoot "/web/config"

/etc/httpd/conf/httpd.conf:
DocumentRoot "/var/www/html"

/web/config/conf/httpd.conf:
DocumentRoot "/web/data"

/etc/httpd/conf/httpd.conf:

    AllowOverride None
    # Allow open access:
    Require all granted



/web/config/conf/httpd.conf:

    AllowOverride None
    # Allow open access:
    Require all granted



/etc/httpd/conf/httpd.conf:

    #
    # Possible values for the Options directive are "None", "All",
    # or any combination of:
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
    #
    # Note that "MultiViews" must be named *explicitly* --- "Options All"
    # doesn't give it to you.
    #
    # The Options directive is both complicated and important.  Please see
    # http://httpd.apache.org/docs/2.4/mod/core.html#options
    # for more information.
    #
    Options Indexes FollowSymLinks

    #
    # AllowOverride controls what directives may be placed in .htaccess files.
    # It can be "All", "None", or any combination of the keywords:
    #   Options FileInfo AuthConfig Limit
    #
    AllowOverride None

    #
    # Controls who can get stuff from this server.
    #
    Require all granted




/web/config/conf/httpd.conf:

    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted

Spustíme webserver ručně a se změněným konfiguračním souborem a ověříme, jestli poslouchá na portu 80. Můžeme i otestovat uvítací stránku pomocíelinks (hláška o chybějícím FQDN není pro náš test podstatná):

[root@f25a ~]# httpd -f /web/config/conf/httpd.conf -kstart
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using f25a.example.com. Set the 'ServerName' directive globally to suppress this message


[root@f25a ~]# lsof -nPi | grep *:80
httpd    5095   root    4u  IPv6  93699      0t0  TCP *:80 (LISTEN)
httpd    5096 apache    4u  IPv6  93699      0t0  TCP *:80 (LISTEN)
httpd    5097 apache    4u  IPv6  93699      0t0  TCP *:80 (LISTEN)
httpd    5098 apache    4u  IPv6  93699      0t0  TCP *:80 (LISTEN)
httpd    5099 apache    4u  IPv6  93699      0t0  TCP *:80 (LISTEN)
httpd    5100 apache    4u  IPv6  93699      0t0  TCP *:80 (LISTEN)


[root@f25a ~]# dnf install elinks -y ; elinks http://localhost

V tuto chvíli můžeme na obou nodech povolit firewall pro komunikaci na portu 80 (služba httpd ):

[root@f25a ~]# firewall-cmd --permanent --add-service=http ;  firewall-cmd --reload
success
success

[root@f25b ~]# firewall-cmd --permanent --add-service=http ;  firewall-cmd --reload
success
success

… a pokud v prohlížeči zadáme http://f25a/ , měli bychom vidět testovací httpd stránku Fedory. Pokud ano, směle do instalace PHP aplikace! Zkusíme spustit aplikaci postavenou na českém PHP frameworku Nette. Pozor při stahování: verze Nette-2.4–20170714 mi nefungovala a logovala problém týkající se PHP. Verze Nette-2.3–20161221 už funguje správně. Framework zkopírujte na node, kde je zrovna spuštěna skupina ha-web (např. pomocí scp ), rozbalte na nodu archiv a zkopírujte adresářsandbox do /web/data . Tento adresář obsahuje kompletní PHP aplikaci.

[root@f25a Nette-2.3-20161221]# rsync -av sandbox /web/data/
sending incremental file list
[...]

Aby se naše první aplikace nejmenovala jako pískoviště, přejmenujme ji třeba na luxus-ha-web mv /web/data/sandbox/ /web/data/luxus-ha-web a změňme práva pro některé adresáře v rámci aplikace, cd /web/data/luxus-ha-web && chmod -R a+rw temp log . Celý webserver se pokusíme restartovat příkazem httpd -f /web/config/conf/httpd.conf -krestart .

Pokud vše funguje a na adrese http://f25a/luxus-ha-web/www/ vidíte modrou uvítací stránku Nette frameworku, máte vyhráno! Teď už stačí jen zastavit webserver killall httpd nebo httpd -f /web/config/conf/httpd.conf -kstop a přidat webserver a IP resource do clusteru. Uvidíte, že tohle už bude hračka!

Přidání webserveru s PHP aplikací (Nette) a IP resource do clusteru

Aby byla služba komunikující přes síť dostupná (tedy i webserver), potřebuje IP. A protože je řeč o vysoce dostupném webserveru, budeme chtít, aby také IP, na kterém webserver běží, byla vysoce dostupná (service IP). Proto do clusteru přidáme IP resource. IP resource poběží, pokud není specifikováno jinak (např. parametrem nic při vytváření resource), na síťové kartě vybrané na základě routovací tabulky. Rozhodně by bylo výhodné si síťovky, kde service IP poběží, dát do bondu nebo teamu; cluster v článku tento problém zanedbává, bude používat jen samotatné síťovky a vystavuje tak celý design slabému místu – single point of failure.

Podíváme se, jaké parametry resource agent IPaddr2 nabízí, a zadáme jediný povinný, a to parametr ip:

# pcs resource describe IPaddr2

# pcs resource create webip IPaddr2 ip=192.168.10.33 --group ha-web
Assumed agent name 'ocf:heartbeat:IPaddr2' (deduced from 'IPaddr2')


# pcs status
Cluster name: cluster1
Stack: corosync
Current DC: node1 (version 1.1.16-1.fc25-94ff4df) - partition with quorum
Last updated: Sat Aug 26 01:03:07 2017
Last change: Sat Aug 26 01:03:04 2017 by root via cibadmin on node1

2 nodes configured
5 resources configured

Online: [ node1 node2 ]

Full list of resources:

 xvmfence   (stonith:fence_xvm):    Started node1
 Resource Group: ha-web
     havg1  (ocf::heartbeat:LVM):   Started node1
     webconfigfs    (ocf::heartbeat:Filesystem):    Started node1
     webdatafs  (ocf::heartbeat:Filesystem):    Started node1
     webip  (ocf::heartbeat:IPaddr2):   Started node1

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

O tom, že IP běží na stejném nodu jako zbytek skupiny ha-web, se přesvědčíme jednoduše (všimněte si samostatné síťové karty, kde IP běží. Toto je slabé místo a rozhodně je vhodné ho ošetřit – to už nechám na vašem uvážení):

# ip -o a | grep 10.33
3: ens3    inet 192.168.10.33/24 brd 192.168.10.255 scope global secondary ens3\       valid_lft forever preferred_lft forever

Teď konečně přichází na řadu resource webserveru, neboli apache. Nezapomeňte specifikovat parametr configfile, protože nevyužíváme standardní umístění:

# pcs resource create webserver apache configfile=/web/config/conf/httpd.conf --group ha-web
Assumed agent name 'ocf:heartbeat:apache' (deduced from 'apache')

# pcs status
Cluster name: cluster1
Stack: corosync
Current DC: node1 (version 1.1.16-1.fc25-94ff4df) - partition with quorum
Last updated: Sat Aug 26 01:14:50 2017
Last change: Sat Aug 26 01:14:41 2017 by root via cibadmin on node1

2 nodes configured
6 resources configured

Online: [ node1 node2 ]

Full list of resources:

 xvmfence   (stonith:fence_xvm):    Started node1
 Resource Group: ha-web
     havg1  (ocf::heartbeat:LVM):   Started node1
     webconfigfs    (ocf::heartbeat:Filesystem):    Started node1
     webdatafs  (ocf::heartbeat:Filesystem):    Started node1
     webip  (ocf::heartbeat:IPaddr2):   Started node1
     webserver  (ocf::heartbeat:apache):    Started node1

Daemon Status:
  corosync: active/enabled
  pacemaker: active/enabled
  pcsd: active/enabled

Funkčnost samozřejmě zjistíme, otevřeme-li adresu http://192.168.10.33/luxus-ha-web/www/ v prohlížeči:

Důležitá poznámka: teď, když na exportovaných LUNech existuje VG a v nich LV, bude obojí dostupné a viditelné i na iSCSI targetu. Po rebootu iSCSI targetu by se stalo, že oba LV obsažené v nově vytvořené VGhavg1 budou aktivovány. Protože jehavg1 umístěna uvnitř exportovaného LV exportvg/cluster1lun1 , znemožnilo by totarget service LVexportvg/cluster1lun1 použít pro export. Výsledkem by bylo, že bychom v targetcli , v sekciluns námi definovaného exportu, neviděli žádný exportovaný LUN. Tím pádem by ani iSCSI klienti – cluster nody – žádný LUN neměli k dispozici. Tomuto je třeba předejít: v souboru/etc/lvm/lvm.conf změníme parametrvolume_list podobně jako dříve na nodech clusteru. Ponecháme systémovou VG fedora a exportní VG exportvg).

/etc/lvm/lvm.conf
        # Example
        # volume_list = [ "vg1", "vg2/lvol1", "@tag1", "@*" ]
        volume_list = [ "fedora", "exportvg" ]

Samozřejmě i tady platí, že je potřeba rekompilovatinitramfs :

ict ve školství 24

# dracut -f

Rekapitulace

V tomto díle jsme se seznámili s možnostmi využití úložiště exportovaného v díle minulém a využili jednu z nich, LVM pomocí taggingu a exclusive módu. Vznikl tím aktivní-pasivní cluster (failover). Jako službu, kterou nám tento cluster bude poskytovat, jsme zvolili webserver pomocí apache a přidali jsme do něj funkcionalitu PHP. Jednu PHP aplikaci v podobě frameworku Nette jsme nakopírovali na sdílený FS a otestovali její funkčnost.

Příští díl bude výhradně clusterový; budeme se zabývat constrainty, resource stickiness a resource operacemi.

Reference

Autor článku

Pracuje na technické podpoře Red Hat a věnuje se skialpu a lezení.