mysql. mechanizmy wewnętrzne bazy danych pełna wersja.pdf

(6935 KB) Pobierz
887629156.001.png
Narzędziowe wywołania API
65
Makra preprocesora
68
Zmienne globalne
70
4.
Komunikacja między klientem a serwerem ............................................................... 73
Przegląd protokołu
73
Format pakietu
73
Relacje między protokołem MySQL a warstwą systemu operacyjnego
74
Uzgadnianie połączenia
75
Pakiet polecenia
80
Odpowiedzi serwera
83
5.
Zmienne konfiguracyjne .............................................................................................89
Zmienne konfiguracyjne: samouczek
89
Interesujące aspekty konkretnych zmiennych konfiguracyjnych
96
6.
Wątkowa obsługa żądań ........................................................................................... 115
Wątki kontra procesy
115
Implementacja obsługi żądań
117
Problemy programowania wątkowego
121
7.
Interfejs mechanizmów składowania .......................................................................127
Klasa handler
127
Dodawanie własnego mechanizmu składowania do MySQL
142
8.
Dostęp współbieżny i blokowanie ............................................................................ 163
Menedżer blokad tabel
164
9.
Parser i optymalizator ............................................................................................... 169
Parser
169
Optymalizator
172
10.
Mechanizmy składowania ........................................................................................ 195
Wspólne cechy architektury
196
MyISAM
196
InnoDB
202
Memory (Heap)
204
MyISAM Merge
205
NDB
205
Archive
206
Federated
207
6 | Spis treści
11.
Transakcje ..................................................................................................................209
Implementowanie transakcyjnego mechanizmu składowania
209
Implementowanie podklasy handler
210
Definiowanie handlertona
212
Praca z pamięcią podręczną zapytań
214
Praca z binarnym dziennikiem replikacji
214
Unikanie zakleszczeń
215
12.
Replikacja ....................................................................................................................217
Przegląd
217
Replikacja oparta na instrukcjach i na wierszach
218
Dwuwątkowy serwer podrzędny
219
Konfiguracja z wieloma serwerami nadrzędnymi
219
Polecenia SQL ułatwiające zrozumienie replikacji
220
Format dziennika binarnego
223
Tworzenie własnego narzędzia do replikacji
227
Skorowidz ............................................................................................................................. 229
Spis treści | 7
ROZDZIAŁ 6.
Wątkowa obsługa żądań
Podczas pisania kodu serwera programista staje przed dylematem: czy obsługiwać żądania
za pomocą wątków, czy procesów? Oba podejścia mają swoje zalety i wady. Od samego początku
MySQL korzystał z wątków. W tym rozdziale uzasadnimy wątkową obsługę żądań w serwerze
MySQL, a także omówimy jej wady i zalety oraz implementację.
Wątki kontra procesy
Być może najważniejszą różnicą między procesem a wątkiem jest to, że wątek potomny współ-
dzieli stertę (globalne dane programu) z wątkiem macierzystym, a proces potomny — nie.
Ma to pewne konsekwencje, które trzeba uwzględnić podczas wybierania jednego albo drugiego
modelu.
Zalety wątków
Wątki są implementowane w bibliotekach programistycznych i systemach operacyjnych z nastę-
pujących powodów:
Zmniejszone wykorzystanie pamięci. Koszty pamięciowe związane z tworzeniem nowego
wątku są ograniczone do stosu oraz do pamięci ewidencyjnej używanej przez menedżer
wątków.
Dostęp do globalnych danych serwera bez użycia zaawansowanych technik. Jeśli dane mogą
zostać zmodyfikowane przez inny działający równolegle wątek, wystarczy chronić odpo-
wiednią sekcję za pomocą blokady ze wzajemnym wykluczaniem, zwanej muteksem (opi-
sywanej w dalszej części rozdziału). Jeśli nie ma takiej możliwości, dostęp do globalnych
danych można uzyskiwać w taki sposób, jakby nie było żadnych wątków.
Tworzenie wątku zajmuje znacznie mniej czasu niż tworzenie procesu, ponieważ nie trzeba
kopiować segmentu sterty, który może być bardzo duży.
Program szeregujący w jądrze szybciej przełącza konteksty między wątkami niż między
procesami. Dzięki temu w mocno obciążonym serwerze procesor ma więcej czasu na wyko-
nywanie rzeczywistej pracy.
115
887629156.002.png
 
