Přesně tento typ problémů je pro mě zásadním argumentem pro systemd. Na tomto článku je dobře vidět, kde jsou problémy sysv-init i upstartu při enterprise nasazení. Pro tuto situaci systemd nabízí přímočaré řešení, bez volání extra nástrojů jako start-stop-daemon nebo su, s efektivním využitím cgroups pokud služba vytváří libovolným způsobem další procesy, a s předvídatelným chováním napříč distribucemi.
Nejde o systemd jako takový, ale o to, že jedině systemd je v pozici vnutit linuxovému světu onu tolik potřebnou standardizaci a předvídatelnost. Je to taky názorný příklad toho, jak to, čemu někteří říkají "unixová filozofie" a já "unixová slátanina" je naprosto katastrofální z hlediska použitelnosti OS v reálném světě.
Od srdce jsem se zasmál nad tím, kam až může Poetteringovsky deformované myšlení zajít.
Z článku jednoznačně vyplývá, že upstart s takovou situací počítá a rozhodně nenutí uživatele startovat proces přes su. Byla to prostě volba uživatele.
Dokonce i ve starém sysV initu, který má, pravda, už po sezóně, to jde udělat lépe. Jako bonus tady máte téměř dokonalou průhlednost.
No a věta o předvídatelnosti řešení nad systemd, to už je snad citát z nějaké kabaretní hry. To by ani Werich nevymyslel.
OK. Takže co takhle expect fork? su sice využijete, ale i na této staré verzi dojdete k žádoucímu výsledku bez špinavých triků díky upstartu.
I to článek zmiňuje.
Autorovi článku vůbec nevyčítám, jaké řešení původně zvolil. Člověka to napadne téměř okamžitě a zdánlivě v tom nemůže být problém. Skoro jistě bych na ten problém narazil taky :-) Koneckonců kdysi jsem si naběhl podobně.
Jj, to souhlas. Ale na druhou stranu to je proste pak zase ono. Osobne o teto vlastnosti vim, ale v zivote by me to nenapadlo predtim, nez se mi stal podobny problem :-)
A proto mam radsi reseni ala systemd, kde se procesy managuji pomoci cgroups, uzivatele muzu nastavit rovnou a service manager vzdy vi, jake procesy bezi a ne (a nezalezi na tom, jak se co (ne)forkuje).
Problém je, že přímo upstartí cookbook tohle volání "su" představuje: http://upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user
Píšou tam sice, že se na to "su" moc nehodí, že to není úplně košer, ale člověk se nedozví, že se tím takhle střelí do nohy.
Tak to je dost zasadni fail ale. Protoze dokumentace zminuje start-stop-daemon (neni v RHEL 6) a su/sudo, coz trpi timhle problemem. Oni pred su sice varuji, ale kvuli PAM restrictions (ktere zpusobuji zapis do wtmp).
Coz je vyrazne jiny druh problemu nez nasilne ukonceni procesu v pripade SIGTERM.
Ale to je proste cele o tom, ze upstart tyhle veci nemel (minimalne na zacatku) resene moc komplexne.
I openrc tohle ma vyresene mnohem lepe.
Ja zas tvrdim, ze systemd je paskvil, ktery mi naopak uz zpusobil mnoho problemu, ktere bych bez nej resit vubec nemusel. Jeho nesmyslne a hrube zasahy do behu aplikaci odmitam a nesnasim. Jen z posledniho roku jsem kvuli systemd resil problemy s winbind, docker a dalsimi.
RedHat je v podstate maly fasisticky projekt, kteremu muzeme podekovat za zrudnosti typu avahi (ktery pro resolver zavadi vlastni .local DNS domenu), network manager nebo pulse audio. Uz muj prvni stret s nedokumentovanymi zasahy RedHat vyvojaru do zdrojaku (hwclock), ktere prisuzovali puvodnimu autorovi (kteremu jsem napsal, a on mi potvrdil, ze jeho zdrojak opravdu zmodifikoval nekdo jiny) mne presvedcili, ze v tomto projektu neco fatalne selhava ke skode opensource uzivatele.
Bohuzel, z pro mne nepochopitelnych duvodu se Debian take priklonil k systemd, pro mne osobne je to neodpustitelne. Kvuli lobby s virtualizaci, cloudy a typicky serverovym nasazenim se nejstarsi a nejsvobodnejsi
distribuce zamerena na stabilitu pustila do experimentovani s nedodelanym a system pohlcujicim smejdem, ktery ztezuje diagnostiku problemu, ktere by bez nej ani nevznikly.
Avahi používá .local, protože implementuje standard mDNS (RFC 6762), ne protože si to jeho autoři vymysleli. Za problémy s používáním neregistrovaných TLD si můžete sám.
Avahi ani PulseAudio nejsou projekty Red Hatu, ale freedesktop.org.
Problém systemd je v tom, že to není jen init, ale je k jeho zdrojákům příbalena i spousta programů, které tam nepatří, takže je z toho obrovský moloch – nadbytečná komplexita, která může být zdrojem chyb (jak bezpečnostních, tak funkčních).
Jinak souhlasím, že tuhle věc by měl řešit init, dokonce se mi i celkem líbí, jak to řeší systemd a i některé jeho další vlastnosti. Nakonec ho člověk v praxi použije, ale se skřípěním zubů… přitom je to škoda – mohlo by to být celkem dokonalé řešení, jen kdyby se rozdělil na jádro (init) a volitelné moduly.
P.S. ještě k tomu „enterprise nasazení“ – tohle není žádné „enterprise“, ale základní vlastnost, která by měla spolehlivě fungovat vždy a všude – i na nějakém konzumním tabletu nebo počítači pod televizí, který slouží jen k přehrávání filmů – i tam chceš spouštět a ukončovat služby pod různými uživateli a dát jim vhodný čas na to, aby se stihly korektně ukončit.
Problém systemd je v tom, že to není jen init, ale je k jeho zdrojákům příbalena i spousta programů, které tam nepatří, takže je z toho obrovský moloch – nadbytečná komplexita, která může být zdrojem chyb (jak bezpečnostních, tak funkčních).
Od kdy je měřítkem komplexity to, co se společně nachází v repozitáři zdrojových kódů? Ostatně, když dáš dohromady zdrojáky SysVInitu, Bashe, GNU utils a ostatních nástrojů, které běžně rc skripty používají, bude těch zdrojáků nejspíš daleko víc.
Navíc projekt systemd není a nemá být jenom init – je to skupina nástrojů vyvíjených pod jednou střechou, která mimo jiné obsahuje i init. Zdá se, že 80 % stížností na systemd by odpadlo, pokud by se binárka systemd
přejmenovala na systemd-init
…
Rozhodně nechci hájit starobylý SysV init. Modernější init systém je jednoznačně potřeba a systemd to dělá poměrně dobře – např. to, že služby jsou popsány spíš deklarativně než procedurálním skriptem, nebo že má větší kontrolu nad vzniklými podprocesy, že podporuje takové věci jako „socket activation“ atd.
Ale moje představa, jak by to mělo vypadat je, že bude jeden repozitář, ve kterém budou zdrojáky init systému a pak jiné repozitáře, kde budou zdrojáky volitelných modulů, různých NTP, DNS, HTTP a jiných serverů.
A když si pak budeš chtít zkompilovat init systém, tak do toho budou vstupovat jen zdrojáky init systému a ty ostatní si ani nemusíš stahovat. Opravdu v tom snížení komplexity a počtu řádků, které do toho vstupují, vidím přínos.
Také by to mělo být verzované sémanticky a po modulech, ideálně oddělit verzování API a implementace. Abych např. už z čísla verze init systému viděl, zda s ním bude kompatibilní moje služba – to, že mezitím někdo udělal nekompatibilní změny např. v NTP serveru mne nemusí nijak trápit a zvýšení jeho verze mi nevadí.
Oddělené repozitáře nebo sémantické verzování modulů jsou sice hezká věc, ale myslím, že jejich dopad na výsledné aplikace je neměřitelný – stejně jako může být v několika repozitářích houština neproniknutelných závislostí které jdou stejně přeložit jen všechny najednou, může být i v jednom repozitáři perfektně modulární systém.
Nepovažuju systemd za nějaký ideál. Ale když čtu, jak je systemd nepoužitelný moloch, a pak se dozvím, že je vlastně jen špatně pojmenovaná binárka a nehezky uspořádané zdrojáky, připadá mi to trochu neadekvátní…
Ad „stejně jako může být v několika repozitářích houština neproniknutelných závislostí které jdou stejně přeložit jen všechny najednou“
To právě ne – když nepůjde přeložit obsah jednoho repozitáře samostatně a nebude mít jasně deklarované závislosti, tak bude každému hned jasné, že to je špatně.
Ad „vlastně jen špatně pojmenovaná binárka a nehezky uspořádané zdrojáky“
Jenže to není nějaká kosmetická záležitost – je to zásadní návrhová/architektonická vlastnost. Rozdělit si systém/aplikaci na menší části a vyřešit si závislosti mezi nimi donutí člověka se víc zamyslet nad tím návrhem.
Ideální rozdělení bych si představoval takto:
Když bude rozhraní mezi init systémem a službami dobře navržené, tak ho můžou převzít i jiné init systémy (a používat např. to socket activation). Asi by to šlo napsat i tak, aby to bylo přenositelné na jiné posixové/unixové systémy (*BSD, Hurd, Solaris…).
Když si budu chtít např. postavit jednoduchou distribuci pro SoC desku, která nemá ani ethernet, ani displej s podsvícením ani milion dalších ptákovin, tak si z toho vezmu jen ten init systém a nebudu do toho zatahovat nějakých tři sta tisíc řádků kódu. Můj odhad je, že plnohodnotný init systém by měl jít – i v C – napsat na maximálně pár desítek tisíc řádků.
> rozhraní mezi init systémem a službami (jen rozhraní, žádná implementace)
https://www.freedesktop.org/wiki/Software/systemd/dbus/ + dalsi popisky tech rozhrani tam.
> implementace init systému, který umí spouštět služby, řeší jejich závislosti, ale neobsahuje tyto služby
https://github.com/systemd/systemd/tree/master/src/systemd
> implementace jednotlivých modulů/služeb – sem patří např. moduly pro konfiguraci ethernetové sítě, podsvícení obrazovky, DNS, NTP, připojování disků atd.
https://github.com/systemd/systemd/tree/master/src
>Když bude rozhraní mezi init systémem a službami dobře navržené, tak ho můžou převzít i jiné init systémy (a používat např. to socket activation). Asi by to šlo napsat i tak, aby to bylo přenositelné na jiné posixové/unixové systémy (*BSD, Hurd, Solaris…).
To neni mozne, protoze cely systemd je psany na miru Linuxu, stejne jako napr. launchd pro Darwin. A to plati i pro spravce sluzeb, protoze ten aby fungoval poradne, tak pouziva cgroups (linux only).
> Když si budu chtít např. postavit jednoduchou distribuci pro SoC desku, která nemá ani ethernet, ani displej s podsvícením ani milion dalších ptákovin, tak si z toho vezmu jen ten init systém a nebudu do toho zatahovat nějakých tři sta tisíc řádků kódu. Můj odhad je, že plnohodnotný init systém by měl jít – i v C – napsat na maximálně pár desítek tisíc řádků.
Vsak muzes. Krome systemd (spravce sluzeb), logind a udevd je vsechno ostatni je volitelny modul. Vzdyt se cely projekt systemd kompiluje do snad 60 binarek.
Takze vazne je takovy problem, ze to maji na githubu v jednom repozitari a ne v 70 (coz samozrejme dava smysl, protoze takhle se to mnohem jednodusi spravuje, vydava atd.) ?
Protoze to je adresar sdilenych hlavickych souboru, kdyz se na to podivas :)
Melo byt https://github.com/systemd/systemd/tree/master/src/core, nejak selhal clipboard.
Ale porad trvam na tom, ze na modularite je uplne jedno, jestli je to v jednom nebo v X ruznych repozitarich.
BTW: nevíte někdo, proč bash completion pro systemd (např. systemctl restart [tab]
) odpovídá tak příšerně pomalu? Vždyť je to psané v céčku ne? Konfiguráky nejsou v XML a žádná Java tam taky není. :-)
Když to srovnám se svým programem SQL-DK – a to jsem pro něj tehdy psal svůj vůbec první bash completion skript – tak ten napovídá okamžitě.
> Problém systemd je v tom, že to není jen init, ale je k jeho zdrojákům příbalena i spousta programů, které tam nepatří, takže je z toho obrovský moloch – nadbytečná komplexita, která může být zdrojem chyb (jak bezpečnostních, tak funkčních).
Tenhle argument slychavam casto a popravde, ani trochu nechapu proc. Skoro vse je v systemd volitelne.
Kdyz se mrknu na svuj pocitac, tak mi tu bezi:
systemd (init + zakladni funkcionalita systemu),journald (logovani),logind (sprava sezeni),udevd (udev)
systemd projekt nikdy nebyl a nemel byt nahranou initu - jedna se o zakladni stavebni kameny userspace systemu, kam logicky veci jako sprava sluzeb, zarizeni, sezeni a zakladni logovani proste patri.
A naopak co se tyka bezpecnosti / chyb, tak toto "pod jednou strechou" vyvijene reseni mi prave proto prijde lepsi - pouziva ho skoro kazda distribuce (vs patlani si na vlastnim koleni u kazde trochu jinak zvlast).
A dále bych poprosil o udevd, kreré je testované i bez systemd. (Protože udev tu byl před systemd, nicméně přešlo pod vývojáře systemd.), to už mi na notebooku taky několikrát zavařilo. (Chyba byla třeba v laptop-mode-tools, protože nepředpokládal, že se udevd bez systemd chová jinak - jinak nastavuje procesgrupy procesům, které spouští.)
Takže teorie o modularitě je tu hezká, jen ta praxe poněkud pokulhává.
Btw., co se týče špatné dokumentace upstartu, která byla v tomhle vlákně zmíněná, tak systemd má máslo na hlavě daleko větší. Nejhorší je ale jeho protlačení distribucemi jako je Debian, bez toho aby byly k dispozici kvalitní/odladěné unit fily. Tady byl vývoj posunut o 10 let zpět, kdy je potřeba znovu ladit start daemou. Například sshd, naprosto klíčový daemon pro správu serveru v debian Jessie. Někdo napsal unit file po rychlém přečtení dokumentace, a nedozvěděl se z toho, že 'systemctl restart sshd zkončí úspěchem, i když následně ssh spadne na chybu v konfiguraci. Zrovna v debianu Jessie je podle mého názoru vadných asi 90% unit filů.
> Tak prosím o systemd bez logind - ten mi rozbíjel konfiguraci ACPI tlačítek, a dělal různou další neplechu
> A dále bych poprosil o udevd, kreré je testované i bez systemd. (Protože udev tu byl před systemd, nicméně přešlo pod vývojáře systemd.), to už mi na notebooku taky několikrát zavařilo. (Chyba byla třeba v laptop-mode-tools, protože nepředpokládal, že se udevd bez systemd chová jinak - jinak nastavuje procesgrupy procesům, které spouští.)
logind i udevd celkem neodmyslitelne patri k zakladnim komponentam userspacu (coz je presne to, co resi systemd - nikoliv nahradu initu, to je jen jedna z funkci). Takze tezko to chtit po autorech systemd, aby psali neco takoveho, kdyz o to sami (RH) nemaji zajem a nezapada to ani do koncepce projektu.
Ale z komunitnich projektu tu existuje eudev a systemd-shim. Ale neni moc duvod tohle chtit po vyvojarich systemd / RH.
Modularitou bylo mysleno, ze velka cast sstemd komponent je volitelna pri kompilaci / instalaci, nikoliv ze je mozne vzit jakoukoliv jeho komponentu a pouzivat ji bez jejich zavislosti :)
> Nejhorší je ale jeho protlačení distribucemi jako je Debian, bez toho aby byly k dispozici kvalitní/odladěné unit fily.
To souhlas, s Debianem sice moc nedelam, ale obecne vetsinu problemu, ktere jsem se systemd zazil, byly horkou jehlou udelane (spatne) unit files.
Takze zase zvasnis o modularite ktera naprosto neexistuje, ostatne jako vsichni fanboyove tyhle sracky.
A protoze ses znamej sklerotickej blb, tak citace "vse je v systemd volitelne" ... hovno hovno co?
Ale vis co, jmenuj JEDNU JEDINOU cast systemd, kterou lze provozovat BEZ systemd. Systemd ZADNOU modularitu nema, a nikdy nemel. Je to jeden gigantickej nefunlkcni blob.
Pokazit se může cokoli i bez systemd. Můžeme se sice bavit o tom, kde je ta pravděpodobnost vyšší, ale nulová není nikdy. Tudíž ze vzdáleného produkčního systému, ke kterému nemám jiný přístup (sériový port i do BIOSu a GRUBu nebo KVM…) než SSH nebo něco podobného běžícího uvnitř toho systému, bych měl nepříjemný pocit a to bez ohledu na to, jestli tam systemd je nebo není.
Jasne, podelat se muze cokoli, za 30let se mi nestalo ze by chcipnul logger, mozna nekomu obcas nejakej chcipnul, pouzivam ruzny. Systemd neloguje se zcela 100% jistotou vzdycky, kdyz je treba resit proc neco nefunguje, protoze odpoved je jednoducha ... protoze systemd se opet posral.
Nekvalitní(sračka) dokumentace je v IT naprostý standard. Pár sekund,minut co by jste lidi strávily zapsáním pár vět může druhému ušetřit hodiny,dny i týdny. Pamatuji jak si vždycky lidi dělaly prdel z Německých manuálů ale na druhou stranu byly obrovské ale obsahovaly skoro každou eventuaiitu.
Sice jsem to nevystudoval, ale programátorstvím se někdy živím, když se mi chce, disponuji znalostmi z mnoha oborů(a taky mi to zabralo spoustu času se to naučit). Dokonce zveřejnuji i tutoriály na netu.
Do svých projektů úkládám vždycky všechno(a to ji manuály v pdf z frameworků v projektu obsažených, komentáře(proč, co, jak , z jakého důvodu jsem se rozhodl pro daný algoritmus, je nezbytné minimum, + samozřejmě vlastní dokumentaci k projektu ve wordu,txt kde si vše zapisuji, různé postupy,apod.. ) , protože si to nechci pamatovat a protože těch projektů mám mnoho.
Dokonce se domnívám, že to je důvod proč lidé evropské mentality jsou úspěšnější než negroidní mentalita, protože my to PÍSMO k zápisu myšlenek jsme vždycky používaly a oni nikoliv.
Výraz "negroidní mentalita" jednoznačně je projev rasismu.
A jinak by mě zajímalo, do které z výše jmenovaných kategorií "debil, imbecil, idiot" bys zařadil člověka, který nezvládá základy pravopisu ani na úrovni ZŠ. Mimochodem, tyto pojmy se v medicíně už nepoužívají, protože jsou v běžném jazyce vnímány jako urážlivé. Ale jestli na nich trváš, bude mi potěšením označit tě za člověka, který ve svém projevu vykazuje mentální schopnosti na úrovni debility.
Do skupiny : Mensa inteligence + podnikatel + nedodělaný doktorát z techniky. Člověk, který se ve volném čase snaží aplikovat tensory 4,5,6 řádu v obecné teorii relativity, do musí stačit.
Ale chápu, že lidé jaky to by za domněnky rádi zase upalovaly. Určitě by se ti líbilo, kdyby domněnky byli i trestné, že? Problémem není rasismus,ale vaše nenávist k těm co jsou od přírody inteligentnější než vy(prostě závidíš šmejde). To je zásadní slabina průměrných lidí jako jsi ty co se jenom šrptaly,šprtaly, nechápaly a prostě nic nedokázaly.
Kdysi i domněnka že země je kulatá byla urážlivá ale to víš, to jsi se našrtal. Takže je načase źačít zakazovat i wiki protože šíří tvz. dle vás rasistické kecy viz. https://en.wikipedia.org/wiki/Negroid nebo jsi snad pro svobodu projevu jako je nejdemokratičštější zemi světa v USA.
Mimochodem nebylo by od věci poukázat na oficiální definici rasismu když se jí tak oháníš, a prosil bych tu universální a nikoliv tu kterou rozšířila Goeblesova nacistická propaganda.
Zatím to ukončuji : pokud nezveřejníš oficiální definici rasismu, ukončuji tuto debatu protože jsme mimo téma tohoto článku. Promin autore, nechaly jsme se unést zajímavou domněnkou, na svou dobu (rok 2018) zjevně velmi revoluční a kontroverzní.
Vždycky se mi líbilo, jak mi lidé kolem mne závidí moji inteligenci. Pak jsem ale zjistil, že ve skutečnosti mě mají u pr*ele a za zády se mi smějí. A to mě neuvěřitelně štve!
A teď bez sarkasmu: lidé tady vám nezávidí vaši inteligenci. Lidé o ní pochybují.
A ještě jedna poučka, z dob vlády Václava Klause a jeho knih o modré planetě: pokud se pokusíte lidi přesvědčit o své inteligenci, tak je leda tak utvrdíte v názoru, že jste magor a narcis.
Hmm, je tam chiba, hrozdne dalsy hrubka. To je kataztrofa.
Na pravopis ti z vysoka mrdám. Smlouvy a dohody, které v podnikání sepisuji mi nikdo ještě z důvodu pravopisu nevypověděl. A mimochodem jsem ješte nezažil by by někdo smlouvu u soudu z důvodu pravopisu chtěl anulovat pokud pravopisná chyba neměnila význam vět.
Ale chápu když lemplům jako ty chybí schopnost myslet a umět myšlenky ukládat do textu, že vám nic jiného nezbývá než řešit pravopis. Na víc prostě intelektuálně nemáš.. Šprti ze základky se poznaj.....
Rád se omluvím, když dokážeš že daná moje pravopisná chyba změnila význam nebo umožnila jinou verzi výkladu(pochopení).
Jenže Ty ve skutečnosti žádné smlouvy a dohody v podnikání nesepisuješ. Podle způsobu Tvého projevu odhaduji, že chodíš nanejvýš do střední školy nebo učňáku. Jedině, že bys sepisoval smlouvy na zednické nebo kopáčské práce. To by možná sedělo... "Postavým zeť a vikopu ďýru..."
Tak ono není písmo jako písmo. Například první Hláskové (abecední, alfabetické) písmo bylo Fénické.
Nejrozšířenější jsou písma založená na písmu starořímském (latince), resp. na jeho předchůdci, písmu starořeckém, které bylo vytvořeno právě na základě písma fénického.
Taky je potřeba si uvědomit, že v době vzniku písma ( a jeho následných poddruhů) nemusela a pravděpodobně nežila v daných zemích etnika která zde žijí dnes.
Následně je potřeba říci, že to že písmo nevzniklo v Evropě neznamená že neplatí: ,,PÍSMO k zápisu myšlenek jsme vždycky používaly a oni nikoliv." (I když s celým tvrzením ,,...proč lidé evropské mentality jsou úspěšnější..." nesouhlasím")
Jestli tohle pri programovani zvladas davat dohromady, tak klobouk dolu.
Sice moc neprogramuji, ale cokoliv jsem kdy (maleho) naprogramoval, zpusobovala mi nutnost delat k tomu dokumentaci stavy blizici se silenstvi z duvodu prepinani myslenkoveho kontextu. Programovani a psani dokumentace mi neprijdou jako navzajem slucitelne cinnosti.
Sice moc neprogramuji, ale cokoliv jsem kdy (maleho) naprogramoval, zpusobovala mi nutnost delat k tomu dokumentaci stavy blizici se silenstvi z duvodu prepinani myslenkoveho kontextu. Programovani a psani dokumentace mi neprijdou jako navzajem slucitelne cinnosti.
To asi záleží na nastavení každého jednotlivce a možná i taky na tom, co programuje. Já taky nejsem programátor (ale admin), občas si něco zbastlím a už se mi stalo, že jsem napsal dokumentaci k programu dopředu a potom jsem jej podle toho napsal. Ale možná je to tím, že mi jde dokumentace lépe a potřeboval jsem si ujasnit myšlenky. A taky možná programovacím jazykem, v pythonu se snažím psát docstringy tak, aby se daly použít rovnou jako zobrazovaný help cli pomocí argparse.
Hele, stran abeced v Africe a tady: srovnej si třeba https://en.wikipedia.org/wiki/Ge'ez_alphabet (9. - 8. stol. BC) a https://en.wikipedia.org/wiki/Latin_alphabet (7. stol. BC). Hm?
Máš problém s chápáním psaného textu:
Např. kde vynalezly kompas? V Asii ale až Evropané jej efektivně využily v námořnictví. Nebo střelný prach, v Číně jej vynalezly ale až my jej využily v dělostřelectví.
Já nemluvil o používání písma ale o ukládní myšlenek do písma. Dneska již miliardy lidí používají písmo ale ne všichni jej používají k ukádání myšlenek. Stačila jenom jedna jediná kniha evropana(evropská mentalita) Isaaca Newtona ( Philosophiæ Naturalis Principia Mathematica ("Mathematical Principles of Natural Philosophy"), ) a všechny texty stvořené https://en.wikipedia.org/wiki/Negroid se jí nemohly rovnat. Protože v ní byli uložené nové a špičkové myšlenky.
Mimochodem, součástí Egyptské říše byli i kmeny https://en.wikipedia.org/wiki/Negroid, takže se dostaly i hieroglyfům. Z čehož vyplívá se dostaly o celá tisíciletí dříve k písmu dříve než Germáni, Slovani, Kelti apod.. A přesto nic revolučního nikdy nepublikovaly. A měly na to celá tisíciletí, během kterých je rozhodně je nikdo nediskrimoval.
Konec, opět odbočujeme od tématu článku.
1. nevím co má su společného se sysv init, už při čtení článku jsem si říkal, co to je za blbost řešit spouštění něčeho přes su, když jsou na to nástroje (jsem holt rozmazlený Debianem) - proč asi pánové nenarazili na stejnou chybu nikde na netu, když se ji snažili vyřešit? Protože nikoho taková věc, spouštět v init věci přes su nenapadla.
2. neřízený ojeb je právě systemd, jen ten dokáže způsobit, že služba jednou z 10 startů nenaběhne, v logu není nic užitečného, příští start je OK, z řádky to ručně nastartuje vždycky bezchybně... To samé při vypínání, jen systemd umí zavěsit shutdown každý n-té vypnutí, s tím, že n je nepředvídatelné náhodné relativně malé číslo. A spoustu dalších radostí, které se sysvinit nikdy neexistovaly. systemd má zajímavé vlastnosti, ale funguje jen teoreticky, v praxi je to s ním občas dost nevyzpytatelné a někdy hodně složitě detekovatelné a řešitelné.
> neřízený ojeb je právě systemd, jen ten dokáže způsobit, že služba jednou z 10 startů nenaběhne, v
Zajimave, ale silne pochybuji ze jde o chybu systemd - spise service files / aplikace.
> To samé při vypínání, jen systemd umí zavěsit shutdown každý n-té vypnutí, s tím, že n je nepředvídatelné náhodné relativně malé číslo. A
Asi chybi v service nastaveni TimeoutSec.
Kazdopadne nevim na jake to mas distribuci, ale s nejvetsi pravdepodobnosti to bude chyba primo v services. Na nekolika set RHEL virtualech jsem ani jednu z techto chyb nevidel - pokud uz se stane, ze se sluzba odmita se ukoncit, tak proste dojde na timeout.
V SD jako takovem si vybavuji jednu chybu tohodle razeni - ze se v nekterych pripadech swap deaktivoval prilis brzy, tudiz pri shutdownu na pretizenem systemu mohlo dojit k aktivaci OOM killeru (a trvalo to dlouho). ael to uz je hezka radka let.
Zajimave, ale silne pochybuji ze jde o chybu systemd - spise service files / aplikace.
Pochybovat můžete, ale to je asi tak všechno.
Asi chybi v service nastaveni TimeoutSec.
Určitě nechybí. Teoreticky uvažujete správně, ale prakticky to neštymuje. :D
Kazdopadne nevim na jake to mas distribuci, ale s nejvetsi pravdepodobnosti to bude chyba primo v services.
Ne není. A nemáme tu jen servery, ale i desktopy, Váš rozhled je velmi omezený.
pokud uz se stane, ze se sluzba odmita se ukoncit, tak proste dojde na timeout.
Kdo říká, že se nějaká služba odmítla ukončit. Zdá se že máte jen málo zkušeností co se systemd týká. Na jednom notebooku dokážu stav replikovat v podstatě se 100% úspěšností. Stačí, že se zavěsí rozjíždějící session a pokud dám povel k vypnutí, systemd se zavěsí v nekonečné smyčce ještě před ukončováním služeb.
Moc si ten experimentální kus softu idealizujete. Kdyby nebyl tak rozlezlý v kde čem a nebyl proto už nutný pro jiné kusy softy (typicky některá DE např.), tak bude nejspíš na distrech stále v experimental větvích.
> Zdá se že máte jen málo zkušeností co se systemd týká.
Mas pravdu, jen par stovek serveru / VM, pak nejake Fedory 27, na laptopu Arch.
Pokud se chces bavit konkretne, hod sem link na bugreport. Predpokladam, ze jsi to reportoval :-)
Jinak je to na urovni jedna pani povidala.
Co se tyka sessions a systemd - jsou tam nejake zname stare (vyresene) bugy - https://github.com/systemd/systemd/issues/2691 a https://github.com/systemd/systemd/issues/2390 - ale to neni rozhodne nic, co popisujes (a tam k normalnimu shutdownu vzdycky dojde + oprava byla prave v .service souboru).
Mas pravdu, jen par stovek serveru / VM, pak nejake Fedory 27, na laptopu Arch.
Očividně to nestačí...
Pokud se chces bavit konkretne, hod sem link na bugreport. Predpokladam, ze jsi to reportoval :-)
To jsem svého času zkoušel, vzhledem k bezradnosti těch, co to mají na starosti a tomu, že jsem si to vždycky nakonec nějak vyřešil sám to už nedělám, je to zbytečná ztráta času. A hlásit to přímo Poeteringovi? Vyřešit to tak, že to prohlásím za feature umím taky - opět zbytečná ztráta času.
Jinak je to na urovni jedna pani povidala.
To vaše určitě :)
Co se tyka sessions a systemd - jsou tam nejake zname stare (vyresene) bugy
Což dle vaší logiky vylučuje neznámé a nevyřešené... Jasně :)
Pro váš klid prohlašuji, že systemd je bezchybný, tahle diskuze s "idealistama", uzavřenýma ve svém výseku světa, kde jim to náhodou funguje a popírající stavy, kdy to prostě nefunguje je zbytečná. ;)
> To jsem svého času zkoušel, vzhledem k bezradnosti těch, co to mají na starosti a tomu, že jsem si to vždycky nakonec nějak vyřešil sám to už nedělám, je to zbytečná ztráta času. A hlásit to přímo Poeteringovi? Vyřešit to tak, že to prohlásím za feature umím taky - opět zbytečná ztráta času.
No tak sup, linky na bugreporty, kdyz jsi to zkousel :-)
> Pro váš klid prohlašuji, že systemd je bezchybný, tahle diskuze s "idealistama", uzavřenýma ve svém výseku světa, kde jim to náhodou funguje a popírající stavy, kdy to prostě nefunguje je zbytečná. ;)
Ja nejsem zadny idealista, me je SD celkem sumak, spoustu veci si dovedu predstavit, ze by delal jinak / lepe / ... Jen konstatuji to, ze pokud vis o nejakych chybach, tak je mas nareportovat.
Pokud jsi je nareportoval, neni nic jednodussiho nez poslat bugreporty.
Pokud jsou ty chyby tak bezne a nereportoval jsi je, jiste neni problem najit nejake bugreporty jinych.
Ja jsem si tu praci s googlenim problemu, co jsi popsal dal a nic potvrzujici tve tvrzeni jsem nenasel.
A nikde netvrdim, ze tam nezname bugy nejsou - zcela jednoznacne jsou (stejne jako v kernelu, glibc, OpenSSH, ....).
Tvrdis neco, pro co jsi neprinesl zadny dukaz. Stejne tak muzu prohlasit, ze LP znasilnuje male deti a upstart zpusobuje zaludecni vredy (i kdyz, s tim by mozna autor clanku souhlasil :-D), argumentacni kvalitu to ma uplne stejnou.
No tak sup, linky na bugreporty, kdyz jsi to zkousel :-)
Nechcete se zklidnit? Nejsem váš podřízený ani nemám potřebu pořád sedět na Rootu, popohánějte si někoho jiného.
Kdo chce, bugrepoty si najde, já už co se týká systemd nerepotuji, vzhledem k přístupu autora k řešení chyb i bezradnosti maintainerů. Čas je drahý, naučil jsem se si s tím poradit různými způsoby, které jsou výrazně rychlejší než zbytečné hlášení a vysvětlování, že to skutečně funguje, že jsem to co mi navrhují dávno vyzkoušel a že to nepomohlo a skončení ve stavu, že nevědí co s tím a nakonec, že to stejně nějak vyřeším sám a hotovo.
Vzhledem k vašemu povýšenému přístupu k diskuzi nepošlu, nemám zájem se s vámi zbytečně dohadovat a vyvracet vám vaše teorie, bez praktické zkušenosti.
Jen konstatuji to, ze pokud vis o nejakych chybach, tak je mas nareportovat.
To u systemd už nedělám, nemá to cenu. U jiných softů s tím problém nemám.
Tvrdis neco, pro co jsi neprinesl zadny dukaz.
Zato vy tvrdíte s důkazy, že? :D :D :D
Na zbytek vašeho příspěvku zbytečné reagovat (obzvlášť o znásilňování dětí, jen se snažíte dát svému prázdnému příspěvku váhu v silných slovech a emotivních nesouvisejících tématech).
> Zato vy tvrdíte s důkazy, že? :D :D :D
Ja jsem linkoval 2 bugreporty.
A obecne plati ze dukazni bremeno nese ten, jez neco tvrdi (v tomto pripade ty).
Chtit po jinych aby bez dukazu akceptovali nejake tvrzeni (navic odporujicich zkusenosti) je prinejmensim detinske.
> To u systemd už nedělám, nemá to cenu. U jiných softů s tím problém nemám.
To je tvoje svobodne rozhodnuti, nicmene pokud uz to nedelas a ty chyby, ktere jsi tu zminoval, jsi reportoval / nasel reportovane, tak neni opravdu nic jednodussiho nez postnout link :-)
> Na zbytek vašeho příspěvku zbytečné reagovat (obzvlášť o znásilňování dětí, jen se snažíte dát svému prázdnému příspěvku váhu v silných slovech a emotivních nesouvisejících tématech).
To je priklad argumenty / dukazy nepodlozeneho tvrzeni. Kdyz to vezmeme do dusledku, tak je to stejna situace jako diskuse o onech zasadnich chybach systemd s tebou - tvrzeni, ktere neni nicim podlozene.
Ja ti klidne verim, ze jsi se sd nejake problemy mel, ja je mel taky, ale to absolutne nevylucuje moznosti, ze
a) delas neco spatne
b) autor tve distribuce udelal neco spatne
c) je chyba v sd
Vetsina "chyb" sd, co jsem videl / cetl (vazici se napr. k zastavovani sluzeb) byla v dusledku zpusobena spatnymi .service a nikoliv chybou v samotnem sd. Tot moje zkusenost.
Ty jsi tvrdil neco jineho, ja po tobe chtel odkaz na bugreport (ktere jsem i sam zkousel hledat), ty jsi zadny nedostal a rozcilujes se, ze ti to neverim jen proto, ze to tvrdis :-) Tot ve strucnosti cela tahle diskuse.
A obecne plati ze dukazni bremeno nese ten, jez neco tvrdi (v tomto pripade ty).
Začínám mít pocit, že jste nějakým způsobem vyšinutý. Nejsme u soudu a nemám potřebu zrovna vám něco dokazovat. Už jsem vám jasně dal najevo, že o diskuzi s vámi nestojím, tak mi není jasné, co na tom nechápete a proč se mě do ní neustále snažíte zatáhnout. Ale možná to je jen projev toho, jak si z mých příspěvku vyberete co se vám hodí a "přehlížíte" zbytek, takže jste přehlídl i můj nezájem s vámi diskutovat potažmo vám něco dokazovat.
tak neni opravdu nic jednodussiho nez postnout link
"Nechci" pro vás není odpověď, že? Začínáte být otravný až vlezlý. Akceptujte prosím, že NECHCI, děkuji.
a rozcilujes se, ze ti to neverim jen proto, ze to tvrdis
1. Nerozčiluji se (proč taky, kvůli nějaké virtuální diskuzi po netu?)
2. Jestli mi to věříte nebo ne je mi úplně šuma fuk, takže jste i v tomto úplný mimoň, vaše neustálé mylné předpoklady, na kterých lpíte jako na axiomech jsou dost podstatnou chybou.
> Zajimave, ale silne pochybuji ze jde o chybu systemd - spise service files / aplikace.
Pak je ale chyba systemd nebo jeho dokumentace, že takové service files vznikají často.
> Asi chybi v service nastaveni TimeoutSec.
Ano ano, zase práce, která byla v SysV initu vyřešená, byla zahozena abychom objevili kolo znovu.
> Kazdopadne nevim na jake to mas distribuci ...
Nevím jakou distribuci má ByCzech, ale mám pocit, že většina non-redhat distribucí neměla možnost konzultovat s vývojáři systemd na obědě, a podle toho zavedení systemd dopadlo. Ať žije dokumentace. Pokud má totiž maintainer balíčku napsat service file měl by vědět co si má o programu vůbec zjistit. Protože například vývojáři zdokumentovali jen to co považovali za podstatné a start vyřešili dodáním init skriptu. Kdyby systemd umožňoval příčetné evoluční přejití se sysV initu na systemd, tak by nejspíš tolik zlé krve nebylo. Systemd sice umí vygenerovat servicu když vidí sysv init skript, ale výsledek je to horší z obou světů. O zachování plné kompatibility se sysv se tu mluvit nedá, a revoluce bolí. Podle mnohých bolí výrazně víc, než je nezbytně nutné.
> Pak je ale chyba systemd nebo jeho dokumentace, že takové service files vznikají často.
A chybou Ritchieho je to, ze se v C pisi derave programy... No jasne :-)
> Ano ano, zase práce, která byla v SysV initu vyřešená, byla zahozena abychom objevili kolo znovu.
Prave, ze nebyla vyresena vubec a kazdy init skript si to musel bastlit po svem vice ci mene blbe.
> Nevím jakou distribuci má ByCzech, ale mám pocit, že většina non-redhat distribucí neměla možnost konzultovat s vývojáři systemd na obědě, a podle toho zavedení systemd dopadlo. Ať žije dokumentace.
Pokud srovnam dokumentaci systemd a v podstate skoro jakehokoliv sysvinitu z predchozich dob na Linuxu, tak mi z toho jednoznacne vychazi lepe systemd. Typicky init predtim byla smes bashovych funkci, povetsinou bez jakekoliv dokumentace.
> Pokud má totiž maintainer balíčku napsat service file měl by vědět co si má o programu vůbec zjistit. Protože například vývojáři zdokumentovali jen to co považovali za podstatné a start vyřešili dodáním init skriptu. Kdyby systemd umožňoval příčetné evoluční přejití se sysV initu na systemd, tak by nejspíš tolik zlé krve nebylo. Systemd sice umí vygenerovat servicu když vidí sysv init skript, ale výsledek je to horší z obou světů. O zachování plné kompatibility se sysv se tu mluvit nedá, a revoluce bolí. Podle mnohých bolí výrazně víc, než je nezbytně nutné.
Pochopitelne, diky tomu, ze sysv init je smes bashovych skriptu, neda se zadnym zpusobem rozumne sparsovat (protoze to neni deklarativni konfigurace, ale imperativni zapis kroku), tak pochopitelne vsechny tyhle konverze jsou odsouzeny k zahube.
Ale napr. pokud vezmu Archlinux, systemd tam pouzivam skoro od zacatku a krom nekolika pocatecnich porodnich bolesti to vzdy fungovalo celkem bezne, posledni leta naprosto bezproblemu.
A myslim, ze autori Archlinuxu na obed s LP nechodi :-D
> Pokud srovnam dokumentaci systemd a v podstate skoro jakehokoliv sysvinitu z predchozich dob na Linuxu, tak mi z toho jednoznacne vychazi lepe systemd. Typicky init predtim byla smes bashovych funkci, povetsinou bez jakekoliv dokumentace.
To není pravda. Sys-V init je pouze infrastuktura která říká JAK se ty init skripty spouštějí. Vše si pak implementuje autor/maintainer/správce sám, a potřebuje na to znalost shellu, kterou tak jako tak doposud při práci v *nixu potřeboval. To že dokumentace obsahuje jen málo věcí neznamená, že tam je spousta nezdokumentovaných věcí. Ty v tom systému prostě nejsou, takže nepotřebují dokumentovat. A vzhledem k tomu, že ten systém se nesnažil vytlačit jiný systém, tak nepotřeboval dokumentaci běžných usecases. Místo toho existovala dokumentace k tomu jak se má chovat správný daemon (dvojitý fork, zavření stdin/stdout, ...) a považovalo se to za dokumentaci toho jak má být správně napsaná služba (nikoli za dokumentaci init systému). Systemd to bere na sebe, takže to musí zdokumentovat, a snaží se přebrat pod sebe i služby které byly napsané pro sys-V init. Takže by měl obsahovat dokumentaci správného přechodu těchto služeb. (Viz dokumentace upstartu a jeho expect fork.) To že se do stable verze tak velké distribuce jako je Debian dostane špatně napsaný service file pro tak klíčovou službu jako je ssh považuji za fail jak Debianu tak dokumentace systemd.
Ano přesně tak. Někdo napsal SysV init kdysi velmi jednoduše, protože nechtěl/neměl sílu řešit co bude pod tím. A vznikl čurbes, se kterým se většina lidí naučila žít, a v leckterých distribucích ho i uměli docela dobře uklidit. (V debianu jsem se SysV init skripty neměl problém. Většina jich navíc používá společnou shellovou knihovnu.) Systemd sám o sobě je krokem vpřed (a často i stranou, ale o tom se teď nebavíme), ale způsob jeho zavádění je krok vzad.
> Pochopitelne, diky tomu, ze sysv init je smes bashovych skriptu, neda se zadnym zpusobem rozumne sparsovat (protoze to neni deklarativni konfigurace, ale imperativni zapis kroku), tak pochopitelne vsechny tyhle konverze jsou odsouzeny k zahube.
No a právě proto je lepší se nezkoušet dělat automatické konverze ale místo toho udělat rozumný sysVinit wrapper, který bude sysV emulovat dobře.
> No a právě proto je lepší se nezkoušet dělat automatické konverze ale místo toho udělat rozumný sysVinit wrapper, který bude sysV emulovat dobře.
Nebo nedelat zbytecnou praci s udrzovanim kompatibility s necim, co melo umrit uz davno, a proste to prevest na robustnejsi .service, jak to udelaly vsechny majoritni distribuce :-)
Ano, to je přesně ten rozdíl ;-). Autorům se podařilo najít, kde při konfigurování udělali chybu. V případě, že by bylo použito systemd, by akorát mohli konstatovat: „že to nefunguje“.
Dále autoři zjistili, že:
a) pokud něco bastlí pro produkci, měli by to opravdu důkladně otestovat, nejlépe ještě před nasazením,
b) pokud něco testují, měli by k tomu používat to, co bude v reálném nasazení, a to nejen přesně stejný OS, ale i přesně stejnou verzi (získanou nejlépe klonováním provozního systému)
> pokud něco bastlí pro produkci,
A to je prave ono - ze se to musi bastlit a ani takova zakladni vec, jako rizeni procesu / uzivatelu neni resena v ramci upstartu.
Pokud by pouzili systemd (nebo cokoliv jineho, to neni zadna super feature tohle - daemon tools by to zvladli tez, stejne tak jako jakykoliv jiny rozumny service manager), tak by proste napsali neco ala:
...
[service]
Type=simple
User=xxx
Group=xxx
Environment=JAVA_HOME=/usr/java/jdk1.8
ExecStart=/opt/kafka/bin/zookeeper-server-start.sh /opt/kafka/config/zookeeper.properties
ExecStop=/opt/kafka/bin/zookeeper-server-stop.sh
...
A tenhle problem by se nikdy nestal.
Ale kdyz i pro takove triviality service manager nuti administratora bastlit, tak je to samozrejme zasadni problem.
Možná by stálo za to zjistit si, co je to ten sticky bit, o kterém píšete.
Nejznámější binárka se sticky bitem býval /bin/sh, pokud teda ještě někdo pamatujete, k čemu na staré SVR3 sticky bit sloužil. To, co jste nejspíš měli na mysli, a co má /usr/bin/su nastavené, se jmenuje set-uid bit.
Pro autora clanku: rozbita data Kafky neresite sami. Na IT konferencich jsem si vsiml, ze lide od Kafky prechazeji jinam prave z duvodu reseni tech vzniklych nekonzistenci.
Kafku mam u sebe lokalne pro testy a nechovam se k ni dobre, urcite se nezdrzuji a kill delam vzdy s tim ze pred pristim startem data promazavam. Doufam jen, ze spravci produkcni Kafky u nas nedelaji totez co ja na lokale, je potreba zabijet ciste.
Ehh... spousta tradičních démonů má v konfiguráku řádek nebo dva, pod jakým uživatelem a skupinou má běžet. Spustí se klidně jako root, pozotvírá co potřebuje (a může jenom pod rootem) a vzápětí sám provede setuid. Například:
http://www.proftpd.org/docs/howto/ConfigFile.html#Identity
V uvedeném popisu je dále rozlišován "skutečný" uživatel/skupina vs. "efektivní" uživatel/skupina - tato nuance je mimo moje dosavadní poznání, jenom na ni upozorňuji protože mě zaujala.
Další documentace:
http://man7.org/linux/man-pages/man2/setuid.2.html
http://man7.org/linux/man-pages/man2/setgid.2.html
http://man7.org/linux/man-pages/man2/seteuid.2.html
...atd
= kdyby to kafka řešila sama, není co řešit zvenčí.
Proc by to mela resit Kafka?
Kafka to neresi, stejne jako vsechny ostatni multiplatformni reseni, ktere si nechteji zanaset kod platformne zavislymi volanimi (navic Kafka je v Jave, takze tam volani set*id neni k dispozici z duvodu, ze Java obecne platformne specificke API nepodporuje - coz je dobre).
Jenže změna uživatele je přesně to, co Kafka, web server, databázový server ani jiná služba dělat nemá. Starat se o to má právě správce služeb. Je zajímavé, jak odpůrci systemd (zrovna v tomhle vlákně tedy nejsou) vždy mluví o unixovém principu, kdy jeden program dělá jen jednu věc, a pak přijdou s tím, že webový server samozřejmě má nastavit limity, nastavit cgroups, zbavit se zbytečných capabilities, změnit uživatele, odpojit se od terminálu, logovat – jo a když bude mít čas, mohl by taky servírovat nějaké webové stránky.
A taky se o to prakticky kazdy spravce sluzeb stara, krome techto starych sysv-like initu...
Ale jinak naprosty souhlas, tohle je presne odpovednost spravce sluzeb.
A kdyz se tento princip dodrzuje, tak pak napr. taky daemon dobre funguje v kontejnerech - protoze dela jen presne to, co ma a neresi blbosti, co nema (a ktere za nej muze resit docker - napr. zmenu uid, o logovani ani nemluve).
To není 100% pravda. Například web-server na běžném OS pořebuje privilegium poslouchat na portu 80 (tedy menším než 1024). Takže musí nejdřív začít poslouchat a potom změnit uživatele. Pokud ovšem za něj začne poslouchat správce služeb, tak se najednou musí správce služeb postarat, aby ta socketa měla nastavené vše co ten webserver potřebuje a musí rozumět síťovému stacku*. Spousta dalších služeb také potřebuje privilegovaný přístup k nějakým dalším prostředkům, ale jinak běžet neprivilegovaně. To se nejlépe řeší tím, že se jim poskytne API/ABI. Zvenčí to chce jen zajistit aby ta služba neměla přístup k věcem ke kterým mít přístup nemá. Na to mi v tradičním systému stačí code-review kódu před vzdáním se rootovských práv.
* tohle autoři systemd řeší pomocí socket-activation. Pak ale nastavím socket-activation službu a nevím, že je služba rozbitá, dokud se doopravdy něco nepokusí přistoupit na tu socketu. V produkčním prostředí děkuji, ale nechci.
To není 100% pravda. Například web-server na běžném OS pořebuje privilegium poslouchat na portu 80 (tedy menším než 1024). Takže musí nejdřív začít poslouchat a potom změnit uživatele.
To není pravda. Buď může mít proces capability pro naslouchání na privilegovaném portu, nebo mu může příslušný socket předat správce služeb.
Pak ale nastavím socket-activation službu a nevím, že je služba rozbitá, dokud se doopravdy něco nepokusí přistoupit na tu socketu.
To platí jedině v případě, kdy je ta služba odfláknutá. Když se ta služba bude chovat aspoň trochu rozumně, tak se v případě problémů ukončí.
A k čemu mi je správné ukončení když se ta služba ani nespustí? Já potřebuju aby ta služba byla funkční, což se nahrazením kofiguráků a případným reloadnutím systemd nedozvím, protože ke skutečnému spuštění a tedy přeparsování konfiguráků služby a vyhlášení chyby dojde až s prvním přístupem na socketu.
@Jirsak 19:44:
rika se nekrm trolla, ale nemuzu si pomoct:
nezodpovedny package maintainer prehodil sshd v debianu na systemd unitu forking. Tim ale vyradil kontrolu toho, ze sshd bude umet vytvorit listening socketu na portu 25. Systemctl (re)start sshd tvril ze je vse v poradku. Nicmene sshd nebezelo.
> nezodpovedny package maintainer prehodil sshd v debianu na systemd unitu forking. Tim ale vyradil kontrolu toho, ze sshd bude umet vytvorit listening socketu na portu 25. Systemctl (re)start sshd tvril ze je vse v poradku. Nicmene sshd nebezelo.
To je neprijemne. Ale jako je to poznatek na urovni toho, ze kdyz udela package maintainer krpu, muze to rozbit system. Stejne tak se dalo udelat milion jinych problemu v sysv initu. To je neresitelny problem.
> To je neprijemne. Ale jako je to poznatek na urovni toho, ze kdyz udela package maintainer krpu, muze to rozbit system. Stejne tak se dalo udelat milion jinych problemu v sysv initu. To je neresitelny problem.
Pouze do te doby, dokud je sam. V Debian Jessie je ale vadnych vice nez polovina service filu (subjektivni mereni, vychazejici z toho, ze 90% sluzeb ktere pouzivame ma v Debian jessie spatny service file, vetsinou to nevadi a naucili jsme se s tim zit, ale v nekterych pripadech to vede k jeste horsim chybam.)
> To není 100% pravda. Například web-server na běžném OS pořebuje privilegium poslouchat na portu 80 (tedy menším než 1024). Takže musí nejdřív začít poslouchat a potom změnit uživatele. Pokud ovšem za něj začne poslouchat správce služeb, tak se najednou musí správce služeb postarat, aby ta socketa měla nastavené vše co ten webserver potřebuje a musí rozumět síťovému stacku*. Spousta dalších služeb také potřebuje privilegovaný přístup k nějakým dalším prostředkům, ale jinak běžet neprivilegovaně. To se nejlépe řeší tím, že se jim poskytne API/ABI. Zvenčí to chce jen zajistit aby ta služba neměla přístup k věcem ke kterým mít přístup nemá. Na to mi v tradičním systému stačí code-review kódu před vzdáním se rootovských práv.
Proc to delat dobre, kdyz to jde delat uplne blbe, ze :)
Navic to neni absolutne pravda, existuje mnohem lepsi reseni (a dokonce nekolik) - pridat procesu capability (napr. poslouchat na privilegovanem portu), pak zadne prava roota nepotrebuje a muze bezete rovnou pod neprivilegovanym uzivatelem.
Doporucuji dostudovat POSIX Capabilities, je to docela uzitecne :)
Druhou moznosti je socket activation, ale to je trochu na neco jineho.
> * tohle autoři systemd řeší pomocí socket-activation. Pak ale nastavím socket-activation službu a nevím, že je služba rozbitá, dokud se doopravdy něco nepokusí přistoupit na tu socketu. V produkčním prostředí děkuji, ale nechci.
Socket activation totiz neni primarne urceny na reseni poslouchani na portu < 1024, ale pro sluzby, ktere nemaji bezet porad, ale jen tehdy, kdyz jsou potreba :) A samozrejme to ma dusledek ten, ze se ... sluzba spustti az tehdy, az je potreba.
Pro permanentne bezici sluzby je to nevhodne.
Btw, nemas na produkci healthcheck a monitoring? Spolehat na to,ze sluzba funguje, kdyz bezi proces - diky, ale to bych nechtel :)
> Btw, nemas na produkci healthcheck a monitoring? Spolehat na to,ze sluzba funguje, kdyz bezi proces - diky, ale to bych nechtel :)
Samozřejmě, že mám. Jen poukazuju na to, že na produkci vnáší socket-activation výrazně větší složitost do orchestračních nástrojů, protože když se orchestrační nástroj nedozví okamžitě, že tam nahrál syntakticky špatný konfigurák, tak se z používání takového orchestračního nástroje administrátor téměř okamžitě zblázní.
> Samozřejmě, že mám. Jen poukazuju na to, že na produkci vnáší socket-activation výrazně větší složitost do orchestračních nástrojů, protože když se orchestrační nástroj nedozví okamžitě, že tam nahrál syntakticky špatný konfigurák, tak se z používání takového orchestračního nástroje administrátor téměř okamžitě zblázní.
Tak ho nepouzivej, je to feature primarne pro desktop a obcas bezici sluzby :) Na permantne bezici sluzby to neprinasi temer zadne vyhody.
Je to stejna situace jako za davny casu s inetd - uplne ten stejny problem, uplne ty stejne issues, to je dane principem celeho reseni.
> Zmena uzivatele je dostupna snad na vsech platformach, kde java bezi. A tam kde ne, to java muze resit stejne jako treba nedostupnost site nebo grafickyho prostredi, coz jsou samozrejme taky plaforme zavisly veci, ktery java musi resit jako spoustu dalsich platforme zavislych veci.
A proc by to mela resit ? Ono to otvira spoustu problemu - kdyz muzu zmenit na jine (E)UID, je EUID vzdy k dispozici? Nebo mam menit UID? Co kdyz to chci podle jmena uzivatele - je potreba pridat API pro pristup k databazi uzivatelu?
Takze ne, takove veci do Javy opravdu nepatri, tam patri cross platform API.
Navic krome starickeho sysvinitu (a stare verze upstartu) to vsechny platformy podporuji - systemd, openrc, launchd (MacOS), Windows Service Host (ci jak se to tam jmenuje) to umi...
Tohle by si program/služba nikdy neměl řešit sám – programy/služby by měly být navzájem izolované, aby nemohly ovlivnit data jiných programů/služeb/uživatelů. Ostatně proto je to víceuživatelský systém – jednotliví uživatelé by měli mít možnost si víceméně prasit, co chtějí, ale systém by se měl postarat o to, aby neohrožovali jiné uživatele.
Pod rootem by toho mělo běžet naprosté minimum a jen to, čemu můžeš věřit – tzn. měl bys mít možnost si stáhnout z internetu / mimo distribuci nějakou aplikaci, které nemusíš až tak úplně věřit, založit jí uživatelský účet a spouštět ji pod ním, aniž by ses musel bát, že ti poškodí zbytek systému – což znamená, že ta aplikace nikdy nesmí mít práva roota.
Pak je ovšem potřeba vymyslet systém práv, který dovolí otevřít poslouchání na TCP portu 80 třeba jen uživateli www-data, nedej bože, že bych chtěl aby na každou IP systému (která může být přidělena dynamicky) byl pro port 80 jiný povolený uživatel. A spousta podobných věcí. Není to nemožné, jen je to spousta práce, a výrazné přepsání současného systému oprávnění. Pokud se nechá řízení na aplikaci, tak alespoň víte, že nevyvíjíte něco co nakonec třeba ani nikdo nepoužije.
Pak je ovšem potřeba vymyslet systém práv, který dovolí otevřít poslouchání na TCP portu 80 třeba jen uživateli www-data
Systém práv na to není potřeba vymýšlet – řeší se to tak, že že správce služeb má práva root
a, zbaví se ostatních capabilities mimo CAP_NET_BIND_SERVICE
, přepne se na uživatele www-data
a pak nahradí proces procesem webového serveru.
> Není to nemožné, jen je to spousta práce,
Spousta prace to asi byla takovy system vytvorit, nemam nejmensich pochyb, ze behem vyvoje kernelu 2.1 nekdy v roce 1998 se na tom vyvojari nadreli :-)
Od kernelu 2.2 (vydan v roce 1999) mame capabilities, ktere presne tohle umoznuji - viz man 7 capabilities. Od kernelu 2.6 (rok 2003) se neda z kernelu jejich podpora ani vypnout.
Ano máme. A jsou linux-specifické. Takže tam kde jsme měli portabilní programy (SysV není jen linuxová záležitost), tak se nic nezměnilo (alespoň dokud se nenašel někdo komu by se to chtělo portovat). A tam kde programy portabilní nebyly tak je to jedno, stejně mají linux specifický kód. Jesli se v něm volá libdaemonize nebo libsystemd je mi šumák.
Zatraceně, vytratila se mi pointa. A navíc jsem si tu manpage přečetl napoprvé špatně, protože je ta manuálová stránka napsaná tak aby bylo jasné jak se řeší SUID bit na souboru. Tady jsme ale v jiné situaci.
Přijde mi, že capabilities je pěkný systém jak udělat hardening, ale stále mi nerozliší, že uživatel www-data-4 smí poslouchat jen na 1.2.3.4:80 a uživatel www-data-5 jen na 1.2.3.5.80. Takže stále musím věřit aplikaci, že si vezme ten správný resource. A pokud neobsahuje linux-specifický kód tak se práva CAP_NET_BIND_SERVICE umí vzdát jen jediným způsobem: změnou uživatele z roota na neroota. Vůbec se neodvažuji tady pomyslet na aplikace, které se práv po inicializaci nevzdají, jen proto, že "už jich přece nemají tolik, tak proč to řešit".
Pokud budete chtít z tohoto důvodu CAP_NET_BIND_SERVICE aplikaci vůbec nedat, potřebujete aby váš init systém uměl rozumět prostředkům, které té službě předává (listen socketa na port 80), to už není moc KISS, a vždy přijde někdo s další třídou prostředků, které je do toho potřeba doimplementovat. Tohle by bylo hezké, kdyby to bylo řešeno jako obecná rozšiřitelnost, a ne jen řešení jednoho konkrétního případu (síťový subsystém).
Pokud bude mít aplikace linux-specifický kód, starající se o inicializaci (zahození CAP_NET_BIND_SERVICE), tak už mě neuráží, že se má starat i o to, aby správně běžela v historickém sys-V initu. A pokud pak systemd vyžaduje jinou sekvenci spouštění, má ji vyžadovat, místo toho aby tvrdil, že takovou aplikaci (napsanou pro sysV) umí spustit bez ztráty spolehlivosti spuštění.
Vůbec se neodvažuji tady pomyslet na aplikace, které se práv po inicializaci nevzdají, jen proto, že "už jich přece nemají tolik, tak proč to řešit".
Právě proto je dobré mít moderního správce služeb. Pak v té aplikaci nemusíte mít žádný kód specifický pro linux, nespouštíte jí pod rootema nemusíte se spoléhat na to, že se vzdá práv. Prostě jí spustíte pod správcem služeb, který se vzdá nepotřebných capabilit, změní uživatele a pak svůj proces nahradí procesem služby.
potřebujete aby váš init systém uměl rozumět prostředkům, které té službě předává (listen socketa na port 80)
Ne, nepotřebujete, viz popis výše. Už to tu popisuju podruhé, tak to snad konečně vezmete na vědomí.
@Jirsak 19:42
> Ne, nepotřebujete, viz popis výše.
Tak teď si přímo protiřečíte. Pokud nerozumí prostředkům, tak se nemůže vzdát capabilit na získání těch prostředků, a pak spustit aplikaci. Jak by se ta aplikace k těm prostředkům dostala? Buď nechá capability na získání těch prostředků aplikaci, ať se jich vzdá sama po inicializaci, nebo umí ty prostředky pro tu aplikaci obstarat. Pokud je umí obstarat, tak jim rozumí.
ebik, 19:57: Jenže on se nevzdává capabilit pro získání těch prostředků, vzdává se všech ostatních capabilit. Že by se vzdal i té capability pro získávání potřebných prostředků je velmi výjimečný případ a linux pro to holt prostředky neposkytuje. Asi by se to využilo jen pro tu capabilitu naslouchání na privilegovaných portech, navíc u aplikací, u kterých není možné obnovit konfiguraci za běhu. Navíc chyba, že by aplikace začala nečekaně naslouchat někde, kde nemá, je dost nepravděpodobná a ne moc nebezpečná.
@Jirsak, 20.1. 21:21
> Že by se vzdal i té capability pro získávání potřebných prostředků je velmi výjimečný případ
Tak to ani omylem. Většina serverů co znám, tak má master proces, který jenom spawnuje "workery" (nebo jen jednoho workera). Ten master server si ponechává roota a získává prostředky, a ty workeři již na získání dalších prostředků práva nemají.
>Navíc chyba, že by aplikace začala nečekaně naslouchat někde, kde nemá, je dost nepravděpodobná a ne moc nebezpečná.
Nebezpečné je pokud se aplikace (díky například buffer overflow nebo underrun) zmocní útočník. Může aplikaci přinutit poslouchat třeba na portu 22 (pokud předtím odstřelil ssh, třeba oom killem) jen proto, aby získal víc času. Nebo na nějakém jiném portu (třeba na portu LDAPu, aby odchytil přihlašovací hesla do legacy systémů napojených na LDAP). A zrovna třeba webservery jsou tak častým případem serverů, že někdo neustále hledá nějakou jejich zranitelnost.
> Zapoměl jsem dopstat, že master proces se stará pouze o konfiguraci a inicializaci. Takže je jen malá šance, že ho chyba ve workeru nějak ovlivní. Naopak workeři dělají veškerou práci, takže téměř celý attack surface je na workerech a ne na masterovi.
Porad mnohem vetsi nez pokud ten maste proces ty root prava vubec nema.
Takze attack surface je zde mnohem vetsi nez v pripade, ze master proces pod rootem nebezi, ma jen extra cap na poslouchani. A pokud se k tomu prida SELinux policy, ktera omezi na kterych portech muze poslouchat, tak tu tenhle attack surface mizi uplne.
> Tak to ani omylem. Většina serverů co znám, tak má master proces, který jenom spawnuje "workery" (nebo jen jednoho workera). Ten master server si ponechává roota a získává prostředky, a ty workeři již na získání dalších prostředků práva nemají.
Jop, presne, ponechava si roota, protoze .... musi :-D A ten mu zustane, takze jakakoliv chyba tam je skutecne zasadni prusvih (protoze child procesy typicky s master procesem nejak komunikuji).
S capabilities se tam root vubec neobjevi, tudiz moznosti zneuziti jsou vyrazne mensi (navic muze mit capabilities opravdu hodne osekane, tudiz nemusi mit ani ty standardne dostupne pro neprivilegovaneho uzivatele).
> Nebezpečné je pokud se aplikace (díky například buffer overflow nebo underrun) zmocní útočník. Může aplikaci přinutit poslouchat třeba na portu 22 (pokud předtím odstřelil ssh, třeba oom killem) jen proto, aby získal víc času. Nebo na nějakém jiném portu (třeba na portu LDAPu, aby odchytil přihlašovací hesla do legacy systémů napojených na LDAP). A zrovna třeba webservery jsou tak častým případem serverů, že někdo neustále hledá nějakou jejich zranitelnost.
Zase, tohle resi SELinux policy. Pak muze daemon poslouchat jen na tech portech, na ktere ma skutecne pravo a na zadnem jinem.
> Jop, presne, ponechava si roota, protoze .... musi :-D
Musely v dobe pred capabilities. Bylo by ale demenci toto chovani (vzdani se prav ve workerovi) zahodit, kdyz uz je to jednou napsane. Navic to ze ma aplikace roota, NEZNAMENA, ze ma vsechny capabilities. Pokud jsem cetl manualovou stranku dobre, tak se lze snadno JAKO ROOT vzdat nekterych capabilities (a nemoct je pak ziskat zpet), a naopak zmenou uzivatele na neroota prijdu o VSECHNY capabilities, ktere normalni uzivatel nema (i pravo poslouchat na portu 80).
ebik 9:24: proč tu pořád opakujete ty vaše nesmysly, když vám tu minimálně dva lidi vysvětlili, jak to je? Tak ještě jednou. S moderním správcem služeb to funguje tak, že správce služeb vytvoří pod rootem nový proces (stále je to proces správce služeb), ten se následně zbaví nepotřebných capabilit, nastaví limity, změní uživatele na neprivilegovaného a na závěr proces nahradí procesem spouštěné služby. Proces spouštěné služby se tedy spouští pod neprivilegovaným účtem a práva roota nikdy nemá, má např. capabilitu pro naslouchání na privilegovaném portu (pokud ji správce systému v konfiguraci té služby povolil) a o capabilities nemusí vědět vůbec nic. Poku do nich něco ví, může se při spouštění workeru vzdát i té capability pro naslouchání na privilegovaném portu.
Takže rozdíl v tom vašem přístupu a přístupu moderních správců služeb je v tom, že vy spouštíte řídící proces s právy roota a doufáte, že se jich alespoň při spuštění workeru vzdá, zatímco moderní správce služeb spustí i ten řídící proces s omezenými právy. Přestaňte tedy prosím pořád vykládat o tom, jak je strašně výhodné spouštět proces s právy roota, i když je vůbec nepotřebuje. Výhodné to není, je to nebezpečné.
> Ano máme. A jsou linux-specifické. Takže tam kde jsme měli portabilní programy (SysV není jen linuxová záležitost), tak se nic nezměnilo (alespoň dokud se nenašel někdo komu by se to chtělo portovat). A tam kde programy portabilní nebyly tak je to jedno, stejně mají linux specifický kód. Jesli se v něm volá libdaemonize nebo libsystemd je mi šumák.
Linux specificke? Proc se jim rika POSIX Capabilities tedy? Ano, puvodni POSIX draft 1003.1e je stazeny, ale tj celkem fuk, Linux neni jedina implementace.
Navic i kdyby byla, je to jedno, viz nize.
> Přijde mi, že capabilities je pěkný systém jak udělat hardening, ale stále mi nerozliší, že uživatel www-data-4 smí poslouchat jen na 1.2.3.4:80 a uživatel www-data-5 jen na 1.2.3.5.80. Takže stále musím věřit aplikaci, že si vezme ten správný resource. A pokud neobsahuje linux-specifický kód tak se práva CAP_NET_BIND_SERVICE umí vzdát jen jediným způsobem: změnou uživatele z roota na neroota. Vůbec se neodvažuji tady pomyslet na aplikace, které se práv po inicializaci nevzdají, jen proto, že "už jich přece nemají tolik, tak proč to řešit".
Na tohle neslouzi caps, ale selinux policy, ta presne resi, ze program X muze poslouchat na portu Y a zadnem jinem.
> Pokud budete chtít z tohoto důvodu CAP_NET_BIND_SERVICE aplikaci vůbec nedat, potřebujete aby váš init systém uměl rozumět prostředkům, které té službě předává (listen socketa na port 80), to už není moc KISS, a vždy přijde někdo s další třídou prostředků, které je do toho potřeba doimplementovat. Tohle by bylo hezké, kdyby to bylo řešeno jako obecná rozšiřitelnost, a ne jen řešení jednoho konkrétního případu (síťový subsystém).
Vubec ne, zakladem je to, ze program pod root uzivatelem vubec nespustim, spustim ho jako neprivilegovany uzivatel (tzn. to, kam se dostane bezny sysv daemon) + navic mu dam urcite specificke caps navic. A nebo mu caps i normalniho neprivilegovaneho uzivatele jeste odeberu.
> Pokud bude mít aplikace linux-specifický kód, starající se o inicializaci (zahození CAP_NET_BIND_SERVICE), tak už mě neuráží, že se má starat i o to, aby správně běžela v historickém sys-V initu. A pokud pak systemd vyžaduje jinou sekvenci spouštění, má ji vyžadovat, místo toho aby tvrdil, že takovou aplikaci (napsanou pro sysV) umí spustit bez ztráty spolehlivosti spuštění.
Prave ze ta aplikace nemusi mit vubec zadny linux specific kod. Muze byt napsana v ANSI C, stejne zdrojaky muzou fungovat na FBSD, Linuxu, Windows, Darwinu, ....
Proste a jenom se udela .service, v ni definuje pod jakym uzivatelem to ma bezet, prip. jak se omezi capabilities (prip pridam dalsi caps na binarku pres setcap). A ten program se nemusi starat vubec o nic. Je to lepsi, bezpecnejsi a jednodussi.
> Pokud bude mít aplikace linux-specifický kód, starající se o inicializaci (zahození CAP_NET_BIND_SERVICE), tak už mě neuráží, že se má starat i o to, aby správně běžela v historickém sys-V initu. A pokud pak systemd vyžaduje jinou sekvenci spouštění, má ji vyžadovat, místo toho aby tvrdil, že takovou aplikaci (napsanou pro sysV) umí spustit bez ztráty spolehlivosti spuštění.
No a nebo se toho prava nevzda. S nastavenim caps v serivce nemuze v systemu nic, diky SELinuxu muze akorat znovu... poslouchat na svem portu :)
A nezasvini se kod platformne specifickymi vecmi.
Jednoznacn mnohem lepsi reseni nez to, co delaji daemony diky sysv - seteuid (cimz se rozhodne nezbavi vsech caps, ale pouze tech, ktere jsou navic dane root uzivateli oproti jinemu).
Nebojte mě, ale vždycky jsem si myslel že setuid po startu služby je povinna operace a nenapadlo by mě, že to některá kritická aplikace (databáze) nemá.
By mě ani ve snu nenapadlo spouštět službu přes su. A její killeni mi automaticky vede na vykřičník v hlavě - tím přece zabíjí to su ne?
BTW: žádná z mých aplikací běžící na Linuxu jako služba k ukončování nepoužívá kill a ani jiné signály. Většinou je místo pidfile socket a tím lze běžící službě možné poslat zprávu včetně žádosti o ukončení. Signály považuji v Linuxu za technologií minulého století
Psal jsem uz v jinem komentari - Kafka je napsana v Jave, je to multiplatformni reseni se stejnou binarkou pro vsechny platformy.
Neni duvod, ani neni technicky mozne, aby si tudiz menila *id.
Ono obecne u programu v nejakem vyssim programovacim jazyce, ktere bezi nad VM / interpretrem, je toto chovani zcela nezadouci, protoze nez se provede zmena *id (napr. v pythonu to jde pomoci platformne specifickeho API z os), tak se pod rootem spusti cely interpretr / VM, takze nez se dostane k dropnuti privs, spusti se spoustu veci, ktere jsou zcela nezadouci, aby bezely pod rootem.
Takze spravne reseni je program rovnou (idealne primo service managerem - systemd, daemon tools,...) spustit pod danym neprivilegovanym uzivatelem.
Dropovani privilegii pomoci seteuid je nebezpecnym legacy hackem, ktery plyne z toho, ze UNIXove systemy mely extremne omezeny security model (root, non-root). A proto i pro pomerne trivialni operace (bind na port < 1024 napr.) bylo nutne spustit binarku pod rootem, ktera nasledne dropne privilegia (a doufame, ze se tak skutecne stane a ze do te doby tam neni nic deraveho v kodu).
Na Linuxu to jde samozrejme mnohem lepe - spustit pod neprivilegovanym userem rovnou a pridat binarce prislusnou capability - napr. pro httpd:
setcap cap_net_bind_service=+ep /usr/sbin/httpd
A pak uz staci httpd spoustet rovnou pod neprivilegovanym uzivatelem (misto spusteni pod roota a doufani), coz je objektivne z pohledu bezpecnosti mnohem lepsi.
Navic tim httpd ziskava jen tuto jednu permission (bindovani na < 1024) a nikoliv absolutni kontrolu nad systemem (spusteni pod rootem).
O tom se nebudu hádat, jako že možnych variant je víc. Přemýšlím kde by dropnuti privilegii mohlo být problematické. Ale dejme tomu no. Druhá část tedy killeni - speciálně Java aplikace se mi taky nepozdava, u aplikaci typu server bych ukončení viděl pomocí requestu. Konečně signály v multithreadove aplikaci je taky pěkná lahůdka
> Přemýšlím kde by dropnuti privilegii mohlo být problematické.
Principialne:
Varianta dropujeme privilegia:
1. Spustim jako root
2. Inicializuji aplikaci
3. V teto fazi muzu napr. natahnout modul do jadra, zapisovat kamkoliv do FS, nainstalovat backdoor, ...
4. Dropnu privilegia
Varianta s posix caps:
1. Spustim jako neprivilegovany uzivatel s nejakym pravem navic (typicky prave ten CAP_NET_BIND - port < 1024)
2. Muzu delat jen to,co mam dovoleno
Nevznika zde tedy to kriticke misto, kdy chvili proces bezi s mnohem vyssimi opravnenimi (nez je dropne) nez skutecne potrebuje.
Takze principialne jsou POSIX Caps. bezpecnejsi (least privilege princip). Nerikam nikde, ze to je nejaka casta chyba, ale principialne mi proste prijde mnohem lepsi nedavat pri startu daemonu napr. pravo nacitat jaderne moduly, kdyz je v zadnem rozumnem pripade nepotrebuje :)
> aplikaci typu server bych ukončení viděl pomocí requestu. Konečně signály v multithreadove aplikaci je taky pěkná lahůdka
Souhlas. Ale i tak tam ty signaly byt musi, protoze to muze napr. nereagovat na request.
Ale zrovna v jave jsou ty signaly vyresene docela dobre - java to zareigstruje, provola shutdown handler, ten potom zada pozadavek na ukonceni vlaken (to si resi Kafka samozrejme sama), takze s tim problem neni.
Problematické je mj. to, že aplikaci nemusíš na 100 % věřit a chceš ji spustit jen pod neprivilegovaným uživatelem, který nemůže škodit ostatním (např. číst a zapisovat v jejich adresářích, firewallem se mu dá omezit síť atd.). Tudíž ta aplikace nesmí být ani na okamžik rootem a měl by to řešit někdo zvenčí (nějaký minimalistický init systém).
Zcela vážně bych chtěl poděkovat za odpověď s nadhledem a za alternativní úhel pohledu.
Off topic: osobně je mi dále trochu proti srsti trend, mít serverovou aplikaci v Javě a horizontálně ji škálovat clusterem kvůli výkonu, ale zjevně "se to tak dneska normálně dělá" a má to své výhody :-) Pick your poison... tohle je úplně jiný doutnající flame, C vs C++ vs všichni ostatní...
Hmm... ono je to v Javě a přitom to má svůj vlastní driver v kernelu pro přímé kopie z fs na netdevice? Asi to přece jenom nebude úplné ořezávátko, a s tou platformovou nezávislostí to taky nebude úplně horké :-)
> osobně je mi dále trochu proti srsti trend, mít serverovou aplikaci v Javě a horizontálně ji škálovat clusterem
No, pokud se bavime o Kafce, tak tam ten cluster neni kvuli Jave, ale kvuli lokalni a vysoke dostupnosti.
Stejne tak u Hadoopu ten cluster neni kvuli Jave, ale kvuli rozdistribuovani dat mezi jednotlive (levne) nody, zajisteni dostupnosti atd.
U tohoto typu softwaru je uplne fuk, zda to je v Jave nebo v C podle me, ta jejich narocnost a pozadavky na deployment vznika uplne z neceho jineho.
> Hmm... ono je to v Javě a přitom to má svůj vlastní driver v kernelu pro přímé kopie z fs na netdevice? Asi to přece jenom nebude úplné ořezávátko, a s tou platformovou nezávislostí to taky nebude úplně horké :-)
Ted jsem asi nepochopil, co ma kernel driver? Kafka je jen message broker, zadne drivery v kernelu nema.
Hmm... ono je to v Javě a přitom to má svůj vlastní driver v kernelu pro přímé kopie z fs na netdevice? Asi to přece jenom nebude úplné ořezávátko, a s tou platformovou nezávislostí to taky nebude úplně horké :-)
A neni mozne ze tim mysli Java NIO (new IO)? To samozrejme nekopiruje data z fs primo na sitovku, ale umi to pouzit mmap a DIRECT_IO, takze to umi obejit OS buffer cache.
"žádná z mých aplikací běžící na Linuxu jako služba k ukončování nepoužívá kill a ani jiné signály. "
To jiste nemusi, ale musi pocitat s tim, ze takovy signal dostane, pokud nepocita, dopadne to presne dle ocekavani - zmrvenejma datama. Protoze kazdej svepravnej tux bere aplikaci nereagujici na kill jako mtrvou a tudiz ji odstreli natvrdo.
Aha, uberblb tvy kategorie samozrejme nemuze tusit, ze normalni system posila sigterm, pak nejakou dobu vycka, a teprve kdyz aplikace (trebas takova co prece signaly neresi) nijak nereaguje, tak ji odstreli killem ze?
Pricemz kazda normalni aplikace pocita s tim, ze i takhle muze bejt ukoncena, a tudiz data nezmrvi, prave proto, ze s tim pocita.
Bez si podat ruce se soudruhem Poetteringem, ten to dela tak, ze tu nereagujici aplikaci necha hnit, mezi tim ukonci sit ... a system na tom zustane viset navzdy.
BTW: žádná z mých aplikací běžící na Linuxu jako služba k ukončování nepoužívá kill a ani jiné signály. Většinou je místo pidfile socket a tím lze běžící službě možné poslat zprávu včetně žádosti o ukončení. Signály považuji v Linuxu za technologií minulého století
Jaký je principiální rozdíl mezi posíláním systémových signálů a vlastních signálů přes vlastní rozhraní? Mi to přijde v principu úplně to samé a je jedno z jakého století to pochází. Aplikaci přijde definovaným rozhraním signál a má se podle toho zařídit...
Ukončení služby je jen jedna z funkcí. Pomocí socketu mohu ke službě nabízet cli. Jak je to těžký nehraje roli, mám na to knihovnu.
Co se týče konzistence dat, tak služba by neměla spoléhat na ukončovací signal a bez něho úmrtí data. To pak ukazuje na špatný návrh. Ideální je, když to přežije výpadek napájení (třeba couchdb má takto zabezpečena data)
Jinak ten můj soket má třeba i schopnost poznat že process opravdu skončil bez nutnosti v cyklu testovat existenci procesu. Když do minuty neskončí, pošle se sigterm což vždycky považuji za equivalent TerminateProcess ve windows. Většinou ho neodchytavam. Většinou ale neukonceni služby na request značí nějaký vážný problém, zpravidla kousle vlákno, takže je dobre začít zjišťovat, co je blbě.
> Ukončení služby je jen jedna z funkcí. Pomocí socketu mohu ke službě nabízet cli. Jak je to těžký nehraje roli, mám na to knihovnu.
cli Kafka ma - viz https://www.cloudera.com/documentation/kafka/latest/topics/kafka_command_line.html
> Co se týče konzistence dat, tak služba by neměla spoléhat na ukončovací signal a bez něho úmrtí data. To pak ukazuje na špatný návrh. Ideální je, když to přežije výpadek napájení (třeba couchdb má takto zabezpečena data)
Souhlas. Ale je to typicky performance trade off - ono ty vypadky / nekorektni ukonceni nejsou moc caste a pokud kvuli nim zbytecne v 99.99% pripadu prichazim o vykon (ktery potrebuji), tak je pochopitelne, ze to muze nekdo navrhnout jinak za cenu toho, ze kdyz uz k tomu nahodou dojde, tak to bude za slusnou vykonovou / jinou penalizaci.
Ono nemusi byt vse ACID complaint (ani databaze, natoz pak message broker), ale je nutne aby to tak bylo zdokumentovano a pouzivalo se to spravne. Kdyz to tak je, je to v nejlepsim poradku.
Pomocí socketu mohu ke službě nabízet cli. Jak je to těžký nehraje roli, mám na to knihovnu.
A není lepší, když je na to jedna knihovna, než když si to musí řešit každá aplikace sama?
Jinak ten můj soket má třeba i schopnost poznat že process opravdu skončil bez nutnosti v cyklu testovat existenci procesu.
Rodičovský proces se to na unixech dozví také, a není na to potřeba ani žádná speciální knihovna.
A není lepší, když je na to jedna knihovna, než když si to musí řešit každá aplikace sama?
Jenže ona na to stejně není jedna knihovna. Zatímco u systemd jsou možné akce jen typu start stop restart reload, tak v rc skriptech pro sysv často byly další akce typu check, list, try, flush a prostě co si tam kdo napsal. Takže bylo jedno rozhraní (service), kde si admin, krom běžných akcí typu start stop, mohl ještě volat další akce specifické pro daný konkrétní program. Tohle systemd neumožňuje, takže krom systemctl jsou ještě u některých programů navíc ještě obslužné skripty, kde je to, co bylo před tím dostupné i přes service. Takže v tomto ohledu se nic nevylepšilo.
Vylepsilo, protoze sluzba nemusi resit jak se ma spustit, nemusi resit dropovani privilegii, nemusi se v ni konfigurovat logging (zvlast u jednodussich sluzeb), funguje to jak v spravci sluzeb, tak treba v dockeru.
A je treba rozdelit:
1) Spousteni / zastaveni sluzeb - coz je odpovednost spravce sluzeb
2) Akce ve sluzbe - na coz muzu mit CLI program, pokud ho dana sluzba potrebuje (spousta sluzeb nepotrebuje, jine sluzby zase potrebuji tyto akce mit dostupne jako REST, jine z command line, moznosti je mraky...)
Ten logging bych dvakrát nezmiňoval. Protože pokud chce služba logovat do souboru někam k sobě přesměrováním standardního výstupu, jediná možnost je spouštět ji přes shell, což není zrovna optimální.
Takže nakonec to musí zase řešit služba sama. A přitom by stačilo přidat jednu konfigurační položku, vedle těch stávajících. Místo toho raději integrujeme DNS, web server, NTP a plno dalších hovadin.
Otazka pre autorov - preco ste nepouzili hotovu enterprise-ready distribuciu Kafky (napr confluent)? Ta, pokial viem, sa dodava v rpm aj vratane startovacich skriptov (myslim, ze systemd). Je to podla mna jednoduchsie (a zrejme nakoniec aj lacnejsie) ako sa trapit hladanim a riesenim problemov, ktore niekto uz za vas pravdepodobne davno vyriesil.
Dalsia otazka - pochopil som spravne, ze mate na produkcnom clusteri rozne distribucie OS? Ak ano, preco preboha?
Inac super clanok, poucny, napinavy az do konca a necakal som, ze vrahom bude zahradnik ;-) Vdaka...
V dobach, kdy jsme zacinali, zadny Confluent jeste neexistoval, prvni zminky si uvedomuji az o nekolik let pozdeji. Stejne tak neexistovaly Kafka Streams and Kafka Connect. Kdybychom zacinali vyvoj dneska a s dnesnimi zkusenostmi, vsechno by nejspis vypadalo uplne jinak. Bylo to cca. pred ctyrmi lety a minimalne jeden velky projekt s Kafkou tu byl jeste driv.
Samozrejme ne, vsude na serverech je CentOS. Zmineny Debian je jenom u me na notebooku, kazdy tu pouziva, co mu vyhovuje.
"Pokud není množství chyb v poměru k celkovému počtu událostí statisticky významné, není třeba nic řešit."
Moc pěkný přístup... Po přečtení "Byl to zkrátka takový ošklivý… nepěkná věc," mě napadá jiný citát stejného autora: "To muselo dát práce a přitom je to taková blbost!" Aneb two-liner v kernel/signal.c by byl efektivnější. Teda v normálním prostředí, protože pokud je enterprise tak rock solid, že běží na CentOS 6, je asi nemožné mít pro pokusy vlastní jádro.
> "Pokud není množství chyb v poměru k celkovému počtu událostí statisticky významné, není třeba nic řešit."
Tak ono pokud procesujes miliardy zaznamu denne, tak ti proste urcite chyby vznikaji. Neco se obcas nekde nedokomunikuje, posle dvakrat, ...
A je to fuk, pokud se o tom vi a bud se pak tyto chyby eliminuji, nebo jsou pro dalsi zpracovani dat nepodstatne.
Navrh velkych BigData systmeu je dost casto o spouste kompromisu, takze autora v tomhle docela chapu. Ale jak jsem clanek cetl, tak jsem si rikal, ze se toho urcite nekdo chyti :)
A co bys resil tou upravou v jadre (pomineme fakt, ze upravovat jadro je fakt spatny napad).
Úprava není řešení, jen pomůcka, která mi řekne, kdo poslal SIGKILL. To, co je v článku popsané muselo být dosti zdlouhavé.
Ačkoliv, ale nikde to neříkejte, by bylo snadné naprasit, aby se SIGKILL od určitého procesu neposílal - a kdyby použíté jádro umělo runtime patching... Oprava příčiny je samozřejmě v pořádku, praso řešení by se nabízelo, kdyby mi za zády podupkával nadřízený a chtěl to "hned nějak opravit".
"Ale to je fuk..." - asi ano, nedokážu to posoudit. K problému se dostanu až si všimne manažer, do té doby je to problém někoho jiného ;-)
Super clanok.
Pripomina mi to moj zazitok s dohladavanim preco po upgrade Debianu na Wheezy je timeout pri vypadku zdielaneho adresara namiesto minuty, teraz 5 minut(aj minuta bola vela, ked na windowse to trva par sekund ale dala sa prezit)
Po dlhsom studivani a hladani som dosiel az k jedne diskusii a u prave a prekompilovaniu distribucneho jadra Wheezy.
Bola to vyborna skola a naucil som sa toho vela(nielen o sambe a cifs ale ako to vsetko funguje v ramci systemu).
p.s. Tento problem/vlastnost je len par verziach kernelu a je medi inimi aj ta, ktoru pouziva Debian Wheezy. Bolo to upravene naspet na minutu, ked vyvojari akceptovali, ze default 5 minut je zbytocne vela.
Díky za článek, je poučné se zamyslet nad tím, kde všude něco podobného může být.
Nepřestává mě fascinovat, jak "enterprise" produkt, který běží na třech kontinentech ve dvaceti datacentrech a tak dále, nemá ani pořádné start stop ovládání. Ten skript se třemi grepy je snad jen vtip.
Je běžné, že u programů, které jsou větší než malé, jsou k disposici ovládátka (apachectl, pg_ctl a další tohoto typu), přes které se lze s programem domluvit. Případě se mu to pošle na port, do socketu apod. Určitě ne SIGTERM na náhodná PID vyfiltrovaná tímto způsobem. Pochopitelně program by měl na sigterm reagovat také (a v tomto případě nejspíš i reaguje). Ale dělat plánovanou odstávku tím, že někam pošleme term, to je mi tak nějak proti srsti.
Taky mě překvapuje tak dlouhé recovery. Chápu, že to není db, takže tam asi neřeší plnou konzistenci dat po každém zápisu, ale i tak. Nebylo by jednodušší tu repliku udělat znovu od nuly, než to nechat pár hodin dělat recovery?
Ještě jednou díky za článek, taky jsem se jednou krásně střelil do nohy a to rozdílem mezi built-in příkazem v bashi a jeho implementací v samostatném programu.
Také by bylo vhodné dodat, proč tyhle šílené startovací skripty vznikly – kvůli SysVinitu. S moderními správci služeb nic takového skutečně není potřeba, aplikace běží normálně „na popředí“, standardní výstup má přes správce služeb přesměrován na logovací službu a rodičem aplikace je správce služeb, který ji jednoduše ukončí tím, že jí pošle SIGTERM.
Souhlasím s tím, že by appka měla slušně reagovat na sigterm (tahle teda nejspíš slušně reaguje, článek je o nečekaném volání jiného signálu). O tom diskuse není.
Nesouhlasím s tím, že tyhle skripty (a já jsem ve svém komentáři zmínil jen tu stop část), vznikly kvůli SysVInitu. Dokonce i před těmi "moderními správci služeb" tady byly slušné appky, které se uměly bez problémů zapnout a bez problémů vypnout. A nebylo vůbec potřeba dělat nějaké magořiny s filtrací PID a posíláním signálů na jakýsi seznam PID (proč to vlastně není jen na master proces, který si potom vše zařídí?).
A i za "moderních správců služeb" jsou tady appky, které dělají problémy. Takže v tom to opravdu není.
V podstatě ty "moderní správci služeb" jen lépe skrývají blbě napsané aplikace a o něco méně nutí jejich vývojáře to udělat dobře. Toť vše.
> Nesouhlasím s tím, že tyhle skripty (a já jsem ve svém komentáři zmínil jen tu stop část), vznikly kvůli SysVInitu. Dokonce i před těmi "moderními správci služeb" tady byly slušné appky, které se uměly bez problémů zapnout a bez problémů vypnout. A nebylo vůbec potřeba dělat nějaké magořiny s filtrací PID a posíláním signálů na jakýsi seznam PID (proč to vlastně není jen na master proces, který si potom vše zařídí?).
Tyto skripty vznikly kvuli SysV init, protoze proste tuhle naprosto elementarni funkcionalitu neumel. Tudiz se to resilo dvema zpusoby:
1) Pomocnymi skripty / ojeby ala su
2) Pomoci vlastnich sil aplikace
Oboji je spatne - workaroundy / pomocne skripty casto zpusobuji problemy (napr. v sysvinit proto, ze neni schopen poradne sledovat procesy, protoze nepouziva cgroups).
A pokud to resi aplikace sama, tak:
1) Duplikujeme kod, porad piseme to same dokola -> hrozi tam vznik chyby
2) Je to zbytecna prace navic, ktera nuti aplikaci resit neco mimo jeji ucel
Za me idealni daemon je takovy, ktery:
1) Loguje na stdout
2) Spousti se v popredi
Pak je uplne jedno, zda ho spustim z systemd, OpenRC, Dockeru pomoci CMD direktivy, shellu, gdb , ve vsech pripadech mam logy, plnou kontrolu nad procesem (v cgroups mam i tak).
A o to s jakymi pravy, pod jakym uzivatelem se pak elegantne muze starat spravce sluzeb.
Takze centralizovane, v jednom formatu vidim, co se mi spousti a pod jakym uzivatelem. Nemusim resit 1000x zpusobu konfigurace UID, cilu logovani, .... u kazdeho programu zvlast.
Dle meho nazoru to ma jen a jen vyhody.
1) Pomocnymi skripty / ojeby ala su
Proč by měl být su ojeb? (Bavíme se o funkční a zdokumentované variantě, nikoliv o tom problémovém v článku.) Mě to naopak přijde jako součást unixové myšlenky, jeden program dělá jednu věc a to (v tomto případě) omezení práv spouštěného programu. Stejně jako tam může být nice, ionice apod.
Pomoci vlastnich sil aplikace
Na tom nevidím nic špatného, protože je to naprostý prd ve srovnání s tím, co většina programů řeší jako svoji hlavní práci.
Oboji je spatne - workaroundy / pomocne skripty casto zpusobuji problemy (napr. v sysvinit proto, ze neni schopen poradne sledovat procesy, protoze nepouziva cgroups).
Problémy jsou pouze s problémovými programy. Jsem té zásady, že problém by měl vybublat na povrch co nejdříve a nikoliv se skrývat pod dalšími vrstvami.
Duplikujeme kod, porad piseme to same dokola -> hrozi tam vznik chyby
Existují knihovny. I na toto. Takže není nutné duplikovat nic. Dokonce existují programy, které vše zařídí.
Za me idealni daemon je takovy, ktery:
1) Loguje na stdout
2) Spousti se v popredi
Souhlasím. To lze udělat v libovolném správci služeb.
A o to s jakymi pravy, pod jakym uzivatelem se pak elegantne muze starat spravce sluzeb.
Ale on se o to stará správce služeb. I u toho sysvinitu. Prostě tím formátem, ve kterém je to napsané, je bash (krom jiného je to i skriptovací jazyk a interaktivní prostředí pro spouštění programů). Ještě před x lety na tom nikomu nepřišlo nic divné.
> Proč by měl být su ojeb? (Bavíme se o funkční a zdokumentované variantě, nikoliv o tom problémovém v článku.) Mě to naopak přijde jako součást unixové myšlenky, jeden program dělá jednu věc a to (v tomto případě) omezení práv spouštěného programu. Stejně jako tam může být nice, ionice apod.
Protoze treba tento problem. Protoze to vytvari ve stormu procesu zbytecnou entry? Protoze tam su musi existovat? Protoze to vytvari binec s posilanim signalu (neni to jen tento pripad v clanku - ale obecne to preposilani signalu je prasarna). Protoze pak spravce sluzeb nevidi skutecny master proces?
Protoze je to tak elementari zalezitost (spustit program pod jinym uzivatelem nez je root), ze by to mel byt naprosto dany standard u kazde sluzby?
> Na tom nevidím nic špatného, protože je to naprostý prd ve srovnání s tím, co většina programů řeší jako svoji hlavní práci.
To neni argument, proc to ma resit - stejne tak muzu rict, ze implementace vlastniho linked listu je trivialita proti tomu, co musi vetsina programu resit a stejne ho nikdo sam implementovat nebude :-)
> Existují knihovny. I na toto. Takže není nutné duplikovat nic. Dokonce existují programy, které vše zařídí.
Ano existuji, ale pointa je, ze pak si to kazdy program resi jinak. Pokud je to odpovednosti spravce sluzeb, je to na jednom miste, v jednom formatu konfigurace.
A nevznika mi tam nejaky potencialne bugnuty meziclanek, ktery se (zcela zbytecne) spusti pod rootem.
> Ale on se o to stará správce služeb. I u toho sysvinitu. Prostě tím formátem, ve kterém je to napsané, je bash (krom jiného je to i skriptovací jazyk a interaktivní prostředí pro spouštění programů). Ještě před x lety na tom nikomu nepřišlo nic divné.
Nestara, spoleha na externi programy, ktere mohou a nemusi byt k dispozici, nema jednotne rozhrani pro specifikaci zcela zakladnich veci (uzivatel, capabilities, ...) - viz start-stop-daemon v tomto clanku. Navic ani nevi, jake procesy vlastne sluzba ma spustene - staci udelat nekolik forku a upstart / sysvinit vubec nevi, co kde bezi.
Takze ano, mozna to neprislo pred lety nikomu divne (i kdyz prislo, vsem kdo videly jine service managery na jinych OS a neznaly aspon daemon tools), ale robustni to neni ani omylem.
Mě to naopak přijde jako součást unixové myšlenky, jeden program dělá jednu věc a to (v tomto případě) omezení práv spouštěného programu. × Na tom nevidím nic špatného, protože je to naprostý prd ve srovnání s tím, co většina programů řeší jako svoji hlavní práci.
Neprotiřečíte si trošku?
Problémy jsou pouze s problémovými programy.
No jo, ale co s těmi problémovými programy máme dělat? Zahodíme Apache, zahodíme nginx, zahodíme Postfix, zahodíme PostgreSQL – a zbydou nám vůbec nějaké nějaké neproblémové programy?
Jsem té zásady, že problém by měl vybublat na povrch co nejdříve a nikoliv se skrývat pod dalšími vrstvami. × Existují knihovny. I na toto.
Neprotiřečíte si?
To lze udělat v libovolném správci služeb.
V SysVInitu to udělat nejde. Jde to udělat vedle něj.
Prostě tím formátem, ve kterém je to napsané, je bash
Tak se pak ale nedivte těm zpraseným init skriptům. To je přesně to, co chcete – každý si to sám napíše v bashi jak nejlépe dovede.
Ještě před x lety na tom nikomu nepřišlo nic divné.
To je průvodní jev pokroku, že nám přijdou divné věci, které před nějakou dobou divné nebyly.
Neprotiřečíte si trošku?
Ne, nechávám to na autorovi toho programu. Obě možnosti jsou pro mě přijatelné. Reagoval jsem jen na komentář, který su považuje za ojeb.
Neprotiřečíte si?
Ne, knihovna je soubor kódu a opět je to reakce na komentář k možné duplikaci. Knihovna není vrstva, která něco skrývá.
V SysVInitu to udělat nejde. Jde to udělat vedle něj.
To je jen slovíčkaření. rc.v skripty lze považovat za součást sysv a v těchto skriptech se nastaví prostředí pro běh programu.
Tak se pak ale nedivte těm zpraseným init skriptům. To je přesně to, co chcete – každý si to sám napíše v bashi jak nejlépe dovede.
No já se jim nedivím, já na ně jen upozorňuji. Pro mě je toto další indicie k rozhodování, že tomuto programu je lepší se vyhnout. Pokud neumí slušně napsat ani startovací skript, jak to asi vypadá uvnitř.
Jistěže existovaly slušné aplikace, které se někde uměly slušně zapnout a vypnout. Jenže si to každá ta aplikace musela řešit sama, každá to řešila jinak – takže pak někde fungovala skvěle, a někde se musela pracně ohýbat.
Ty skripty vznikaly kvůli SysVInitu, protože řešily věci, které má řešit správce služeb – jako třeba tu změnu uživatele. Aplikace pokažené pro to, aby fungovaly pod SysVInitem, pak samozřejmě mají problém i s moderními init systémy. Holt to bude nějakou dobu trvat, než bude možné všechny ty narovnáky na vohejbáky z aplikací odstranit, protože bude možné se spolehnout, že to všude řeší správce služeb. Moderní správci služeb neskrývají blbě napsané aplikace, moderní správci služeb naopak umožní napsat ty aplikace správně.
Proč ten skript dělá nějaké magořiny s filtrací PID? No nejspíš proto, že ho psal nějaký Java programátor, který trochu zná Linux. Vývojáři aplikací budou málokdy zároveň dobrými správci systému, což je jeden z důvodů, proč to má být oddělené a aplikace má dělat svou práci a nestarat se o to, aby běžela jako služba, a správce služeb má zase dělat svou práci.
moderní správci služeb naopak umožní napsat ty aplikace správně
Zdůraznil bych to slůvko umožní. Ano umožní, pokud někdo chce. Jenže v praxi vidíme to, před čím jsem tady v diskusích varoval už před x lety a to zneužívání automatického restartu. Nevím jak ty, ale já to v těch unitách a ještě ke všemu v mnoha různých článcích pro začátečníky, vidím čím dál častěji. Takže proč se snažit ten program napsat dobře, dáme tam restart a ono to pojede...
No nejspíš proto, že ho psal nějaký Java programátor, který trochu zná Linux. Vývojáři aplikací budou málokdy zároveň dobrými správci systému
Tak to nemají psát a mají to nechat nějakému správci systému, který to napíše. Jako tohle je výmluva jak noha, tj jak kdyby jsi byl v nemocnici na operaci a místo anesteziologa tě hlídala instrumentářka, protože byla zrovna po ruce...
a nestarat se o to, aby běžela jako služba
Ano, což potom dopadá přesně tak, že je skoro nemožné ji jako službu spustit a to i v tom "moderním správci služeb".
> Ale on se o to stará správce služeb. I u toho sysvinitu. Prostě tím formátem, ve kterém je to napsané, je bash (krom jiného je to i skriptovací jazyk a interaktivní prostředí pro spouštění programů). Ještě před x lety na tom nikomu nepřišlo nic divné.
Tak spravce systemu je snad svepravny clovek, aby se rozhodl, jestli automaticky restart chce nebo ne. Jsou situace, kde je to zcela v poradku a namiste a situace, kde je to extremne nevhodne. Ale to si musi rozhodnout kazdy spravce.
Ale nedat tu moznost je rozhodne spatne. Proc bych napr. na testovacim serveru nemel mit nastaveny automaticky restart, kdyz tam spoustim X sluzeb a obcas jim proste dojde pamet?
> Tak to nemají psát a mají to nechat nějakému správci systému, který to napíše. Jako tohle je výmluva jak noha, tj jak kdyby jsi byl v nemocnici na operaci a místo anesteziologa tě hlídala instrumentářka, protože byla zrovna po ruce...
A proc ma firma / dodavatel / ... platit spravce, aby psal porad to stejne dokola dokolecka, navic s moznosti vzniku chyby? Proc to nevyresit spravcem sluzeb, stejne jako ve vetsine jinych OS (Windows, MacOS, Linux se systemd - vsimni si, ze to pokryva vyraznou majoritnu dnes pouzivanych OS - ze by na tomto pristupu neco bylo podle tvurcu ?:) )?
Tak spravce systemu je snad svepravny clovek, aby se rozhodl, jestli automaticky restart chce nebo ne.
Byla řeč o unitách v systemd. Ty nenastavuje správce (může), ale za jednu z hlavních výhod systemd tady bylo před lety ohlašováno to, že unitu napíše autor programu a napíše ji jednou a poběží to všude. A právě v těchto unitách od některých autorů se objevuje nebezpečně často restart on failure.
Proc bych napr. na testovacim serveru nemel mit nastaveny automaticky restart, kdyz tam spoustim X sluzeb a obcas jim proste dojde pamet?
Tak třeba by tě to donutilo to zoptimalizovat. ;-) Pro mě za mě si na testovacím prostředí dělejte třeba stojky, ale do produkce by to patřit nemělo. A systemd rozhodně není jediná možnost automatického restartu. Jen je nejvíc viditelná a propagovaná.
A proc ma firma / dodavatel / ... platit spravce
Protože chce, aby ten program byl po všech stránkách perfektní? A jistě je dobré si do týmu přibrat taky někoho, kdo se potom o běh toho programu bude starat a může poradit, které věci v praxi nejvíc překážejí apod. Tyhle argumenty dost dobře nechápu, někdy mám pocit, že (podle těchto komentářů) vývojáři chtějí prostě jen psát to své dokonalé dílo, ale to, že to potom nejde spustit a jsou s tím starosti už je jaksi nezajímá.
> Byla řeč o unitách v systemd. Ty nenastavuje správce (může), ale za jednu z hlavních výhod systemd tady bylo před lety ohlašováno to, že unitu napíše autor programu a napíše ji jednou a poběží to všude. A právě v těchto unitách od některých autorů se objevuje nebezpečně často restart on failure.
Tak autor .service (vendor distribuce / programu) je snad jeste vice svepravny nez i bezny admin, aby rozhodl, jaky ma byt default (ktery muze admin snadno zmenit).
> Tak třeba by tě to donutilo to zoptimalizovat. ;-) Pro mě za mě si na testovacím prostředí dělejte třeba stojky, ale do produkce by to patřit nemělo. A systemd rozhodně není jediná možnost automatického restartu. Jen je nejvíc viditelná a propagovaná.
A proc bych to mel optimalizovat, kdyz proste je to treba jen prostredi, kde overcommituji pamet? Nebo je to sluzba, kde restart nevadi (at uz probehne z jakehokoliv duvodu)? Usecases je mraky, kde to ma smysl.
A hlavne, nikdo nikoho nenuti to pouzivat :)
A ze by byl systemd jedina varianta nikdo nikdy netvrdil, je jedna z mnoha ruznych reseni.
> Protože chce, aby ten program byl po všech stránkách perfektní? A jistě je dobré si do týmu přibrat taky někoho, kdo se potom o běh toho programu bude starat a může poradit, které věci v praxi nejvíc překážejí apod. Tyhle argumenty dost dobře nechápu, někdy mám pocit, že (podle těchto komentářů) vývojáři chtějí prostě jen psát to své dokonalé dílo, ale to, že to potom nejde spustit a jsou s tím starosti už je jaksi nezajímá.
Ukaz mi firmu, ktera chce platit, aby bylo neco perfektni :-) Naopak soucasnym trendem je treba Microservices architektura - uz z jeji podstaty plyne, ze potrebuji, aby spusteni sluzby bylo maximalne jednoduche, automatizovane a vyzadovalo minimum manualni prace.
> Tyhle argumenty dost dobře nechápu, někdy mám pocit, že (podle těchto komentářů) vývojáři chtějí prostě jen psát to své dokonalé dílo, ale to, že to potom nejde spustit a jsou s tím starosti už je jaksi nezajímá.
No a pokud se pouzije rozumny spravce sluzeb, tak se prave o to vyvojar vubec nemusi starat,
Byla řeč o unitách v systemd. Ty nenastavuje správce (může)
Další výhodou unit je také to, že je snadné je skládat. Takže autor si do unity napíše automatický restart, a já si pak ve své konfiguraci ten automatický restart zase vypnu. A nemusím řešit, že bych s příští verzí aplikace musel patchovat nějaký skript.
Jenže v praxi vidíme to, před čím jsem tady v diskusích varoval už před x lety a to zneužívání automatického restartu. Nevím jak ty, ale já to v těch unitách a ještě ke všemu v mnoha různých článcích pro začátečníky, vidím čím dál častěji.
Já zase v SysVInit skriptech vidím zneužívání bashe, nesrovnatelně horší a nesrovnatelně zákeřnější, než nějaké automatické restarty služeb. Mnohokrát si tu napsal, že se něco dá řešit i v SysVInitu – stejně tak si tam někdo může naskriptovat i ty automatické restarty.
Tak to nemají psát a mají to nechat nějakému správci systému, který to napíše. Jako tohle je výmluva jak noha
To není výmluva, to je popis reality. Kafka se používá docela hodně, a zjevně se za celou dobu nenašel jediný správce, který by se nad těmi skripty zhrozil, přepsal by je a poslal do upstreamu.
Ano, což potom dopadá přesně tak, že je skoro nemožné ji jako službu spustit a to i v tom "moderním správci služeb".
Nikdy jsem neměl problém s tím spustit nějaký skript nebo běžnou konzolovou aplikaci pod daemontools nebo systemd.
stejně tak si tam někdo může naskriptovat i ty automatické restarty
Tak jistě, ale je to větší potenciální bariéra (tj větší množství lidí se tomu raději vyhne), než jeden řádek v unitě o kterém se dozví hned z prvního tutoriálu.
a zjevně se za celou dobu nenašel jediný správce
Ten správce, který to napíše, by měl být ideálně součástí týmu, který to vyvíjí.
Nikdy jsem neměl problém s tím spustit nějaký skript nebo běžnou konzolovou aplikaci pod daemontools nebo systemd.
Já jo. Ve chvíli, kdy mám obě ruce na tvářích a očích, abych tu hrůzu v té unitě neviděl, už mě nezbývají další končetiny k dokončení práce. Tímto hw lockem se příroda brání podobným zvěrstvům. To, že to jde spustit a systemd si s tím nějak poradí, nezpochybňuju. Ale otázkou je, zda je to tak správně.
Tak jistě, ale je to větší potenciální bariéra (tj větší množství lidí se tomu raději vyhne), než jeden řádek v unitě o kterém se dozví hned z prvního tutoriálu.
To je zvláštní, že u SysVInitu jsou bash skripty výhodou, zatímco v případě automatického restartu jsou bariérou.
Ten správce, který to napíše, by měl být ideálně součástí týmu, který to vyvíjí.
Jako že za půl dne napíše startovací skripty pro různé systémy, a pak se bude několik měsíců nebo let nudit?
To, že to jde spustit a systemd si s tím nějak poradí, nezpochybňuju. Ale otázkou je, zda je to tak správně.
Nenapsal jste nic konkrétního, s čím byste měl problém u běžné konzolové aplikace, která počítá s tím, že ji někdo spustí z příkazového řádku na popředí.
To je zvláštní, že u SysVInitu jsou bash skripty výhodou, zatímco v případě automatického restartu jsou bariérou.
Co je na tom zvláštního? Naučit se skriptovat v bashi je přece složitější, než dopsat jeden řádek do unity (nebo override). Pokud se někdo ten bash naučí lépe, tak je pro něj výhodou. A ve chvíli, kdy bude schopen spolehlivě napsat restart v rc skriptu, tak už jej možná nebude potřebovat, protože ta jeho appka už nebude padat, protože ji mezitím doladil. (Bavím se v kontextu toho, že autor appky je stejný, jako autor toho rc skriptu.)
Jako že za půl dne napíše startovací skripty pro různé systémy, a pak se bude několik měsíců nebo let nudit?
Ne, těch dalších několik měsíců může kafrat do vývoje a radit vývojářům a pomoci tak vyvinout lepší produkt, který lépe poběží na cílové platformě (což je věc, která, soudě dle některých komentářů, vlastně nikoho nezajímá - většinou krom těch správců).
která počítá s tím, že ji někdo spustí z příkazového řádku na popředí
Ano, a teď si dáme pět minut předstírání, že všechny appky jsou napsané přesně takto.
Kdyby tomu tak bylo, tak bohatě stačí sysvinit s trochou snahy i bez rc skriptů a vše je v pořádku a jednoduché. Takže pokus o změnu kontextu je to sice pěkný, ale sám víš, že se tady bavíme o programech, které z různých důvodů nespolupracují. Kdyby bylo vše takto ideální, tak nepotřebujeme ani systemd.
> Co je na tom zvláštního? Naučit se skriptovat v bashi je přece složitější, než dopsat jeden řádek do unity (nebo override). Pokud se někdo ten bash naučí lépe, tak je pro něj výhodou. A ve chvíli, kdy bude schopen spolehlivě napsat restart v rc skriptu, tak už jej možná nebude potřebovat, protože ta jeho appka už nebude padat, protože ji mezitím doladil. (Bavím se v kontextu toho, že autor appky je stejný, jako autor toho rc skriptu.)
To nemeni nic na tom, ze je to zbytecna, repetetivni prace. A jediny, kdo tuhle moznost (moznost, ne povinnost) nenabizi out of the box je sysv init. Proc to vsechny ostatni platformy asi umoznuji ?:-)
> Ne, těch dalších několik měsíců může kafrat do vývoje a radit vývojářům a pomoci tak vyvinout lepší produkt, který lépe poběží na cílové platformě (což je věc, která, soudě dle některých komentářů, vlastně nikoho nezajímá - většinou krom těch správců).
Tak takovy zamestnanec se rozhodne vyplati :-))
> Ano, a teď si dáme pět minut předstírání, že všechny appky jsou napsané přesně takto.
Nemusime, protoze skoro vsechny napr. v korporatech vyvijene microservices jsou napsane presne takto. Tento zpusob navic funguje perfektne v Dockeru.
Jediny duvod, proc to maji nektere UNIX daemony jinak je - ze to se sysvinitem jinak neslo :)
> Kdyby tomu tak bylo, tak bohatě stačí sysvinit s trochou snahy i bez rc skriptů a vše je v pořádku a jednoduché. Takže pokus o změnu kontextu je to sice pěkný, ale sám víš, že se tady bavíme o programech, které z různých důvodů nespolupracují. Kdyby bylo vše takto ideální, tak nepotřebujeme ani systemd.
Opravdu? Bavime se o spousteni normalnich sluzeb. Jak prenositelne udelam v sysv initu to, ze sputim program jako daemon, uvidim jeho logy posilane na stdout, bude mi trackovat jeho veskere subprocesy bez ohledu na zpusob forkovani, zajistim ze neuvidi sdileny /tmp a /var bude mit readonly bez ohledu na FS prava, omezim mu capabilities, omezim mu pristup k zarizenim atd. bez toho, abych musel instalovat dalsi pomocne utility v systemu ?:-)
systemd tohle vsechno umi out of the box diky cgroups / fs namespaces a dalsim, je to prehledne v jednom konfiguracnim souboru (.service) a muzu to snadno auditovat i prenaset mezi systemy...
Naučit se skriptovat v bashi je přece složitější, než dopsat jeden řádek do unity (nebo override).
Takže se snad můžeme shodnout na tom, že je nevýhodou SysVInitu, že pro spuštění jakékoli služby vyžaduje znalost složitějšího bashe (nebo nějaký jiný externí nástroj).
Ne, těch dalších několik měsíců může kafrat do vývoje a radit vývojářům a pomoci tak vyvinout lepší produkt, který lépe poběží na cílové platformě (což je věc, která, soudě dle některých komentářů, vlastně nikoho nezajímá - většinou krom těch správců).
To ovšem máte dost idealizovanou představu o správcích. Protože většina správců nemá takové znalosti o systému, aby mohli něco kloudného radit vývojářům. Podobně jako většina vývojářů nemá znalosti na to, aby napsali rozumný startovací skript. Aplikace, systém a provoz jsou tři různé věci, a je málo lidí, kteří jsou vynikající v jednom, obstojně znají druhé a zvládnou i třetí.Většinou jsme rádi, když ten člověk obstojně zvládá jednu z těch oblastí.
Ano, a teď si dáme pět minut předstírání, že všechny appky jsou napsané přesně takto.
To nikdo netvrdil. Ty jsi naopak napsal, že u běžné aplikace, která se nestará o to, aby běžela jako služba, je skoro nemožné takovou aplikaci spustit jako službu i pod moderním správcem služeb.
bavíme se o programech, které z různých důvodů nespolupracují
Moje zkušenost je taková, že zpravidla nespolupracují programy, které byly psané s ohledem na SysVInit, takže se snaží samy starat o to, aby běžely jako služba, a typicky první, co dělají, že se snaží dostat z dosahu rodiče. Různé programy nebo skripty v Pythonu, Javě, Perlu nebo jednoduché programy v C/C++, které někdo psal s vidinou toho, že ten program prostě někdo spustí z příkazového řádku a ten program poběží, dokud ho někdo pomocí Ctrl+C neukončí, nemají s daemontools nebo systemd vůbec žádný problém – prostě se napíše ten samý příkaz, jaký se používá pro spuštění toho programu z příkazové řádky, případně se doplní změna uživatele nebo nějaká omezení, a ono to funguje.
Takže se snad můžeme shodnout na tom, že je nevýhodou SysVInitu, že pro spuštění jakékoli služby vyžaduje znalost složitějšího bashe (nebo nějaký jiný externí nástroj).
Já další znalost něčeho nepovažuji za nevýhodu. Navíc je podle mě vhodná jistá potenciálová bariéra k tomu, aby ten člověk potom mohl dělat něco dalšího. Asi je k diskusi, zda by to měl být zrovna bash, ale myšlenka je snad jasná.
Podobně jako většina vývojářů nemá znalosti na to, aby napsali rozumný startovací skript. Aplikace, systém a provoz jsou tři různé věci, a je málo lidí, kteří jsou vynikající v jednom, obstojně znají druhé a zvládnou i třetí.
Ale já jsem netvrdil, že jeden člověk musí zvládnout všechno. Já jsem tvrdil, že by si do toho vzájemně měli kecat, protože to, co je obtížné udělat na jedné úrovni (třeba ve vývoji appky), tak je hračkou udělat jinde (třeba pro admina). A naopak. Jako asi nechci zacházet do detailů, protože nechci nikoho konkrétního poškodit, ale zažil jsem opakovaně situace, kdy někdo vyvíjel cosi, poměrně složitě a zdlouhavě a přitom vůbec netušil, že už to cosi je součástí OS a admini to používají takřka denně a důvěrně znají. Ano, to že vývojáři nemají přehled o OS já moc dobře vím a považuji to za chybu a proto píšu, že by admini měli víc kecat do práce vývoje (a naopak) a sdílet tak věci, které možná druhá strana do té doby nevěděla a toto celkově povede ke kvalitnější appce, kterou bude radost provozovat.
Různé programy nebo skripty v Pythonu, Javě, Perlu nebo jednoduché programy v C/C++, které někdo psal s vidinou toho, že ten program prostě někdo spustí z příkazového řádku
Ale však jistě, na tom se shodneme a s těmito programy není žádný problém a nebyl ani před systemd. Odpoutání od rodiče lze udělat pomocí nohup, přesměrování výstupu do logu nebo do jiné (třeba logovací) appky taky, změna uživatele pomocí su, změna prio pomocí nice apod. Prostě s těmito programy není žádný problém.
> Ale však jistě, na tom se shodneme a s těmito programy není žádný problém a nebyl ani před systemd. Odpoutání od rodiče lze udělat pomocí nohup, přesměrování výstupu do logu nebo do jiné (třeba logovací) appky taky, změna uživatele pomocí su, změna prio pomocí nice apod. Prostě s těmito programy není žádný problém.
Ano, neni zadny problem, jen o takovem pouziti su tu vznikne clanek po kdovijak dlouhe umorne investigaci toho, proc se presne takovy druh sluzby nekorektne ukoncuje :-D
Ano, neni zadny problem, jen o takovem pouziti su tu vznikne clanek po kdovijak dlouhe umorne investigaci toho, proc se presne takovy druh sluzby nekorektne ukoncuje :-D
Jestli jste si nevšiml, tak už v článku samotném je uvedeno, že implementací su je víc a dokonce někdo v diskusi napsal, že to, jak se su chová v distribuci použité v článku neodpovídá dokumentaci. Jinými slovy, ten konkrétní program je vadný (nebo je vadná dokumentace). Stejně tak může být vadná i příslušná část toho moderního správce služeb.
Jinými slovy, ten konkrétní program je vadný (nebo je vadná dokumentace). Stejně tak může být vadná i příslušná část toho moderního správce služeb.
V případě toho su
je to ovšem okrajový případ, se kterým se moc nepočítá. Navíc když se liší program su
na jednotlivých distribucích, mže se úplně stejně lišit i ta dokumentace… Naproti tomu u moderního správce služeb je to klíčová funkcionalita, takže je mnohem méně pravděpodobné, že by tam byla takováhle vada.
Já další znalost něčeho nepovažuji za nevýhodu.
Já také ne. Ale něco jiného je znalost uživatele, který ji použije, když se mu to hodí – a něco jiného je vyžadování té znalosti ze strany nástroje. Když někdo umí pilotovat letadlo, je to určitě fajn, ale mám raději auta, která lze řídit i bez pilotního průkazu.
Ano, to že vývojáři nemají přehled o OS já moc dobře vím a považuji to za chybu a proto píšu, že by admini měli víc kecat do práce vývoje (a naopak) a sdílet tak věci, které možná druhá strana do té doby nevěděla a toto celkově povede ke kvalitnější appce, kterou bude radost provozovat.
S tím já souhlasím, ale nemyslím si, že by cestou k tomu byly šílené bash skripty suplující práci správce služeb. Myslím, že se vývojáři o OS dozvědí mnohem víc, pokud mohou aplikaci jednoduše vzít, napsat pár řádků unit file a aplikace se jim spustí. Ostatně k tomu, aby vývojáři věděli víc o systému, směřuje třeba princip DevOps, který se zase rozšiřuje s kontejnerovými technologiemi a speciálně s Dockerem. Jak systemd tak Docker využívají podobných moderních vlastností linuxového jádra, a myslím, že k zvětšení znalostí vývojářů o Linuxu přispěly mnohem víc, než cokoli před nimi. Ano, obě implementace jsou kontroverzní, ale směr, kterým ukazují, je podle mne jednoznačně správný.
Prostě s těmito programy není žádný problém.
Jsem rád, že jsme se od „ je skoro nemožné ji jako službu spustit a to i v tom 'moderním správci služeb'“ dostali k „prostě s těmito programy není žádný problém“.
S tím já souhlasím, ale nemyslím si, že by cestou k tomu byly šílené bash skripty suplující práci správce služeb.
Tak suplující. Je otázkou, zda by nějaký správce služeb měl vůbec existovat a pokud ano (což není triviální otázka) tak jakou by měl mít podobu. Prostě tady se diskuse začíná od konce, argumentuje se tím, co který správce služeb umí nebo neumí, mnozí lidé mají představu toho svého dokonalého správce služeb a ani nejsou schopni jej definovat (narážím na Poetteringa). Tady se staví správce služeb který už je daleko větší, než jen init + rc a nikde za ty roky není definováno, co by to vlastně mělo být a kam to směřuje. To lze pouze hádat z té rozdělané práce. V průběhu toho se přidávají vlastnosti, které se někomu líbí a někomu méně, ale co to vlastně je je pořád nejasné.
šílené bash skripty
Hele, mě se bash taky nelíbí. Co se mi ale na původních sysv + rc skriptech konceptuálně líbí je to, že je to vybudované z toho, co již v systému tak jako tak existuje. Takže máme nějaký jazyk pro interaktivní spouštění programů, lze v něm psát skripty, tak z toho uděláme rc systém. Vypomůžeme si základními gnu příkazy a je to. Pro admina tam není nic, co by nemohl znát z běžné práce na řádce. Tohle je pro mě obrovská síla toho, co unixová filozofie dokáže. Máme nějaké atomy a z těch to postavíme.
A když to vezmu z hlediska uživatele, tak co může být lepší reklamou pro příkazy, které mu jsou nabízeny v shellu, než to, že je z nich postaven i ten systém? Tímto stylem se podle mě o systému naučí mnohem víc, než v dockeru, viz. následující bod.
Jak systemd tak Docker využívají podobných moderních vlastností linuxového jádra, a myslím, že k zvětšení znalostí vývojářů o Linuxu přispěly mnohem víc, než cokoli před nimi.
Uff. Nemám pocit, že by se někdo nasazením dockeru naučil víc o linuxu. Právě naopak. Docker a podobné technologie nalákaly lidi, kteří o linuxu neví vůbec nic, nechtějí o něm nic vědět a kvůli dockeru se k němu ani nedostanou, protože vše, co to má dělat, si napíšou v nějakém tom dockerfile. Image stahují z různých míst, zbastlí to, aby to už běželo a ještě ke všemu je to všechno pod rootem, protože práva jsou otrava.
Jsem rád, že jsme se od „ je skoro nemožné ji jako službu spustit a to i v tom 'moderním správci služeb'“ dostali k „prostě s těmito programy není žádný problém“.
Stylem jeden o voze, druhý o koze.
Tady se staví správce služeb který už je daleko větší, než jen init + rc a nikde za ty roky není definováno, co by to vlastně mělo být a kam to směřuje.
Jako by snad u SysVInitu + rc skriptů bylo definováno, co by to mělo být a kam to směřuje. Mít předem úplnou specifikaci by bylo hezké, ale ve světě opensource se mnohem častěji vyvíjí stylem „kecy jsou levné, ukaž mi kód“. Se SysVInitem bylo nespokojených dost lidí, některé chyby byly pojmenované, a občas prostě někdo zkusil napsat něco lepšího. Chronologicky nejmladší je asi systemd, nikdo si nemyslí, že by bylo poslední.
Co se mi ale na původních sysv + rc skriptech konceptuálně líbí je to, že je to vybudované z toho, co již v systému tak jako tak existuje.
To mě se líbí také, ale jedině tehdy, pokud je to bonus navíc k základní funkci. Jenže v případě init skriptů musela tomuto bonusu ustoupit základní funkcionalita, a to je pro mne nepřijatelné. Systemd nepřišel s ničím principiálně novým, to co dělá, by se taky dalo poslepovat v shellu – ale nikdo to neudělal. Nikdo neprosadil to, že se spouštění služby nebude skriptovat v shellu, ale popíše se, jak má ta spuštěná služba vypadat, a nějaký bazmek (klidně napsaný v shellu) se postará o to, aby se ta služba v takovém stavu spustila. Už jenom ten deklarativní zápis, i když je u systemd dost divný, je obrovský přínos – protože teď může přijít kdokoli jiný, a na základě toho popisu spustit službu svým nástrojem. Klidně někdo může napsat shell skript, který bude interpretovat systemd unit soubory a spouštět ty služby pod SysVInitem. Tohohle nejde s „popisem“ služby v shellovém skriptu nikdy dosáhnout, protože tam není popsáno, co je cílem, ale jak toho dosáhnout – a nikdo nedokáže napsat nástroj, který by z toho to „co“ vždy spolehlivě zjistil.
A když to vezmu z hlediska uživatele, tak co může být lepší reklamou pro příkazy, které mu jsou nabízeny v shellu, než to, že je z nich postaven i ten systém? Tímto stylem se podle mě o systému naučí mnohem víc, než v dockeru, viz. následující bod.
Jenže spousta lidí nechce používat shell nebo se ho dokonce naučit, oni chtějí jen spustit web server jako službu.
Docker a podobné technologie nalákaly lidi, kteří o linuxu neví vůbec nic, nechtějí o něm nic vědět
Ano, nalákali lidi, kteří dříve o linuxu nevěděli vůbec nic a ani ho žádným způsobem nepoužívali – vstupní bariéra pro ně byla příliš velká. Teď se ale k linuxu dostanou mnohem snáz, začnou ho používat – a někteří se budou chtít dozvědět víc.
Stylem jeden o voze, druhý o koze.
Já jsem začal o programech, u kterých se jejich autor nestará o to, aby ten program běžel jako služba. Pokud ty jsi pokračoval o něčem jiném, není to moje chyba. Pokud jsi pokračoval o tom stejném, neuvedl jsi jediný příklad, že by se autor programu nestaral o to, že poběží jako služba, a kvůli tomu by byl problém se jeho spuštěním pod moderním správcem služeb.
Mít předem úplnou specifikaci
Nejde o specifikaci. Jde o filozofii. Co by mělo být výsledkem. Stačí půl stránky.
Jenže v případě init skriptů musela tomuto bonusu ustoupit základní funkcionalita, a to je pro mne nepřijatelné.
No vidíš a pro mě je důležitější čistota systému, než tam mít něco pro funkcionalitu, kterou lze řešit jinak.
a někteří se budou chtít dozvědět víc
To je jistě možné, ale otázkou je, proč tak neudělali doposud, když vstupní bariéra posledních 20 let vypadá přibližně tak, že při instalaci stačí několikrát odentrovat a je hotovo. Nehledě na to, že hezkých pár let existují předinstalovaná vmka, kde si to mohl každý kdo chtěl vyzkoušet. Druhá strana mince je ta, že lidi, kteří by byli schopni do toho více proniknout zůstanou jen u dockeru a nikam dál se neposunou. Nevím, kde je ta hranice, kdy je to ještě přínosné a kdy škodlivé.
Já jsem začal o programech, u kterých se jejich autor nestará o to, aby ten program běžel jako služba.
Ano ale potom jsi tiše automaticky předpokládal, že se ten program bude chovat slušně. Ale to není automaticky splněno. Příkladem budiž minecraft server, který (jak již název napovídá) je herní server. A přesto je docela obtížné jej jako server provozovat.
Ano, když si jej někdo spustí čistě v terminálu, tak jede. Jenže jeho spuštění skončí na něčem jako readline, tj že očekává příkazy, má vlastní prompt apod.. Naštěstí reaguje i na stdin. Roky se to řešilo tak, že se uzavřel do vlastní screen / tmux session a pomocí send keys funkcionality, se tomu posílaly příkazy. Jenže výstup (stdout) nikde nebyl vidět (resp. byl vidět jen v té screen / tmux session, nikam se to nelogovalo).
Prostě to, že "se autor nestará o to, aby ten program běžel jako služba" může dopadnout tak, že to jako služba půjde spustit poměrně obtížně. Kdyby ten mc server měl ovládání nezávislé od té služby, tak by to bylo o něčem jiném.
Jako ono to nakonec rozjet jde a v systemd dokonce s výhodou předávání socketů na stdin (ale zase je tam aktivní socket activation). Ale rozhodně nechci, aby tímto stylem další autoři programovali další programy a u toho se tímto stylem nestarali o to, jak to poběží jako služba. Protože toto je fakt pain provozovat a můžeme se jen hádat o tom, které řešení je horší. Jestli screen / tmux nebo celkem umělé napojení na fifo.
No vidíš a pro mě je důležitější čistota systému, než tam mít něco pro funkcionalitu, kterou lze řešit jinak.
Pro mne je důležitější mít funkcionalitu, než možnost, že by to teoreticky šlo řešit jinak – ale vyřešené to není.
To je jistě možné, ale otázkou je, proč tak neudělali doposud, když vstupní bariéra posledních 20 let vypadá přibližně tak, že při instalaci stačí několikrát odentrovat a je hotovo.
To právě není pravda. Instalací systému to nekončí. Pak bude chtít spustit svou službu – a narazí na ty init skripty.
Ano ale potom jsi tiše automaticky předpokládal, že se ten program bude chovat slušně. Ale to není automaticky splněno.
Ale taky to neznamená, že se tak chovají všechny programy, nebo jejich většina. To, že se programátor nestará o to, aby to běželo jako služba, neznamená, že se nezajímá o to, jak to poběží jako služba.
To právě není pravda. Instalací systému to nekončí. Pak bude chtít spustit svou službu – a narazí na ty init skripty.
Samozřejmě, že to instalací nekončí, hned po snadné instalaci může zkoumat systém, jak a proč a na jakých základech je to postaveno, prostě objeví celý nový svět. Proč by zase měl nutně chtít spouštět nějaké své služby? Bavili jsme se o tom, že "a někteří se budou chtít dozvědět víc".
Tohle je možná to, co je mi na dockeru asi nejvíc proti srsti. Ten přístup lidí. Že je tam možná nějaký linux, na to lidi kašlou (ne všichni), ale hlavně (jak píšeš), že mu tam jede jeho výtvor.
To, že se programátor nestará o to, aby to běželo jako služba, neznamená, že se nezajímá o to, jak to poběží jako služba.
Ok, tak pokud se zajímá o to, jak to poběží jako služba současně taky znamená, že si z hromady možností, jak ten program napsat a ovládat, vybere tu, která nejlépe umožňuje běh jako služba. To je u mě totéž, jako kdyby se staral, aby to běželo jako služba. Možná ne technicky (odpojením od řídícího terminálů a odforkováním), ale implementací určitě.
Bavili jsme se o tom, že "a někteří se budou chtít dozvědět víc".
Víc se budou chtít dozvědět, pokud s tím systémem vůbec budou chtít pracovat. A pracovat s ním budou chtít tehdy, pokud tam snadno zprovozní to, co potřebují.
Že je tam možná nějaký linux, na to lidi kašlou (ne všichni), ale hlavně (jak píšeš), že mu tam jede jeho výtvor.
No vždyť ano. Je to jen nástroj, který chtějí použít pro svoji práci – a když se jim osvědčí, budou ho třeba používat víc. Ty to možná vnímáš jinak, ale pro většinu lidí není operační systém na počítači to primární, je to pro ně jen nástroj, jak s počítačem dělat něco jiného.
Ok, tak pokud se zajímá o to, jak to poběží jako služba současně taky znamená, že si z hromady možností, jak ten program napsat a ovládat, vybere tu, která nejlépe umožňuje běh jako služba. To je u mě totéž, jako kdyby se staral, aby to běželo jako služba. Možná ne technicky (odpojením od řídícího terminálů a odforkováním), ale implementací určitě.
Pro mne je důležité to, aby ten program počítal tím, že u něj nebude sedět člověk. Takže ovládání přes readline nepovažuju za dobrý nápad. Ale jinak ty pokusy aplikací udělat ze sebe službu jsou spíš na škodu – právě jako to odpojení od řídícího terminálu a odforkování.
Ty to možná vnímáš jinak, ale pro většinu lidí není operační systém na počítači to primární, je to pro ně jen nástroj, jak s počítačem dělat něco jiného.
Ano, pro mě je velmi důležitá i ta GNU filozofie. Která se pomalu vytrácí. Dále je pro mě důležité vědět, že systémy lze stavět i způsobem unixu, tedy z malých jednoúčelových nástrojů postavit větší celek. Nic z toho nikdy nebude pro většinu lidí, ale pro někoho snad.
> Tohle je možná to, co je mi na dockeru asi nejvíc proti srsti. Ten přístup lidí. Že je tam možná nějaký linux, na to lidi kašlou (ne všichni), ale hlavně (jak píšeš), že mu tam jede jeho výtvor.
A proc by na to nemeli kaslat? Kdyz chces stlouct dva ramy, zajima te jak se vyrabi kladivo, nebo je to proste jenom nastroj, ktery pouzijes ?:-)
Pochop, ze zejmena v komercni sfere nikdo nestoji o zadne "genialni" adminy bastlire, ale o unifikovane, standardni reseni.
A to je presne jeden z duvodu, proc se Docker tak dobre ujal a proc jej pouzivaji - protoze poskytuje presne tohle, na spravu jsou kontejnery mnohem jednodussi nez nejake vlastni bastleni / lepeni sluzeb na jeden VM ci dokonce fyzicky stroj.
> Ok, tak pokud se zajímá o to, jak to poběží jako služba současně taky znamená, že si z hromady možností, jak ten program napsat a ovládat, vybere tu, která nejlépe umožňuje běh jako služba. To je u mě totéž, jako kdyby se staral, aby to běželo jako služba. Možná ne technicky (odpojením od řídícího terminálů a odforkováním), ale implementací určitě.
A proc by mu pro implementaci nemelo stacit spustit se, nastartovat vlakna ktere potrebuje a osetrit standardni ukonceni programu? Presne takhle to totiz dela Kafka (+ ma navic i remote API, ale tj jedno).
Ono kdyz je program udelany takto, tak to bude fungovat vsude - jen v sysvinitu je potreba resit ojeby / spousteni pres dalsi programy (su,daemon,...)
A proc by na to nemeli kaslat? Kdyz chces stlouct dva ramy, zajima te jak se vyrabi kladivo, nebo je to proste jenom nastroj, ktery pouzijes ?:-)
No kupodivu zajímá, protože, světě div se, jsou různá kladiva pro různé účely a už jsem viděl někoho zatloukat hřebíky olověným kladivem určeného pro práci s měkkými kovy (aby nezanechávalo stopy po úderech).
A to je presne jeden z duvodu, proc se Docker tak dobre ujal a proc jej pouzivaji - protoze poskytuje presne tohle, na spravu jsou kontejnery mnohem jednodussi nez nejake vlastni bastleni / lepeni sluzeb na jeden VM ci dokonce fyzicky stroj.
Mno. Jenže všechen ten bordel se přesunul jen dovnitř, kde na něj není vidět. Neříkám, že to tak dělají všichni, ale co jsem měl tu čest vidět, jak lidé zacházejí speciálně s dockerem tak, že je to jen o tom to nějak zbaslit (stáhnout z náhodných zdrojů image, dát tam konkrétní verze knihoven apod.) aby to prostě jelo. Tady je obrovský potenciál pro bezpečnostní problémy do budoucna, protože se málokdo zajímá taky o to, že by se to mělo třeba upgradovat apod. (někteří vysloveně uvádějí, že za výhodu dockeru považují to, že tam budou mít stálé prostředí na věky věků od vytvoření až do smrti - toho kontejneru - a nějaké updaty os je zbytečně jen otravují).
A proc by mu pro implementaci nemelo stacit spustit se, nastartovat vlakna ktere potrebuje a osetrit standardni ukonceni programu?
A já jsem někde psal, že by mu to nemělo stačit? Ale pro to, aby to takhle někdo naimplementoval, tak nejdřív musí vědět, že tohle je vhodný způsob. Což ne vždy ví.
Díky, runuser jsem neznal a hledání na webu při psaní článku asi preferovalo alternativy.
Kafka vystavuje metriky na JMX rozhraní JVM, používá běžnou Yammer/Codehale/Dropwizzar knihovnu. Grafy konkrétně zobrazujeme v Grafaně, nicméně screenshoty uvedené v článku nejsou přímo z Kafky, ale z aplikace. Na sběr a ukládání metrik existuje spousta nástrojů, záleží, s čím máte zkušenosti a co preferujete.
- http://kafka.apache.org/documentation/#monitoring
- https://grafana.com/
Díky za článek, byla to jedna z nejlepších věcí, kterou jsem tu za poslední roky četl. Přesně takhle by články na Rootu měly vypadat.
Jen dvě poznámky:
1) O přepínání uživatele by se měl starat init, viz můj předchozí komentář k systemd. Spuštění služby pod neprivilegovaným uživatelem je tak základní věc, že mě udivuje, jak často se to řeší nějakým ad-hoc specifickým skriptem/způsobem.
2) Systémy se vyplácí testovat po částech a to včetně tak „samozřejmých“ věcí, jako je spuštění a ukončení. Kdybyste otestovali, že služba má při vypínání dostatek času, aby zavřela všechny soubory a řízeně se ukončila tzn. není násilně zabita, tak byste nemuseli řešit záhadné problémy s nějakou duplikací zpráv a diagnostikovat řádově složitější problém zahrnující X prvků v clusteru. Nechci vypadat jako „po bitvě generál“ – sám to taky beru jako poučení a schválně si překontroluji svoje PayaraFishe a další věci (myslím, že času na ukončení mají dost, protože to trvá dlouho a vidím tam průběh......, ale jistota je jistota :-)
To že si v enterprise firmě celá armáda enterprise vývojářů nepřečte dokumentaci upstartu a neví pořádně jak fungují procesy v *nix systémech nebudu vůbec radši komentovat, ale zaujala mě jiná část článku začínající kouzelnou větou:
Námi vyvinutý systém pro big data analýzy (v každodenních špičkách řádově 100k událostí/s, nekomprimovaných 100 MB/s) používá na příjmové straně dvě vrstvy oddělených Kafka clusterů.
Wow, s obtížemi hledám slova. Nevím jestli je to překlep, ale jestli tohle někdo považuje za big data, tak je mi ho upřímě líto. 100 MB/s nekomprimovaných dat je směšně málo. K 100k events/s se dá říct prakticky totéž. Vždyť takový datový tok lze bez zálohování zvládnout na běžném (trochu lepším) dnešním PC.
Události z Kafky vyčítají Input Filtry, jejichž úkolem je konverze starších formátů na nový, čištění dat, opravy chyb způsobených bugy v historických verzích klientů, obohacení událostí o GeoIP lokace a podobně. Data se zapisují zpět do té samé DC Kafky, ale do topiků s jinými jmény.
Aha, tady je zakopaný pes. Takových architektur už jsem viděl. To je těžké, když SW architekt neví jak funguje moderní HW. Docela spolehlivý způsob jak vyhazovat peníze lopatou oknem a ohřívat planetu. Těch spálených MWh. Vsadím se, že uhádnu v čem je to napsané.
Autor článku už několikrát ve čtyř-nodovém clusteru pozoroval datové přenosy stovek MB/s, resp. vyšších stovek tisíc zpráv/s. Limitním faktorem bývá spíše rychlost síťových propojů než disků nebo aplikačního kódu.
Počkat, nepsal autor, že mu tam teče nekomprimovaných 100 MB/s ve špičce? Kolik mu tam teče komprimovaných MB/s průměrně, že mu saturuje síťové spoje v mnohanodovém clusteru? Není tam něco zásadně špatně v architektuře systému? No když ty data prožene kolečkem disk->pamět->síť->pamět->CPU->pamět->síť->pamět->disk a to několikrát za sebou, tak se není moc čemu divit. Komu není s hůry dáno, v apatice nekoupí. Blahoslavení chudí duchem ... Atd. Jo když je SW architekt nemehlo i takové směšné datové toky mohou být big data. Dnes má big data už úplně každý. Big data do každé rodiny!
Běžné 4 GHz čtyřjádro. Například komprese zstd 1.1.3 -1 430 MB/s na jednom jádře! Těch 100MB/s je špičková hodnota. Přepokládejme 10x méně celodenní průměr. (I těch 100MB/s musíme brát s rezervou. Stačí se podívat jak se z 100k událostí za s stalo ve skutečnosti ani ne 30k/s viz graf Globální graf počtu zkonzumovaných zpráv přímo v článku!) Pro všechna čtyři jádra to máme nějakých 1600 cyklů na 1B. Na moderním CPU můžu dělat až čtyři instrukce na cyklus, ale klidně počítejme míň. Stejně, co sakra celou tu dobu budu dělat? Jenže to nesmím ty data tahat jak kočka koťata z disku, do paměti, po síti ... Vy jste v životě skutečné Big Data řešení neviděl ani z rychlíku stejně tak jako autor článku, protože to by jste musel začít právě těmito výpočty a začít počítat a ne vyhazovat výkon oknem. Pro rychlou představu: Receiverů a Input Filtrů je 11, Kafka brokerů celkem 14, ... 11 Receiverů a Input Filtrů? To nebudou desktopová čtyřjádra, to budou nejméně osmijádra, každé aspoň 32GB RAM. Bezmála stovka 4GHz CPU jader čekajících na pomalé paměti a IO. Označit tohle za Big Data je k smíchu nebo s píš k pláči.
Jeden o voze, druhý o koze. Vy pořád předpokládáte, že ta data přijmou, pak je možná zkomprimují, a zahodí je. Já předpokládám, že ta data přijmou a ukládají je, aby s nimi mohli dále pracovat. Všechny ty vaše následující výpočty mohou být správně, problém je ale hned na začátku v předpokladu, že ta data systémem jenom protékají a na konci co nejrychleji mizí v koši. Vy možná říkáte Big Data něčemu jinému, nicméně vaše příspěvky dost diskvalifikuje fakt, že neustále vypočítáváte jenom proplouvání zpráv systémem, ale vůbec nepočítáte s tím, že by se ty zprávy nějak zpracovávaly.
Vy jste koukám čtenář myšlenek. Co vy výte co já předpokládám? Vy především nemáte vůbec představu jak vypadají skutečná big data a jak směšný je systém, který spracovává 100kr/s a 100MB/s nekomprimovaných dat rozprostřený přes několik datových center a používající několik desítek serverů. Jak nesmyslně je takový systém navržený. Vy si vůbec neuvědomujete, jak směšné to je a čeho je současný HW schopen a jak je smutné, že někdo je schopen tak směšný systém vydávat za big data. Já počítám s tím, že se budou ty zprávy dále zpracovávat, jenže tady je problém, jak absurdním způsobem se to děje. Jak neskutečně postavené je to celé na hlavu. Ten systém je v první řadě zbytečně nákladné topení.
Co předpokládáte vím z toho, co píšete. Protože jste o zpracování těch dat nenapsal ani čárku, naopak pořád dokola píšete jenom o jejich přesouvání a tváříte se, že to je všechno, že tím všechno končí. A opakujete to pořád dokola, i v tomto svém komentáři. Píšete, že „spracovává 100kr/s a 100MB/s nekomprimovaných dat“, jenže ve skutečnosti to znamená, že je 100 kr/s a 100 MB/s nekomprimovaných dat na vstupu. A z toho může vzniknout zpracování třeba 110kr/s, nebo 200 kr/s, nebo třeba taky 10 000 kr/s, a to samé platí i pro objem zpracovávaných dat. Ten váš předpoklad, že objem zpracovávaných dat se rovná objemu vstupních dat, je totiž splněn jenom v jediném případě – když ta přijatá data hned mažete. I kdybyste jenom počítal hash dat přijatých za celý den, zpracováním vám vznikne oproti těm příchozím zprávám ještě jedna zpráva navíc (obsahující ten hash), a zpracujete o délku hashe větší objem dat. No a ve skutečnosti v Avastu nad těmi daty nedělají takhle hrubou agregaci, ale ukládají je a pak je různě prohledávají, takže takže objem zpracovaných dat není objem přijatých dat plus nějaké pidikonstanta, ale objem zpracovaných dat jsou spíš nějaké násobky přijatých dat.
Kdybyste počítal s tím, že se ta data budou dále zpracovávat, nemůžete nikdy napsat, že přírůstek 56 TB dat týdně se dá bez problémů zpracovávat na běžném (trochu lepším) PC. Protože na běžném trochu lepším PC těch 56 TB dat ani neuložíte.
Jak už jsem vám psal, vy si zřejmě pod Big Data představujete něco jiného, než o čem je článek. Já vám to neberu. Akorát mne vaše „opravdová Big Data“ nezajímají, protože nemám žádné využití pro systém, který „zpracovává“ sebevětší množství dat tím způsobem, že je co nejrychleji maže.
Dovolte mi, abych citoval krásnou definici Big Data z wikipedie, se kterou jsem se v mírně jiném znění setkal před více než dekádou, kdy jsem se problematikou Big Data začal prefesionálně zajímat.
Big data is data sets that are so voluminous and complex that traditional data processing application software are inadequate to deal with them.
Je to vskutku krásná a elegantní definice a podle této jednoduché definice se o Big Data nejedná. Ten objem je směšný a použit je naprosto běžný software, který dnes na zpracování trochu většího objemu dat používá prakticky každý.
Čistě z teorie informace, zpracováním dat žádná nová informace nemůže vzniknout. Můžete ty data převracet tisíckrát naruby, ale nezískáte nic nového. Pokud vám při zpracování dat vzrůstá jejich objem, znamená to, že zhoršujete kvalitu kódování obsažené informace. Může to být praktické, třeba z hlediska rychlosti dalšího spracování, například indexace dat. Ale pořád je to jen vaše praktikalita a pokud vám tím objem dat narůstá řádově, tak rozhodně Big Data nemáte, protože, kdyby jste je měl, tak si to nemůžete dovolit.
Pokud vám zpracováním 100kr/s interně vzniká 10 000 kr/s je to chyba vaší architektury, vašeho designu a je to jádro pudla, co je na tom designu a na té architektuře špatně. A nejste sám, takových naprosto špatných a nesmyslných designů, už jsem za svou kariéru viděl a ještě uvidím.
Pokud by jste měl skutečná Big Data, tak vaší hlavní a nejdůležitější starostí bude jak snížit objem dat při zachování maximálního množství informace v nich obsažené. To že si můžete dovolit řádově zvýšit objem dat je samo o sobě důkazem, že Big Data nemáte. Už jen tento samotný fakt vás z používání pojmu Big Data diskvalifikuje.
Je těžké říct co jsou Big Data, ale v některých případech je velmi jednoduché poznat, co Big Data nejsou. Například použití naprosto běžných technologií, plýtvání datovými toky, řádový nárůst datových toků v průběhu zpracování atd. Lidé s tím pojmem žonglují aniž by znali jeho obash. Používají ho jako floskuli, jako marketingový pojem a každý je chce mít jan aby se nimi mohl chlubit. Jenže jako profesionál v oblasti vám řeknu, skutečná Big Data nechcet mít. Věřte mi. Nechcete. Skutečná Big Data jsou PITA.
Nazávěr se musím ohradit proti tvrzení, že navrhuji systém, který „zpracovává“ sebevětší množství dat tím způsobem, že je co nejrychleji maže. O mazání dat jsem nikde nepsal, to slovo jsem nikde nepoužil. Takže si toho slaměného panáka nechte od cesty. Nepodsouvejte mi své vlastní zcela nesmyslné představy. Samozřejmě, že nemůžete na běžné PC uložit přírůstek 56TB dat týdně. Jenže já sjem psal o zpracování a zpracovat je můžete. Uložit si je samozřejmě musíte do adekvátního úložiště a dokonce jsem to i explicitně napsal. Jenže to by jste si do mě nesměl projektovat své představy. A i k tomu obyčejnému PC jde připojit NAS a vzhledem k tomu datovému toku by bylo možné jak zálohovat vstupní stream ještě by mi spousta volného IO zbyla na výstup do další analytiky. (Mimochodem zrovna teď mám na zcela obyčejném PC uložených 8TB dat a počítám, že se mi tam nějaké 4TB vejdou. Magic. Kdybych tam místo toho jednoho SSD dal pár obyčejných komoditních SATA HD, tak bych tam tam ten směšný vstupní tok mohl klidně pár dní skladovat jako first level backup. Abych předešel nedorozumnění a dalším slaměným panákům, pro skutečné řešení bych doporučil pořádný NAS.)
Red herring neni situace, kdy si z tebe nekdo dela legraci, protoze ses ztrapnujes svoji aroganci a neznalosti :)
Programator ses mozna dobrej, mozna jsi i nejake big data reseni stvoril (popravde, je mi to osobne celkem jedno pro tuhle diskusi), ale tady v diskusi ses projevil jako arogantni blbec, ktery se tu povysuje, aniz vlastne vi, co ten system resi, neresi, jake analyzy provadi, jake jsou na nej vubec pozadavky atd. :-)
Je to vskutku krásná a elegantní definice a podle této jednoduché definice se o Big Data nejedná. Ten objem je směšný a použit je naprosto běžný software, který dnes na zpracování trochu většího objemu dat používá prakticky každý.
Ano, používají software, například Hadoop, který se běžně ke zpracování Big Data používá. Operovat tradičním zpracováním je dnes problém, protože dnes už se běžně zpracovávají i takhle velké objemy dat. Je možné, že nejde o Big Data podle nějaké definice, na druhou stranu je to větší objem dat, než kolik můžete zpracovat tradičním způsobem na jednom počítači.
Pokud vám zpracováním 100kr/s interně vzniká 10 000 kr/s je to chyba vaší architektury, vašeho designu a je to jádro pudla, co je na tom designu a na té architektuře špatně. A nejste sám, takových naprosto špatných a nesmyslných designů, už jsem za svou kariéru viděl a ještě uvidím.
Já tohle nedělám, vycházím jenom z článku a z pár rozhovorů s několika lidmi z Avastu. Ani kdyby to takhle bylo, nemusí to být špatně – data se nezpracovávají proto, abyste je jen tak převaloval na disku, ale proto, že potřebujete něčeho dosáhnout, a ty data k tomu potřebujete. A pokud pro splnění toho cíle je potřeba ta data 10× nafouknout (třeba aby v nich bylo možné snadno vyhledávat), tak se vám při tom zpracování ta data prostě desetkrát nafouknou. A je to v pořádku, protože to zpracování není cílem, je to jen nástrojem. Představte si to třeba na jednoduchém textu, který zkomprimujete na 1/3 velikosti. Cílem je, aby ho mohl přečíst člověk, takže ten komprimovaný text se vám během zpracování nafoukne na trojnásobek. Ale není to chyba ani architektury ani designu, je to prostě dosažení požadovaného cíle.
Je těžké říct co jsou Big Data, ale v některých případech je velmi jednoduché poznat, co Big Data nejsou.
To je možné, ale pro článek to není vůbec podstatné. Pokud vás to nazvání Big Daty v článku tolik irituje, povzneste se nad něj a nazývejte si to klidně Small Data.
O mazání dat jsem nikde nepsal, to slovo jsem nikde nepoužil.
To slovo jste nikde nepoužil, ale je to jediný způsob, jak docílit toho, že celkový objem zpracovaných dat se rovná objemu vstupních dat. Už jsem vám to vysvětloval, že když ta data budete chtít jenom někam zapsat, objem zpracovaných dat je dvojnásobkem objemu vstupu – X dat načtete, X dat uložíte, takže jste dohromady zpracoval X+X.
Jenže já sjem psal o zpracování a zpracovat je můžete.
Uložení je také zpracování. Zrovna u velkých objemů dat je uložení dost podstatnou částí zpracování.
Uložit si je samozřejmě musíte do adekvátního úložiště a dokonce jsem to i explicitně napsal. […] A i k tomu obyčejnému PC jde připojit NAS
Aha, takže to vaše zpracování na běžném PC znamená, že to zpracujete na běžném PC a připojeném NASu. A nebo na běžném PC a připojeném clusteru serverů…
tak bych tam tam ten směšný vstupní tok mohl klidně pár dní skladovat
Fajn, takže už jste připustil, že je dobré ta data alespoň někam uložit. Jenže pokud vím, Avast ta data nechce mít jenom někde uložená. Oni s nimi chtějí pracovat, vyhledávat v nich, filtrovat je, agregovat. Ne jak přicházejí, ale dodatečně – někdo si vzpomene, že chce udělat takový a takový výběr nad daty týden zpět (napamatuji si, kolik dat zpětně si nechávají). Aby to bylo možné, nestačí mít ta data co nejefektivněji uložená, ale také zindexovaná – prostě připravená k dalšímu zpracování. Jak už jste sám uznal, tím objem dat narůstá, přestože se tím jejich informační hustota ředí.