FAQ Podpora otázky a odpovede

Otázka a odpoveď

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

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

Tagy: K/S
Tagy:
K/S
Dátum upravy: 27.08. 2008

Pokiaľ užívateľ klientskej stanice ukončí aplikáciu nekorektným spôsobom, napríklad vypnutím nebo reštartom počítača bez ukončenia aplikácie, zostanú na strane serveru otvorené jeho spojenia. K podobnej situácii môže dôjsť po výpadku 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 prinésť 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 s takýmto výpadkom spojené, je potrebné, aby databázový server mal možnosť stratené spojenie odhaliť a uzavrieť.

Vo Firebirde 2.1.0 je doporučenou možnosťou využítie nasledujú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ýchdozí stav 7200000 (milisekúnd, tj. dve hodiny), je potrebné znížiť napr. na 60000 (jedna minúta).
    KeepAliveInterval - východzí stav 1000 (milisekund), doporučujeme zvýšiť napr. na 15000 (15 sekund).
    TcpMaxDataRetransmissions - východzí stav 5 (počet opakovaní), je možné ponechať.
    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ýchozí stav 9 (počet opakování)
    tcp_keepalive_intvl - výchozí stav 75 (sekund)
    Aspoň jednu z hodnôt tcp_keepalive_probes nebo tcp_keepalive_intvl je tiež vhodné znížit.
    Celková doba detekcie spadnutého spojenia je zhruba tcp_keepalive_time + tcp_keepalive_probes * tcp_keepalive_intvl [s]

Vo východzom stave trvá detekcia spadnutého spojenia týmto spôsobom okolo 2 hodín, čo je na zistenie stracených klientov príliš dlhá doba. Program MRP-K/S preto nastavuje tieto premenné počas inštalácie serveru pod Windows tak, aby sa doba detekcie skrátila na cca 2-3 minúty. Pokiaľ server inštalujete sami mimo instalačný program MRP-K/S, doporučujeme príslušné premenné, prípadne zápisy v registri po inštalácii serveru popísaným spôsobom upraviť.

Na platforme Linux môžete premenné zmeniť, napríklad nasledujúcu sekvenciu príkazov, ktoré je vhodné umiestniť do skriptu, ktorý sa spúšťa po štarte počítača. Obvykle (v závislosti na distribúcii) sa k tomu dá použiť skript /etc/rc.local nebo /etc/rc.d/rc.local :

sysctl -w net.ipv4.tcp_keepalive_time=60
sysctl -w net.ipv4.tcp_keepalive_intvl=15
sysctl -w net.ipv4.tcp_keepalive_probes=5

Poznámka: Pri serveri Firebird 1.5 existovala ešte druhá možnosť detekcie stratených klientských spojení, a to pomocou konfiguračného parametra DummyPacketInterval, prítomného v konfiguračnom súbore firebird.conf. Vo Firebirde 2.1.0 je tento spôsob nefunkčný, akákoľvek zmena parametra z východzej hodnoty 0 vedie k ukončovaniu spojenia klientov v dobe nečinnosti. Tento problém by mal byť odstránený až v nasledujúcej verzii Firebirdu 2.1.1.

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