[RFC] Skrypty startowe dla wielu instancji usługi

Remigiusz Marcinkiewicz enleth at enleth.com
Sat Mar 12 05:00:02 CET 2011


Witam,

jakiś czas temu okazało się, że potrzebuję czegoś takiego, jak uruchamianie 
wielu instancji jednej usługi, z mniej lub bardziej różną konfiguracją na 
instancję i pełnym wsparciem ze strony skryptów startowych. Istniejących 
rozwiązań tego typu doliczyłem się w PLD sztuk dwa - MySQL i PostgreSQL - a 
oba dość siermiężne, nienadające się do zastosowania dla niektórych typów 
usług (rozwinę to dalej) i dołatane pod konkretny przypadek. Nic 
uniwersalnego, nic wygodnego w użyciu. Ustaliłem więc następujące założenia, 
które musi spełniać "dobry" (tzn. dobry dla mnie) skrypt tego typu:

a) Wywoływany normalnie (/etc/rc.d/init.d/dupa start itp.) ma działać 
normalnie - odpalać, zatrzymywać, odpytywać itp. wszystkie (jeszcze nie 
uruchomione/nadal działające/...) instancje, realizować najbardziej ogólny 
przypadek.
b) Oprócz tego musi umieć odpalić, zatrzymać, zrestartować itp. pojedyńczą, 
wskazaną instancję, np. /etc/rc.d/init.d/dupa restart dupa05-debug
c) Jeśli podczas uruchamiania wszystkich instancji naraz któraś nie zechce 
wstać, bo np. jest źle skonfigurowana, musi poprawnie uruchomić pozostałe, 
również następne w kolejności
d) Musi obsługiwać usługi, które nie posiadają nawet własnego pliku 
konfiguracyjnego, o jakimś katalogu z danymi i konfiguracją nie wspominając, 
czyli przyjmujące absolutnie wszystko jako argumenty - tak, jak np. memcached
e) W związku z powyższym powinien oczekiwać konfiguracji w formie plików w 
stylu /etc/dupa.d/dupa05-debug
f) Musi być w stanie uruchomić każdą instancję na na prawach innego 
użytkownika, zgodnie z konfiguracją
g) Mimo powyższego, musi dopilnować, żeby pliki pid i lock nadal były tam, 
gdzie być powinny, czyli w /var/run/ i /var/lock/subsys/
h) Ogólnie wszystko ma działać przynajmniej tak dobrze, jak w normalnym 
srypcie startowym

Powyższe wynika z tego, że obecnie dostępne w PLD metody uruchamiania 
memcached, php-fcgi i podobnych usług można sobie o kant dupy rozbić w 
jakimkolwiek poważnym zastosowaniu wymagającym np. obsług wielu użytkowników, 
z których każdy ma mieć swoją instancję czegośtam na swoich uprawnieniach.

Oczywiście samo się nie zrobi, więc skoro było potrzebne, to zrobiłem. Mam 
testowe skrypty startowe dla memcached, tokyotyrant i PHP FastCGI spełniające 
te założenia, używam ich na produkcji już od jakiegoś czasu i wydaje mi się, 
że wyszły na tyle dobrze, żeby się nimi podzielić ze światem, zapytać o zdanie 
i zaproponować dołączenie tego do PLD.

Skrypty nie są jeszcze całkowicie gotowe, w ogóle nie obsługują czegoś 
takiego, jak zgodność wstecz z konfiguracją starego typu dla odpowiednich 
usług i używają /etc/rc.d/init.d/functions które nie jest za bardzo 
przystosowane do sposobu, w jaki traktują pliki pid i lock - działa to 
właściwie trochę przez przypadek. Mogą też zawierać jakieś błędy, których po 
prostu nie wychwyciłem, więc wszelka (najlepiej konstruktywna) krytyka będzie 
mile widziana.

UWAGA: u osób doświadczonych w pisaniu skryptów shellowych mogą wywołać 
drgawki, konwulsje, duszności, emisję dziwnych dźwięków i inne objawy napadów 
gwałtownego śmiechu. sh znam tyle, co mi jest potrzebne do wydłubania czasem 
czegoś na swoje potrzeby, efekty mogą być niekoszerne, niezgodne z takimi czy 
innymi dobrymi praktykami, głupie itp. Tym bardziej krytyka mile widziana.