Wady wątków
Wątki odgrywają ważną rolę we współczesnych systemach komputerowych, ale mają również
pewne wady:
Pomyłki programistyczne są bardzo kosztowne. Awaria jednego wątku powoduje załama-
nie całego serwera. Jeden wyrodny wątek może uszkodzić globalne i zakłócić działanie
innych wątków.
Łatwo popełnić pomyłkę. Programista musi stale myśleć o problemach, jakie może spowo-
dować jakiś inny wątek, oraz o tym, jak ich uniknąć. Niezbędna jest bardzo defensywna
postawa.
Wielowątkowe serwery są znane z usterek synchronizacyjnych, które są trudne do odtwo-
rzenia podczas testów, ale ujawniają się w bardzo złym momencie w środowiskach produk-
cyjnych. Wysokie prawdopodobieństwo występowania takich usterek jest następstwem
współdzielenia przestrzeni adresowej, co znacznie zwiększa stopień interakcji między
wątkami.
W pewnych okolicznościach rywalizacja o blokady może wymknąć się spod kontroli. Jeśli
zbyt wiele wątków próbuje jednocześnie pozyskać ten sam muteks, może to doprowadzić
do nadmiernego przełączania kontekstów: procesor przez większość czasu zamiast użytecz-
nej pracy wykonuje program szeregujący.
W systemach 32-bitowych przestrzeń adresowa procesu jest ograniczona do 4 GB. Ponie-
waż wszystkie wątki współdzielą tę samą przestrzeń adresową, teoretycznie cały serwer
ma do dyspozycji 4 GB pamięci RAM, nawet jeśli w komputerze zainstalowano znacznie
więcej fizycznej pamięci. W praktyce przestrzeń adresowa robi się bardzo zatłoczona przy
znacznie mniejszym limicie, gdzieś około 1,5 GB w Linuksie x86.
Zatłoczona 32-bitowa przestrzeń adresowa stwarza jeszcze jeden problem: każdy wątek
potrzebuje trochę miejsca na stos. Kiedy stos zostaje przydzielony, to nawet jeśli wątek ko-
rzysta z niego w minimalnym stopniu, konieczne jest zarezerwowanie części przestrzeni
adresowej serwera. Każdy nowy wątek ogranicza miejsce, które można przeznaczyć na
stertę. Jeśli więc nawet w komputerze jest dużo fizycznej pamięci, może się okazać, że nie da
się jednocześnie zaalokować dużych buforów, uruchomić wiele współbieżnych wątków
oraz zapewnić każdemu z nich dużo miejsca na stos.
Zalety rozwidlonych procesów
Wady wątków odpowiadają zaletom korzystania z oddzielnych procesów:
Pomyłki programistyczne nie są tak katastrofalne. Choć niekontrolowany proces może
zakłócić działanie całego serwera, jest to znacznie mniej prawdopodobne.
Trudniej popełnić pomyłkę. Przez większość czasu programista może myśleć tylko o jed-
nym wątku wykonania, nie martwiąc się o potencjalnych intruzów.
Pojawia się znacznie mniej fantomowych usterek. Kiedy wystąpi jakaś usterka, zwykle
można łatwo ją odtworzyć. Każdy rozwidlony proces ma własną przestrzeń adresową, więc
stopień ich wzajemnej interakcji jest znacznie mniejszy.
W systemach 32-bitowych ryzyko wyczerpania przestrzeni adresowej jest dużo mniejsze.
116 | Rozdział 6. Wątkowa obsługa żądań
Zgłoś jeśli naruszono regulamin