sql >> Databáze >  >> RDS >> Mysql

Jak řídit procesy na straně serveru pomocí MySQL

Zdá se, že se pokoušíte spustit dlouhotrvající procesy z webového serveru a poté tyto procesy sledovat v databázi. Není to nemožné, ale není to doporučený postup.

Hlavním problémem je, že požadavek HTTP musí být aktuálně zpracováván na vašem webovém serveru, protože to skutečně děláte cokoliv (včetně sledování procesů běžících v systému) -- potřebujete něco, co může běžet pořád...

Místo toho by bylo lepší mít jiný démonizovaný proces „správce“ (jak zmiňujete perl, to by byl dobrý jazyk pro jeho zapsání) generovat a sledovat dlouho běžící úlohy (podle PID a signálů) a za to proces aktualizace vaší databáze SQL.

Poté můžete nechat proces „správce“ naslouchat požadavkům na spuštění nového procesu z vašeho webového serveru. Můžete použít různé mechanismy IPC. (např.:signály, SysV shm, unixové doménové sokety, průběžné fronty jako ZeroMQ atd.).

To má několik výhod:

  • Pokud se vaše vytvořené skripty musí spouštět s izolací na základě uživatele/skupiny (buď ze systému nebo navzájem), váš webový server nemusí běžet jako root ani nemusí být nastaveno jako setgid.
  • Pokud vytvořený proces „selže“, bude procesu „správce“ doručen signál, aby mohl bez problémů sledovat chybná provedení.
  • Pokud používáte fronty v průběhu procesu (např.:ZeroMQ) k doručování požadavků procesu „správce“, může „utlumit“ požadavky z webového serveru (takže uživatelé nemohou úmyslně nebo náhodně způsobit D.O.S).
  • Ať už vytvořený proces skončí dobře nebo ne, k aktualizaci databáze sledování nepotřebujete „aktivní“ požadavek HTTP na webový server.

Pokud jde o to, zda něco, co by mělo be running je běh, to je opravdu na vaší sémantice. (tj. je založeno na známé době běhu? na základě spotřebovaných dat? atd.).

Kontrola, zda je běh může být dvojí:

  1. Proces "správce" aktualizuje databázi podle potřeby, včetně vytvořeného PID.
  2. Kód hostovaný na vašem webovém serveru může ve skutečnosti vypsat procesy, které určí, zda je PID v databázi skutečně běh, a dokonce i to, kolik času to dělá něco užitečného!

Kontrola, zda není běh by musel být založen na konvenci:

  1. Pojmenujte vytvořené procesy něčím, co můžete předvídat.
  2. Získejte seznam procesů a určete, co stále běží (nefunguje?), co by nemělo být.

V obou případech můžete buď informovat uživatele, kteří požádali o vytvoření procesů, a/nebo s tím skutečně něco udělat.

Jedním přístupem může být úloha CRON, která čte z databáze SQL a provádí ps k určení, které vytvořené procesy je třeba restartovat, a poté znovu požádá, aby to proces „správce“ provedl pomocí stejného mechanismu IPC, který používá webový server. Je jen na vás, jak odlišíte spuštění od restartování ve vašem sledování/monitorování/protokolování.

Pokud samotný server ztratí napájení nebo se zhroutí, můžete nechat proces „správce“ provést vyčištění při prvním spuštění, např.:

  1. Hledejte v databázi záznamy pro vytvořené procesy, které údajně běžely před vypnutím serveru.
  2. Zkontrolujte tyto procesy podle PID a doby běhu (toto je důležité).
  3. Buď znovu vytvořte vytvořené procesy, které se nedokončily, nebo uložte něco do databáze, abyste webovému serveru oznámili, že tomu tak bylo.

Aktualizace č. 1

Podle vašeho komentáře uvádíme několik tipů, jak začít:

Zmínil jste perl, takže za předpokladu, že tam máte nějaké znalosti -- zde jsou některé moduly perlu, které vám pomohou na vaší cestě k psaní skriptu procesu "manager":

Pokud jej ještě neznáte, CPAN je úložiště pro moduly perl, které dělají v podstatě cokoli.

Daemon::Daemonize - Daemonizovat proces tak, aby pokračoval v běhu po vašem odhlášení. Poskytuje také metody pro psaní skriptů pro spuštění/zastavení/restartování démona.

Proc::Spawn - Pomáhá s 'plozením' dětských skriptů. V podstatě dělá fork() pak exec() , ale také zpracovává STDIN/STDOUT/STDERR (nebo dokonce tty) podřízeného procesu. Můžete to použít ke spuštění vašich dlouhotrvajících perl skriptů.

Pokud kód front-endu vašeho webového serveru ještě není napsán v perlu, budete potřebovat něco, co je docela přenosné pro meziprocesové předávání zpráv a řazení do front; Pravděpodobně bych vytvořil frontend vašeho webového serveru v něčem, co se snadno nasazuje (jako je PHP).

Zde jsou dvě možnosti (existuje mnoho více):

Proc::ProcessTable - Tuto kontrolu můžete použít na běžící procesy (a získat všechny druhy statistik, jak je uvedeno výše).

Čas::HiRes - Pomocí časových funkcí s vysokou granularitou z tohoto balíčku implementujte svůj rámec pro „škrcení“. V zásadě stačí omezit počet požadavků, které vyřadíte z fronty za jednotku času.

DBI (s mysql ) - Aktualizujte svou databázi MySQL z procesu "správce".




  1. Jak změna typu pole mysql z INT na VARCHAR ovlivní data dříve uložená jako INT

  2. Flask_SQLAlchemy, MySQL, ukládání švédských znaků å, ä, ö?

  3. Nelze spustit Mysql na Macu

  4. Aktualizace databázových řádků bez zamykání tabulky v PostgreSQL 9.2