FAQ Podpora otázky a odpovede

Otázka a odpoveď

452
Akým spôsobom server Firebird 2.5 detekuje prerušenie klientských spojení ?

452 - Akým spôsobom server Firebird 2.5 detekuje prerušenie klientských spojení ?

Tagy: K/S
Tagy:
K/S
Dátum upravy: 23.04. 2018

Pokiaľ užívateľ klientskej stanice ukončí aplikáciu nekorektným spôsobom, napríklad vypnutím alebo reštartom počítača bez ukončenia aplikácie, zostanú na strane servera otvorené jeho spojenia. K podobnej situácii môže dôjsť po výpadku el.prúdu na klientskej stanici alebo pri poruche sieťového spojenia medzi klientom a serverom. Táto situácia je nežiadúca a môže pre ostatných užívateľov znamenať komplikácie od spomalenia odozvy serveru až po nemožnosť vykonať niektoré operácie, ktorých zámky stratený klient v dobe výpadku vlastnil. Aby sa minimalizovali problémy spojené s takýmito výpadkami, databázový server má dve možnosti, ako stratené spojenie odhaliť a uzavrieť.

  1. Vo Firebirde 2.5 je doporučenou možnosťou využitie následujúcich konfiguračných premenných TCP protokolu. Jedná sa o parametre so systémovou platnosťou, ovplyvňujúce všetky IP spojenia, ktoré daný počítač obsluhuje (prijíma).

    • Windows
      Parametre sú v registri vo vetve \HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\TCPIP\Parameters
      Všetky parametre sú celočíselného typu (DWORD).
      Ak nie sú premenné prítomné, platia ich východzie hodnoty.
      KeepAliveTime - východzí stav 7200000 (milisekúnd, tj. dve hodiny), je potrebné znížiť napr. na 60000 (jedna minúta).
      KeepAliveInterval - východzí stav 1000 (milisekúnd), doporučujeme zvýšiť napr. na 10000 (10 sekúnd).
      TcpMaxDataRetransmissions - východzí stav 5 (počet opakovaní), je možné ponechať. Windows Vista a novšie majú pevne nastavených 10 opakovaní.
      Celková doba detekcie spadnutého spojenia je zhruba KeepAliveTime/1000 + KeepAliveInterval/1000 * TcpMaxDataRetransmissions [s]

    • Linux
      Parametre sú v premenných v adresári /proc/sys/net/ipv4
      tcp_keepalive_time - východzí stav 7200 (dve hodiny), je potrebné znížiť napr. na 60 (jedna minúta).
      tcp_keepalive_probes - východzí stav 9 (počet opakovaní)
      tcp_keepalive_intvl - východzí stav 75 (sekúnd)
      Aspoň jednu z hodnôt tcp_keepalive_probes alebo tcp_keepalive_intvl je tiež vhodné znížiť.
      Celková doba detekcie spadnutého spojenia je zhruba tcp_keepalive_time + tcp_keepalive_probes * tcp_keepalive_intvl [s]


    Vo východiskovom stave trvá detekcia spadnutého spojenia týmto spôsobom cez 2 hodiny, čo je pre zistenie stratených klientov príliš dlhá doba. Program MRP-K/S preto nastavuje tieto premenné behom inštálace serveru pod Windows tak, aby sa doba detekcie skrátila na cca 2-3 minúty. Pokiaľ server inštalujete sami mimo inštalačného programu MRP-K/S, odporúčame príslušné premenné, prípadne zápisy v registroch po inštalácii servera uvedeným spôsobom upraviť.

    Na platforme Linux môžete premenné zmeniť napríklad nasledovnou sekvenciou príkazov, ktorá zaistí pridanie týchto premenných do konfiguračného súboru /etc/sysctl.conf, odkiaľ sa automaticky načítajú po reštarte počítača.

    echo net.ipv4.tcp_keepalive_time=60 >> /etc/sysctl.conf
    echo net.ipv4.tcp_keepalive_intvl=15 >> /etc/sysctl.conf
    echo net.ipv4.tcp_keepalive_probes=5 >> /etc/sysctl.conf
    sysctl -p
    

     

  2. Druhá možnosť je konfiguračný parameter DummyPacketInterval, prítomný v konfiguračnom súbore firebird.conf. Ak je nastavený na hodnotu väčšiu ako nula, server zasiela klientom kontrolné pakety v intervale zadanom v hodnote parametra (v sekundách). Pokiaľ klient na doručené pakety nereaguje, server spojenie ukončí. Server Firebird má hodnotu tohto parametra nastavenú na 0, takže server kontrolné pakety negeneruje. Dôvodom sú podľa dokumentácie problémy s implementáciou TCP/IP protokolu na klientských staniciach bežiacich pod systémom Windows, ktoré môžu spôsobiť zablokovanie počítača alebo jeho sieťovej komunikácie, pokiaľ sú aplikácie dlhšiu dobu neaktívne (nevykonávajú žiadne operácie s databázou) a kontrolné pakety včas nerušia. Klientskej aplikácie MRP-K/S sa tento problém závažne nedotýka, pretože používa len malý počet spojení k databáze a naviac sa neočakáva, že zostane spustená neaktívna po dobu niekoľko dní alebo týždňov. Pokiaľ teda databázový server Firebird nepoužívate zároveň pre iné aplikácie, ktoré vytvárajú veľký počet spojení a môžu byť neaktívne po dlhú dobu, môžete parameter zmeniť. Odporúčame hodnotu 60, ktorú používal aj starší server Interbase. Tento spôsob bol systémom MRP-K/S skôr využívaný u serveru Firebird 1.5. Parameter zadáte v konfiguračnom súbore firebird.conf odkomentovaním riadku (odstránením znaku # na začiatku riadku) a zmenou hodnoty napr. takto:

    DummyPacketInterval = 60

    Na Linuxových serveroch závisí tento spôsob detekcie spadnutého spojenia ešte na hodnote parametrua /proc/sys/net/ipv4/tcp_retries2, ktorá určuje ako dlho sa má server pokúšať kontaktovať neodpovedajúceho klienta. Pokiaľ necháte parameter na jeho východzej hodnote 15 a klientský počítač zostane po výpadku vypnutý, ukončí server spojenie až po cca 17 minútach. Ak Vám toto oneskorenie nevyhovuje, je potrebné hodnotu premennej tcp_retries2 znížiť, napr. na 5. Pokiaľ po výpadku klienta počítač znovu zapnete, býva reakcia servera ďaleko rýchlejšia - cca 3 minúty.

Program MRP-K/S v rámci inštalácie servera používa prvé z obidvoch riešení, teda zmenu konfiguračných premenných TCP protokolu, ktorá je prevedené behom inštalácie serveru inštalačným programom MRP-K/S. Na serveroch s operačným systémom Linux je potrebné príslušné premenné po inštalácii serveru Firebird zmeniť ručne.

Ďalšie informácie môžete nájsť tu.

Poznámka: Použitie druhého spôsobu, teda premennej DummyPacketInterval, môže ako vedľajší efekt v niektorých sieťach vyriešiť problémy so samovoľným ukončovaním spojenia, pokiaľ je klientská aplikácia ponechaná spustená bez aktivity. Tento problém býva spôsobený sieťovými aplikáciami (firewall, antivírusy) alebo prvkami (routre a pod.), ktoré z dôvodu uvoľnenia alokovaných zdrojov automaticky ukončujú spojenia, ktoré nevykazujú aktivitu. Štandardne sa takto správa napríklad väčšina Linuxových firewallov, ktoré výnimku pre spojenie iniciovanú z vnútornej siete udržujú len obmedzenú dobu po zastavení aktivity na tomto spojení. Pakety posielané serverom pri nenulovom nastavení hodnoty DummyPacketInterval môžu podľa našich informácií tento problém odstrániť, zrejme preto, že kontrolný paket pravidelne odosielaný serverom je vyhodnotený ako prebiehajúci komunikácia a spojenie je ponechané. Prvý spôsob, teda odosielanie KeepAlive paketov podľa nastavenia premenných TCP protokolu, túto vlastnosť mať nemusí, sieťový prvok im pravdepodobne "rozumie" a neberie ich ako plnohodnotnú komunikáciu. Lepším riešením tohto problému je samozrejme zmena nastavenia príslušnej aplikácie alebo sieťového prvku tak, aby spojenie odstraňoval až po dlhšej dobe nečinnosti (napr. niekoľko hodín), pokiaľ ich je možné konfigurovať.