VRRP se používá zejména pro routery pro zajištění větší spolehlivosti sítě, kdy jedna IP je obsluhována několika uzly (typicky routery, ale nejen) a pokud jeden z uzlů vypadne, další uzel dle priority IP převezme na sebe. Někteří poskytovatelé připojení používají proprietální protokol HSRP. VRRP je též podporován i v Mikrotik ROS.

V linuxu slouží pro ovládání protokolu vrrp služba keepalived, umí toho ale daleko víc.

Dneska si jen v rychlosti ukážeme, jak využít vrrp pro velmi jednoduchý HA mezi dvěma uzly. Cílem není tady vystavět komplexní služby ale jen představit další kus software, který se může někomu hodit.

Vyzkoušejte sami

Pro jednoduchý test nám stačí dva stroje (třeba virtuálky). Na oba stroje nainstalujeme pochopitelně keepalived a vedle něj třeba nginx. Stačí nám jen jednoduchá statická stránka. (Návod je platný pro Debian.)

apt install keepalived nginx-light

Na prvním serveru třeba:

echo "node1" > /var/www/html/index.nginx-debian.html

Na druhém třeba:

echo "node2" > /var/www/html/index.nginx-debian.html

Jde nám jen o to, jak poznat, zda se klient připojit sice na stejnou IP, ale ta se přehodila z jednoho stroje na druhý. V praxi pochopitelně budeme mít všechny stoje v clusteru stejné.

Konfigurace keepalived

V souboru /etc/keepalived/keepalived.conf budeme definovat jednotlivé skupiny routerů pro virtuální IP, zatím nám postačí jedna jediná:

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass <password>
    }
    virtual_ipaddress {
        192.168.42.42
    }
}

Kde:

  • interface je jméno siťovky, na které budeme virtální ip provozovat
  • virtual_router_id je id této skupiny vrrp. Na jedné síti bychom měli dbát
  • na to, aby ruzné skupiny nepoužívaly stejné id.
  • priority priorita určuje, který stroj dostane přidělenu virtuální ip. Pokud stroj s vyšší prioritou umře, virtuální ip přebírá stroj s nejvyšší prioritou (v případě stejných prio se mezi stroji hlasuje o to, kdo ip získá).
  • advert_int jak často se má stroj ohlašovat, že žije. V sekundách.
  • auth heslo pro komunikaci routerů mezi sebou.

a konečně:

  • virtual_ipaddress zde se nastavuje seznam ip, které mají být sdílené. IP může být víc, my máme jen jednu.

Výše uvedený konfigurák umístíme na oba stroje. Jediná změna v konfigu je priority, tou si můžeme určit, na kterém stoji má daná virtální ip přednostně být. Pochopitelně také upravíme iface, pokud oba stroje mají ruzné jméno síťovky. Zbytek nastavení musí být shodný.

A tím je hotovo.

Službu keepalived nastartujeme.

systemctl start keepalived

A klidně ji můžeme nastartovat nejprve na stroji s nižší prioritou. IP by se měla přiřadit. Potom na stroji s vyšší prioritou, ip by se měla přehodit.

Pokud si do prohlížeče zadáme http://192.168.42.42 (a třeba autorefresh po 1s), můžeme sledovat, že stránka je dostupná z obou strojů a jen se mění uvedený text v případě, že aktivní uzel vypneme nebo restartujeme.

Využití

Ideální je použití pro bezstavové protokoly, tam, kde nepotřebujeme směrovat klienta na konkrétní stroj. K tomu potom slouží proxy servery. VRRP se hodí pro služby, které nepotřebují uchovávat stav klienta (tedy zrovna třeba statický web). Takovou službou je i NFS.

Máme-li na obou uzlech exportována stejná data (glusterfs, cephfs), mužeme nastavit na obou uzlech NFS server a klienty připojit na virtuální IP.

GlusterFS exportuje NFS na každém svém uzlu. Můžeme mít jednu virtuální IP nastavenou přes všechny nody glusteru a při výpadku uzlu jeho úlohu převezme uzel jiný. Při zajištění redundace dat NFS klienti běží dál.

Lze mít i lepší setup, pokud například máme 6 glusterfs strojů, každému z nich lze přiřadit jeho vlastní virtuální ip (mít 6 virtuálních ip celkem), a dalších 5 strojů nastavit jako jeho vrrp backup. Pokud vypadne libovolný ze strojů, tak některý další převezme jeho IP. Pro klienta se ovšem nic nemění, ten běží dál (NFS to umí). Takto se každý klient může připojit na jinou IP, címž se zajistí lepší rozložení provozu po síti na jednotlivé uzly.

Ale o GlusterFS zase někdy jindy.