[SPEC, RFC] tokyotyrant.spec, rcskrypt dla wielu instancji

Remigiusz 'Enleth' Marcinkiewicz enleth w enleth.com
Czw, 27 Maj 2010, 17:45:55 CEST


Witam,

[uwaga, wyszło długie]

przygotowałem speca dla Tokyo Tyrant, interfejsu sieciowego bazy Tokyo 
Cabinet, ale jest jeden haczyk: żeby tego się w ogóle dało używać, musiałem 
napisać skrypt startowy obsługujący wiele instancji usługi. Nie jest jeszcze 
gotowy, a uwagi pewnie będą też do części które już są, stąd ułamkowy rel w 
specu i RFC w temacie.

TT jest specyficzną usługą, która nie ma żadych plików konfiguracyjnych ani 
katalogu roboczego i przyjmuje całą konfigurację w argumentach podczas 
uruchamiania. Na dodatek jedna instancja obsługuje dokładnie jedną tabelę 
(która wcale nie musi być istniejącym plikiem, może być w pamięci), więc w 
normalnych warunkach na serwerze działa wiele procesów TT, każdy na prawach 
konkretnego usera który go używa, względnie jako nobody. Czegoś takiego jak 
systemowy TT po prostu nie ma. Skrypty startowe PLD takiej sytuacji generalnie 
nie przewidują, więc musiałem coś wymyślić.

Z istniejących już w PLD skryptów startowych najbliżej tego, co chciałem 
osiągnąć są MySQL, PostgreSQL i memached. Problem w tym, że dwa pierwsze mają 
katalogi robocze dla każdej instancji - skrypt startowy nie przejmuje się 
konfiguracją i ma wygodne miejsce na pidfile dla każdego procesu - a ostatni 
rozróżnia instancje tylko po IP i porcie, każdej wmuszając tę samą 
konfigurację, więc może wszystko pobierać z jednego pliku w /etc/sysconfig/.

tokyotyrant.init w załączniku to mieszakna powyższych z moimi własnymi 
pomysłami. Sposób uruchamiania i przechowywania plików pid podebrałem z 
memached, przy czym implementacja przewiduje działanie procesów TT na prawach 
różnych użytkowników i grup. Wspólna grupa tokyotyrant jest ustawiana przez 
start-stop-daemon jako dodatkowa dla procesu, nie główna. Usera pakiet nie 
dodaje bo wydaje mi się, że byłby bezużyteczny. TT pracujący z plikiem 
powinien działać jako właściciel pliku, pracujący na pamięci (np. jako 
zamiennik memached) spokojnie może jako nobody.

Obsługa konfiguracji to z kolei własny wynalazek - pliki konfiguracyjne są 
trzymane w /etc/tokyotyrant.d/ i sÄ… po prostu skryptami shellowymi 
ustawiającymi odpowiednie zmienne. W ten sposób uniknąłem ręcznego rzeźbienia 
jakiegoś nowego, zupełnie niepotrzebnego formatu konfiguracji (jak np. w 
autossh) i ułatwiłem sobie zarządzanie dużą ilością procesów. Włączanie i 
wyłączanie konfiguracji odbywa się przez chmod +x/-x. Nie wiem, czy to dobry 
pomysł - być może lepiej jest zdefiniować w samym pliku zmienną mówiącą, czy 
dany konfig ma zostać uruchomiony. Zmienię to, jeśli komentarze będą na to 
wskazywać. Przykładowa konfiguracja instalowana do /etc/tokyotyrant.d/example 
jest standardowo wyłączona, ale jeśli się ją włączy, proces TT wystartuje na 
każdym systemie, z bazą hash w pamięci.

Zupełną nowością jest opcjonalne wybieranie konkretnych instancji do 
uruchomienia lub zatrzymania, jako drugi po akcji argument skryptu - po nazwie 
pliku z kofnfiguracją w /etc/tokyotyrant.d/. Bez niego skrypt działa jak te od 
baz danych, startując lub zatrzymując, odpowiednio, wszystkie które jeszcze 
nie są włączone a mogłyby być, lub wszystkie które jeszcze działają. Na 
potrzeby statusu uznaje, że usługa działa jeśli działa choć jedna instancja. 
Jeśli podczas startu część nie ruszy, tym działającym pozwoli pracować dalej, 
ale syngalizuje problem komunikatem. Po co to wszystko? Bo uznałem, że to 
debilizm, restartować wszystkie procesy (potencjalnie wysypując np. działające 
aktualnie żądania dla PHP które coś biorą z TT), jeśli zmieniam tylko jedną 
konfiguracjÄ™.

Jeszcze nie ma obsługi polecenia "status" - nie jest mi potrzebna, ale jeśli 
skrypt dostanie szansę na wrzucenie do CVSa, uzupełnię to razem z innymi 
sugerowanym poprawkami. Mogą być w kodzie rzeczy zrobione źle lub 
nieelegancko, nie jestem mistrzem programowania w shellu. Starałem się 
patrzeć, jak inni zrobili podobne rzeczy w innych skryptach. Może brakować 
czegoś, czego braku nawet nie zauważyłem. Krytyka jest oczywiście bardzo 
wskazana.

W praktyce to działa dobrze od ładnych paru miesięcy, jest wygodne i z 
pewnością znacznie łatwiejsze w zarządzaniu, niż gdyby konfiguracja miała być 
przechowywana w jakimś pojedyńczym pliku. Bardzo podobnego skryptu używam też 
od jeszcze dłuższego czasu do obsługi FastCGI i tak samo sprawdza się 
doskonale. Skrypt do TT wysyłam na listę jako pierwszy, bo jest prostszy - 
łatwiej go przeanalizować i skomentować, czy jest dobry, czy nie. Wszelkie 
sugestie do TT zastosuję też do skryptu FastCGI zanim go udostępnię.

Spec jest przepuszczony przez adapter, wszystko siÄ™ buduje, instaluje i 
odinstalowuje poprawnie. Zależności chyba kompletne.

Pozdrawiam,
-- 
Remigiusz "Enleth" Marcinkiewicz, enleth w enleth.com
WWW http://enleth.com http://heroes.net.pl
JID enleth w jabster.pl
-------------- nastêpna czê¶æ ---------
Załącznik, który nie był tekstem został usunięty...
Name: tokyotyrant.init
Type: application/x-shellscript
Size: 3760 bytes
Desc: nie znany
Url : /mailman/pipermail/pld-devel-pl/attachments/20100527/5a6b7d46/attachment.bin 
-------------- nastêpna czê¶æ ---------
Załącznik, który nie był tekstem został usunięty...
Name: tokyotyrant.spec
Type: text/x-rpm-spec
Size: 3849 bytes
Desc: nie znany
Url : /mailman/pipermail/pld-devel-pl/attachments/20100527/5a6b7d46/attachment-0001.bin 
-------------- nastêpna czê¶æ ---------
TT_DATABASE="*"
TT_ADDR="/tmp/tt-example.sock"
TT_PORT=0
TT_UID=nobody:nobody
TT_MASK="copy,restore,repl,slave"
TT_PID="/tmp/tt-example.pid"
-------------- nastêpna czê¶æ ---------
Załącznik, który nie był tekstem został usunięty...
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/20100527/5a6b7d46/attachment.sig 


Wiêcej informacji o li¶cie dyskusyjnej pld-devel-pl