Jeśli chodzi o wykonanie, skrypty są podzielone na dwie części - metody start, 
stop, list_status (bo status było już zajęte) i get_instances, które we 
wszystkich skryptach są identyczne poza nazwą usługi w komunikatach i 
ścieżkach do plików, oraz właściwe metody instance_start, instance_stop i 
instance_status które robią coś specyficznego dla jednej instancji danej 
usługi. Gdyby to miało zostać wykorzystane w PLD na szerszą skalę, funkcjom z 
tej pierwszej grupy należałoby nadać jakieś sensowne nazwy i dopisać je do 
functions (oraz nieco przerobić parę rzeczy które już tam są), a następnie 
ustalić jakiś wzorzec samego skryptu startowego dla takich usług. Mógłbym to 
zrobić (lub pomóc zrobić, lub zrobić z czyjąś pomocą), być może od razu 
przerabiając skrypty dla MySQLa i PostgreSQLa na "nowe" i kombinując z jakąś 
zgodnością wstecz, żeby przynajmniej nic się nie sypało po upgrade.

Poza tym:
 - pliki lock są zapisywane jako np. /var/lock/dupa-dupa05-debug, czyli 
/var/lock/usługa-instancja
 - pliki PID dla odmiany są zapisywane jako np. /var/run/dupa/dupa05-
debug.pid, żeby za pomocą wspólnej grupy załatwić problem programów tworzących 
pidfile już po zrzuceniu roota/odpalanych przez s-s-d od razu z usera -  s-s-d 
specjalnie po to ma opcję dokładania jednej grupy ekstra do listy grup procesu
 - mogłem coś pomieszać ze statusami wyjściowymi, szczególnie przy 
"częściowym" powodzeniu
 - zakładam, że usługa "ogólnie działa" jeśli działa choć jedna instancja, ale 
nie jest tworzony ogólny /var/lock/subsys/dupa - być może powinien być, jeśli 
coś musiałoby sprawdzić czy działa i nie spodziewałoby się, że ma sprawdzać 
istnienie /var/lock/subsys/dupa-*
 - założyłem sobie, że konfiguracja z o-x jest "wyłączona" - ale to może być 
nadużycie funkcjonalności systemu plików, tzn. powinno być zrealizowane 
zmienną w samym pliku konfiguracyjnym, a poza tym jest wykomentowane bo 
shellowi się nie spodobał warunek, cholera go wie czemu
 - używa /usr/bin/find - ale rc-scripts i tak wymaga findutils ze względu na 
xargs, a w momencie uruchomienia tych skryptów /usr/ zdecydowanie powinno być 
zamontowane, więc chyba to nie problem

Na razie, zgodnie z tematem, to jest RFC - czyli proszę o uwagi, komentarze i 
inne takie.

Pozdrawiam,
-- 
Remigiusz "Enleth" Marcinkiewicz, enleth w enleth.com
WWW http://enleth.com http://heroes.net.pl
JID enleth w jabster.pl
-------------- nast�pna cz��� ---------
A non-text attachment was scrubbed...
Name: fcgi
Type: application/x-shellscript
Size: 3677 bytes
Desc: nie znany
URL: </mailman/pipermail/pld-devel-pl/attachments/20110312/cf5940d9/attachment.bin>
-------------- nast�pna cz��� ---------
A non-text attachment was scrubbed...
Name: memcached
Type: application/x-shellscript
Size: 3739 bytes
Desc: nie znany
URL: </mailman/pipermail/pld-devel-pl/attachments/20110312/cf5940d9/attachment-0001.bin>
-------------- nast�pna cz��� ---------
A non-text attachment was scrubbed...
Name: tokyotyrant
Type: application/x-shellscript
Size: 3825 bytes
Desc: nie znany
URL: </mailman/pipermail/pld-devel-pl/attachments/20110312/cf5940d9/attachment-0002.bin>
-------------- nast�pna cz��� ---------
A non-text attachment was scrubbed...
Name: nie znany
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part.
URL: </mailman/pipermail/pld-devel-pl/attachments/20110312/cf5940d9/attachment.sig>


More information about the pld-devel-pl mailing list