tail -f sql alapon?
Van arra bejáratott módszer mysql/mariadb/postgresql vonalon, hogy folyamatosan lekérjem az újonnan bekerült sorokat egy táblából és ne terheljem ezzel túlságosan a szervert?
Át akarom állítani a log szerveremet text fájlokról rdbms backendre, viszont ebben az esetben nem látok elég egyszerű lehetőséget arra, hogy kiváltsam a tail -f log parancsot, ha épp szükségem van rá. Mivel eseti dologról van szó, azt nem tartom jó ötletnek, hogy emiatt kétfelé küldjem a logok tartalmát, ami egyébként megoldás lehetne...
■ Át akarom állítani a log szerveremet text fájlokról rdbms backendre, viszont ebben az esetben nem látok elég egyszerű lehetőséget arra, hogy kiváltsam a tail -f log parancsot, ha épp szükségem van rá. Mivel eseti dologról van szó, azt nem tartom jó ötletnek, hogy emiatt kétfelé küldjem a logok tartalmát, ami egyébként megoldás lehetne...
Én PostgreSQL-el csináltam
notify
értesítést kürtölt széttrigger
rel futtattam a kérdéses táblák változásairaQSqlDriver::notification()
signallalQSqlDriver::subscribeToNotification()
hívás után a slot megkapta az adatbázis értesítéseitÍgy egyik résztvevő program sem futott fölösleges köröket, a Qt program pedig azonnal értesült róla, hogy változás történt. A változás mibenlétének persze már maga kellett utánajárjon.
Elméletileg más adatbázis esetében is mű ködhet, amennyiben
QSqlDriver::hasFeature(QSqlDriver::EventNotifications)
, de gyakorlatilag csak PostgreSQL-ről tudok. És ott is csak a Qt osztállyal sikerült összehozni, más nyelvek esetében az értesítés vagy teljesen hiányzik, vagy csak egy akármilyen adatbázis művelet után kapja meg a program.Köszi, ez így felejtősnek
Úgy fest valamit rosszul írtam a googliba, most találtam pár tippet, de mind a tiédhez hasonló szintű, úgyhogy ezt akkor félreteszem.
Még azt megnézem, hogy mi történik, ha egy fifo eszközre próbálok írni az adatbázis mellett... ha az annyi, mintha a /dev/null-ba küldené, csak ad esélyt a kiolvasásra, akkor ez is megoldja a gondomat.
Ui: az egész csak azért jött elő, mert ha textbe írja a syslogd a logot, akkor csak a küldő rendszer ideje kerül bele, az adatbázisba meg a log szerveré is. (A router restart után május 5-ére áll be, ami elront pár szkriptet)
Update: lehet, hogy mégsem olyan szörnyen bonyolult, mint ahogy elsőre gondoltam, csak az a Qt-s dolog tűnt ijesztőnek... megnézem, megoldható-e nálam is ez a verzió. (és hogy nem zavarja-e az rsyslogd-t a trigger)
Új sorok
Persze lehet ezt is pontosítani kívánság szerint.
Binlog streaming
Itt van pl egy opensource projekt:
https://github.com/mardambey/guzzler
Kicsit részletesebb Kafkás megoldás:
https://engineeringblog.yelp.com/2016/08/streaming-mysql-tables-in-real-time-to-kafka.html
... that been said, én nem ajánlom RDBMS-be írni logot.Azok a storage enginek nem ilyen jellegű használatra lettek kitalálva. Text fájllal bármilyen linux eszköz tud dolgozni, ha rotálni szeretnéd, vagy zippelve feltölteni valami olcsó tárhelyre.
Köszi, abban azért nem értünk
Ami miatt én gondolkodom rajta: az adatbázisba írt sorokba több info kerül, mint textbe. Évszám, a küldő és fogadó rendszer ideje egyaránt, a textben nincs évszám, nincs benne a fogadó rendszer ideje (lehet, hogy ez is módosítható, egyelőre nem találom).
Amiért komolyabb helyeken megfontolandó az rdbms használat, az pl. adatvesztés megelőzése, ami sima text esetén nem biztosított igazán.
Azt nem igazán értem, mire gondolsz azzal, hogy nem erre valók ezek az engine-k. Max. hangolni kell a tároláson, hogy ne pazarolja a helyet (sajnos csak oracle tapasztalatom van, ott megoldható), esetleg particionálni. Rotate kicsit másképp megy persze, de évente egyszer elég általában.
Update: syslog-ng esetében megvan a potenciális megoldás a text formátumú log átalakítására, a template "személyében".
rdbms
Lehet hogy csak előítélet, mert nem láttam még ezt a módszert használatban, de nem is olvastam sehol hogy ennek az előnyeit bizonygatták volna egy klasszik, file alapú megoldással szemben.
A backupot emlitetted előnyként, ami rotált fájloknál igazán triviálisan megoldható., viszont RDBMS esetén a tavaly márciusi log kikeresése egy olcsó tárhelyre lementett backupból elég körülményes).
Háááát... ebbe már nem mennék
Backupot én egy szóval sem említettem.
Adatvesztés megelőzése alatt arra gondoltam, hogy ha pl. kirántod a gépet a kettőhúszból, akkor sem fog elveszni (annyi) adat, mint amikor sima textbe megy.
Pedig a DB írási és olvasási
Enterprise környezetben se tárolnak RDBMS-ben logot. Log aggregátorokat és processorokat használnak, ami értelmezni, indexelni, keresni, feldolgozni tudja a logokat, riasztásokat tudsz beállítani rá stb. Viszont erre se az RDBMS a legjobb megoldás. Ezek mellett text formátumban is megtartják viszont a logokat, mert sokminden úgy a leghatékonyabb (pl a tail).
Egyetlen okból nem akarok
Rdbms-ben tárolt loggal kapcsolatban talán a Balabit embereit kellene kérdezni, nem feltételezem róluky hogy felesleges dolgokba ölnék a munkaidejük egy részét, ilyesmit én nem csináltam. De pl. Websphere MQ is használ(t) DB2 backendet a rajta átmenő üzenetek tárolására, ami kb. ugyanaz volt, mint a logok tárolása, csak gyakrabban törlődtek talán a benne tárolt adatok.
Mondjuk humoros, hogy itt: https://www.rsyslog.com/doc/v8-stable/tutorials/database.html többek közt a realtime hozzáférést emelik ki rdbms-ben tárolt logok egyik előnyeként. :)
Nem a megvalósíthatóság a
- timestampekkel
- megtagelt
- tartalmat
- nagy mennyiségben
- leírni
Erre egy valamilyen NoSQL megoldás sokkal kellemesebb tud lenni. Szemben egy RDBMS-sel, sok esetben natívan tudnak elosztva adatokat tárolni, akár in-memory, elosztott backupokkal, sokkal alacsonyabb latency mellett, és még kismillió előnyük bír lenni. Ahogy Bence is írta, ez egy append-only feladat. Nyilván tudsz táblaterekkel játszani, olyan tábla definíciót létrehozni, ami akkor optimális, ha csak insertelni fogsz.
Én is dolgoztam olyan projecten, ahol RDBMS-be írtunk (nem syslog jellegű, nem szöveges) logot. Ott még volt valamennyi reláció is, de szerintem az RDBMS nem erre való.
Sok cucc képes RDBMS-eket használni backendnek, mert
- kiforrottak
- stabilak
- egyszerűen illeszthetőek
- mindenki ismeri
- van csomó open-source
- apt-get install és megy :)
De mindenre RDBMS-t használni perzistence layerként kalapács és szög esete. Gondolj bele, hogy egy MQ-nál mekkora overhead egy RDBMS persistence layer egy erre szabott formátum helyett. Hogy mást ne mondjak mi az említett projecten pont egy (durable) MQ-t tettünk az Oracle-be írás elé. Az egyéb architekturális megfontolások mellett ez sokkal stabilabb latency-t hozott, és jobban viselte a burst jellegű workloadot. Az alkalmazáslogokat ugyanezen a projecten Splunkba irányítottuk. Ami sokkal többet tud, mint amit képes voltam felfogni és használni belőle :)
Ha már úgyis tanulási céllal csinálod az egészet magadnak, lehet annak lenne inkább értelme, hogy írj egy logger szervert, ami pl syslog (vagy egyéb) bemenetet dolgoz fel/dekorál és ír ki textbe. Akkor megjelenhetnek benne olyan mezők, amiket hiányolsz a syslogból, de az oprendszer tooljait se bukod. Cserébe lehet OOP-t, file kezelést, akár hálózatot is gyakorolni.
No várj, itt már nem az volt
Nálam csak azért jött elő, mert kb egy sor konfig módosítás és megkapok minden infót, amit úgy tűnt, textben nem tudok megszerezni.
MQ - nálunk DB2 volt alá tolva, de akkoriban nosql nem létezett, ellenben az adatbázis miatt nem volt performancia gondunk soha.
De pont amiket te is felsoroltál: szinte mindenhez illeszthető, fejlesztők is jobban ismerik, nem kell sokféle szoftvert üzemeltetni stb. azért még ma is hordoz épp elég előnyt.
Ma se keltem fel hiába. Úgy
Így több, mint egy év távlatából elég ciki amiket ide írtam.
Logszervereken be lehet állítani, hogy miket akarok látni a logokban, szóval az hülyeség, hogy adatbázisba több info kerül.
És itt még rsyslogd-t emlegettem, azóta meg a nagyja syslog-ng alatt megy, amit doksi alapján tényleg úgy konfigurál az ember, ahogy szükséges (pythonban írt parsert is bele lehet tenni)
Nem ciki
Szerintem többen is tanultunk belőle és érdekes volt. Emiatt ez a téma nem lehet "ciki", szerintem inkább az a ciki, amikor valaki nem akar / tud tanulni, illetve ha másoktól várja a megoldást.
Ciki, hogy még mindig előbb
Kicsit beletúrtam volna a doksikba, akkor eleve másképp estem volna az egész témának.
Tíz év elteltével a napokban jöttem rá, hogy tképp a log szerverrel egy gépi feldolgozásra alkalmas formátumba kellene alakítani, ha mar úgyis a feldolgozhatóság a cél es akkor egy csomó dolgot nem kell szövegből kibányászni (program neve, időpontok stb)
notify - listen PostgreSQL-ben, nem jelent kockázatot?
Mintha bárki küldhetne értesítést az adatbázishoz kapcsolódó felhasználók közül, tetszőleges üzenettel (payload).
Nincs olyan, hogy létrehozok csatornát és jogot adok rá azoknak, akiknek engedni akarom, hogy elkapják az értesítéseket vagy küldjenek rá valamit.
Ezzel akár meg is lehet bolondítani a hallgatózó programokat.
Én ezt még a 7.3-al