Na MySQL serveri som potreboval zabezpečiť, aby všetky dotazy, ktoré trvajú príliš dlho, čím vyťažujú celý server, boli serverom automaticky ukončované.
Ako prvé som teda samozrejme začal hľadať, či toto neumožňuje priamo konfigurácia MySQL servera, nejaké nastavenie, ktoré stačí pridať do my.cnf a problém je vyriešený. Nič takého sa mi však nepodarilo nájsť, MySQL server na takéto prípady zjavne nemyslí. (ak sa mýlim, opravte ma)
Ďalším hľadaním som sa dopracoval k rôznym užitočným MySQL nástrojom pre Linux vydaných v jednom balíku ako Percona Toolkit for MySQL. Jedným z mnohých nástrojov obsiahnutých v tomto balíku je aj nástroj pt-kill, ktorý neustále kontroluje všetky bežiace MySQL procesy a v prípade, že sa niektorý z nich vykonáva dlhšie ako zadaný čas, tak ho ukončí. Pri jeho nasadení na server som postupoval zhruba takto:
- Ako prvé si musíme na disk stiahnúť celý balíček, čo veľmi jednoducho spravíme príkazom:
1
wget http://www.percona.com/redir/downloads/percona-toolkit/LATEST/percona-toolkit-2.2.2.tar.gz
- Po jeho stiahnutí ho potrebujeme rozbaliť:
1
tar -xzf percona-toolkit-2.2.2.tar.gz
- Vznikne nám adresár percona-toolkit-2.2.2, v ktorom je (okrem iných) podadresár bin, v ktorom sú uložené všetky nástroje. V tomto článku nas zaujíma iba súbor pt-kill
- Aby sme mohli tento nástroj používať, potrebujeme mu pri jeho spustení zadať meno a heslo užívateľa do MySQL s právami PROCESS a SUPER, jednak pre sledovanie bežiacich procesov, jednak pre ich následné ukončovanie. Nebolo by dobré, aby sme ho spúšťali pod root užívateľom, lepšie je vytvoriť si v MySQL užívateľa len s právami, ktoré sú pre beh tohto nástroja nevyhnutné. V MySQL si teda vytvoríme užívateľa UZIVATEL, s prístupom len z localhostu a len s týmito právami:
1 2
CREATE USER 'UZIVATEL'@'localhost' IDENTIFIED BY 'HESLO'; GRANT PROCESS , SUPER ON * . * TO 'UZIVATEL'@'localhost' IDENTIFIED BY 'HESLO';
- Teraz nám už nič nebráni v tom, aby sme nástroj mohli spustiť:
1
./pt-kill --busy-time 15 --kill -u UZIVATEL -p HESLO
Spolu s príkazom som použil tieto parametre:
- –busy-time – určuje dĺžku povoleného trvania procesu v sekundách, čo v tomto prípade znamená, že všetky procesy trvajúce viac ako 15 sekúnd budu ukončené
- -u – názov MySQL uživateľa, pod ktorým bude nástroj bežať (vytvorili sme si ho v bode 4.)
- -p – heslo pre daného užívateľa
- Takto ale zabezpečíme len jednorázové spustenie nástroja. Ak chceme zabezpečiť, aby nám bežal stále, aj po reštarte servera, pridáme ho do /etc/crontab:
1
@reboot root sleep 900 && /CESTA_K_SUBORU/pt-kill --busy-time 15 --kill --print -u UZIVATEL -p HESLO --daemonize --log CESTA_K_LOG_SUBORU
Tento príkaz zabezpečí, že nástroj pt-kill sa nám spustí vždy 900 sekúnd po štarte servera. Je dobré jeho štart oddialiť, nakoľko MySQL pri svojom spustení vykonáva rôzne kontroly, ktoré môžu trvať aj dlhší čas a keby sme pt-kill spustili hneď, mohol by tieto kontroly ukončiť.