Adam Buraczewski

advertisement
Słonie pracują
w stadzie
Adam Buraczewski
[email protected]
GNU/Politechnika, 13.01.2007 r.
Plan wykładu
●
●
●
●
●
Wprowadzenie – po co łączyć serwery
bazodanowe?
Transakcje rozproszone: 2PC, dblink, JTA
Równoważenie obciążenia serwerów:
pgpool, Sequoia, PostgreSQL Relay
Replikacja asynchroniczna: Slony-I
Replikacja synchroniczna: PGCluster,
PostgreSQL-R
Najważniejsze pojęcia
●
Transakcja – pojedyncza logiczna
operacja na bazie danych, mogąca się
składać z wielu poleceń. Cechy:
–
Atomicity – jest zrealizowana w całości albo
wcale
–
Consistency – po jej zakończeniu baza jest
spójna
–
Isolation – inni użytkownicy bazy danych nie
widzą pojedynczych operacji składających się
na transakcję
–
Durability – zatwierdzona transakcja nie może
być cofnięta, jej efekt jest utrwalony w bazie
Najważniejsze pojęcia
●
Transakcja rozproszona:
–
Obejmuje kilka serwerów bazodanowych
połączonych za pomocą sieci
–
Zapewnia cechy ACID ale w obrębie tych
kilku serwerów na raz
–
Realizacja techniczna: za pomocą protokołu
wielofazowego zatwierdzania (Two-Phase
Commit)
Najważniejsze pojęcia
●
Replikacja – automatyczne przekazywanie
zmian w bazie danych do innych
serwerów w sieci
–
Master-slave – zmiany dozwolone są tylko na
głównym serwerze w sieci i są propagowane
do serwerów podrzędnych
–
Multi-master – zmiany mogą być nanoszone
na dowolnym z serwerów i są propagowane
do pozostałych
Najważniejsze pojęcia
●
●
●
Równoważenie obciążenia (Load
balancing):
–
Przekierowanie poleceń/zapytań
bazodanowych do różnych serwerów w sieci,
w celu ich optymalnego wykorzystania
–
Stosowane zwykle razem z replikacją
Failover – reakcja systemu na awarię,
przekierowanie poleceń/zapytań do
innego serwera w sieci
Failback – przywrócenie poprzedniej
konfiguracji po zlikwidowaniu awarii
Najważniejsze pojęcia
●
●
Partycjonowanie danych – podzielenie
jednej logicznej bazy danych pomiędzy
kilka serwerów:
–
Poziome – każdy serwer ma te same tabele,
ale różne zakresy wierszy (np. w zależności
od daty wpisanej do jednej z kolumn)
–
Pionowe – każdy serwer ma inny zestaw tabel
–
Mieszane
Umożliwia lepsze rozłożenie obciążenia,
ułatwia określenie polityki dostępu (np.
dane osobowe na osobnym serwerze) itp.
Zalety łączenia serwerów
●
Połączenie wielu serwerów za pomocą
sieci pozwala na:
–
Zwiększenie wydajności poprzez rozłożenie
obciążenia
–
Zwiększenie dostępności (availability)
systemu
–
Partycjonowanie danych ze względów np.
prawnych lub innych
Wady łączenia serwerów
●
Połączenie wielu serwerów za pomocą
sieci jest kłopotliwe ze względu na:
–
Konieczność wymiany informacji o pracy
serwerów (blokady, transakcje, spójność
danych, awarie, wybór nowych głównych
serwerów)
–
Techniczną realizację rozłożenia obciążenia
pomiędzy serwerami, autoryzacji
użytkowników itp.
–
Techniczną realizację replikacji danych
pomiędzy serwerami
–
Konieczność monitoringu, oprogramowania
Moduł dblink
●
Dostęp do baz PostgreSQL z poziomu SQL
●
Dostępny od wersji 7.3, wykorzystuje SRF
●
Sposób użycia:
–
SELECT dblink_connect('host=192.168.0.1
dbname=baza');
–
SELECT * FROM dblink('SELECT c1, c2 FROM
tabela') AS (c1 INTEGER, c2 INTEGER);
–
SELECT dblink_exec('UPDATE tabela SET c2 =
4 WHERE c1 = 2');
–
SELECT dblink_close();
Moduł dblink
●
Możliwość stosowania w perspektywach i
procedurach składowanych, triggerach
itp. Przykład:
–
●
●
CREATE VIEW zdalna_tabela AS SELECT *
FROM dblink('SELECT c1, c2 FROM tabela') AS
(c1 INTEGER, c2 INTEGER);
SELECT * FROM zdalna_tabela;
API do pracy z kilkoma połączeniami
naraz
API do dynamicznego budowania poleceń
SQL, odczytu schematu zdalnej bazy
Moduł dblink
●
●
Problem z transakcjami:
–
BEGIN;
–
SELECT dblink_exec('BEGIN');
–
SELECT dblink_exec('INSERT ...');
–
SELECT dblink_exec('COMMIT');
–
ROLLBACK;
Rozwiązanie: transakcje rozproszone,
realizowane za pomocą 2PC
Alternatywy dla dblink
●
Inne rozwiązania, podobne do dblink:
–
dblinkora, dblink-TDS – stosowanie
identyczne jak dblink
–
Dblink-DBI – wykorzystuje język pl/Perl i
sterowniki DBI przeznaczone dla Perla
●
Skrypt analizujący strukturę wskazanej bazy
danych i tworzący lokalnie komplet perspektyw do
korzystania z tabel zdalnej bazy jak z tabel
lokalnych
Transakcje rozproszone 2PC
●
●
●
Mechanizm Two-Phase Commit – protokół
dwufazowego zatwierdzania transakcji
Standardowe rozwiązanie dla wielu
serwerów baz danych
Przystosowane do działania z
managerami transakcji (np. standard JTA
dla Javy – odpowiednie wsparcie w
sterowniku JDBC).
Transakcje rozproszone 2PC
●
●
Polecenia (transakcję rozpoczyna BEGIN):
–
PREPARE TRANSACTION 'nazwa' –
przygotowuje transakcję; pomyślne
zakończenie gwarantuje w 100% możliwość
późniejszego wykonania COMMIT PREPARED,
nawet po np. awarii zasilania
–
COMMIT PREPARED 'nazwa' – ostatecznie
zatwierdza transakcję
–
ROLLBACK PREPARED 'nazwa' – wycofuje
PREPARE TRANSACTION pozostawia
założone blokady na tabele i wiersze
Transakcje rozproszone 2PC
●
●
Możliwość sprawdzenia aktualnie
przygotowanych transakcji za pomocą:
SELECT * FROM pg_prepared_xacts;
Zatwierdzić/wycofać przygotowaną
transakcję może użytkownik, który ją
przygotował lub administrator
Dblink i 2PC
●
Stosowanie mechanizmu 2PC z modułem
dblink do wiarygodnego zatwierdzania
transakcji:
–
BEGIN;
–
SELECT dblink_exec('BEGIN');
–
SELECT dblink_exec('INSERT ...');
–
SELECT dblink_exec('PREPARE TRANSACTION
''t123'';');
–
COMMIT;
–
SELECT dblink_exec('COMMIT PREPARED
''t123'';');
JTA
●
●
●
Java Transaction API- standardowy
mechanizm języka Java do obsługi
transakcji rozproszonych
Obsługuje wiele różnych źródeł danych o
zachowaniu transakcyjnym (np.
Hibernate, obiekty EJB itp.)
Wymaga Java Transaction Service –
dostępne w J2EE, Jboss, oraz jako
niezależne implementacje (np. JOTM z
rozwiązań Open Source)
JTA
●
●
Wykorzystanie:
–
UserTransaction ut = (UserTransaction)
context.lookup(“java:comp/UserTransaction”)
;
–
ut.begin();
–
// dostęp do wielu źródeł danych
–
ut.commit();
Zatwierdzenie transakcji odbywa się z
użyciem mechanizmów 2PC, o ile dane
źródło danych obsługuje transakcje
rozproszone (PostgreSQL jak najbardziej
Sequoia
●
●
●
●
●
Dawniej: Clustered-JDBC
Produkt Open Source, niezależny od
PostgreSQL, ale dobrze z nim
współpracuje
Działa z językiem Java, ale jest API dla C+
+
Organizuje cały klaster złożony z wielu
baz danych i udostępnia go za pomocą
pojedynczego połączenia JDBC
Realizuje replikację i partycjonowanie
Sequoia
●
●
●
Serwery bazodanowe (w tym PostgreSQL)
służą jedynie składowaniu danych, nie
można z nimi współpracować
bezpośrednio
Sequoia wykorzystuje własny mechanizm
wieloetapowego zatwierdzania transakcji,
nie korzysta z 2PC (nie współpracuje też z
JTA), sama realizuje synchronizację baz
po awarii
Wygodna administracja: graficzne
“wizardy”, narzędzia do administracji i
pgpool
●
●
●
●
Dojrzały system do rozkładania
obciążenia pomiędzy kilka serwerów
Utrzymuje pulę otwartych połączeń do
serwera PostgreSQL, skracając czas
potrzebny na np. autoryzację
Wykorzystuje natywny protokół
komunikacji klient-serwer systemu
PostgreSQL, współpracuje więc z każdym
programem, biblioteką czy sterownikiem
Doskonale sprawdza się w serwisach
WWW
pgpool
●
Pgpool I:
–
Obsługa tylko 2 serwerów PostgreSQL
–
Polecenia SELECT kierowane tylko do jednego
z serwerów (można określić jak ma być
rozłożone obciążenie)
–
Polecenia INSERT/UPDATE/DELETE kierowane
do obydwóch serwerów, dzięki czemu bazy
danych pozostają spójne
–
Failover – w przypadku awarii wszystkie
połączenia przekierowane do drugiego
serwera
–
Nie potrafi korzystać z mechanizmu 2PC
Pgpool
●
Pgpool II (wydany w 2006 r.):
–
Dowolnie wiele serwerów składających się na
klaster
–
Tryb “parallel” - zapytania rozkładane są na
podzapytania, wykonywane niezależnie na
różnych serwerach, a wynik łączony
(przezroczyste dla klienta)
–
Nowy, wygodny panel administracyjny –
pgpooladmin (napisany w PHP)
–
Lepsza współpraca z systemem Slony-I
Pgpool
●
●
●
●
Bardziej elastyczny niż Sequoia, lepiej
dostosowany do PostgreSQLa
Wymaga, aby przed uruchomieniem bazy
danych były zsynchronizowane np. za
pomocą systemu Slony
Możliwość podawania “podpowiedzi” w
kodzie SQL, dotyczących realizacji
zapytania w klastrze
Warto stosować nawet dla pojedynczego
serwera obsługującego np. serwis WWW
(dużo krótkich sesji bazodanowych).
PostgreSQL Relay
●
●
●
●
Integruje wiele rozproszonych serwerów i
baz danych na jednym serwerze
Wygodne rozwiązanie gdy przeniesiono
pojedynczą bazę danych lub cały serwer
pod inną lokalizację, a nie chcemy
zmieniać konfiguracji programów
Możliwość użycia tcpwrappers do kontroli
dostępu
Prosty plik konfiguracyjny
SQL Relay
●
●
●
●
Realizuje connection pooling dla wielu
różnych serwerów bazodanowych i
języków programowania
Ma własny protokół komunikacji klientserwer
Nie potrafi synchronizować baz danych –
należy korzystać z replikacji osobnym
mechanizmem lub korzystać z baz w
trybie “tylko do odczytu”
Wygodne narzędzia administracyjne
(graficzny do konfiguracji, tekstowy
SQL Relay
●
●
Elementy składowe:
–
sqlr-connection – łączy się do bazy danych
–
sqlr-listener – udostępnia pulę połączeń
aplikacjom
–
sqlr-scaler – uruchamia dodatkowe
połączenia w razie potrzeby
Udostępnia połączenia standardowymi
mechanizmami (DBI, JDBC itp.) oraz za
pomocą własnych bibliotek (własna
wersja biblioteki libpq, pozwala na
korzystanie z SQL Relay bez rekompilacji
Slony-I
●
●
●
●
Najbardziej dojrzałe rozwiązanie Open
Source do replikacji baz danych dla
PostgreSQL
Opracowany w 2004 r. przez Jana Wiecka
dla firmy Afilias
Replikacja typu master-slave (jeden
serwer główny i dowolnie wiele
podrzędnych, zorganizowanych w
drzewo)
Działa dla PostgreSQL 7.3, nie wymaga
żadnych zmian w kodzie serwera
Slony-I
●
●
●
●
Wykorzystuje mechanizmy
LISTEN/NOTIFY, własne procedury
PL/pgSQL oraz triggery
Nie replikuje zmian w strukturze bazy
danych (tylko w samych danych w
tabelach)
Replikuje pojedyncze bazy danych lub ich
fragmenty (operuje na zestawach tabel –
set).
Wymaga, aby węzły klastra były
nawzajem widoczne; przeznaczony dla
Slony-I
●
Działanie:
–
Modyfikacja bazy głównej powoduje
umieszczenie informacji o zmianie w
prywatnych tabelach Slony'ego (razem dla
całej transakcji)
–
Bazy podrzędne mają zablokowaną
możliwość zmian w replikowanych tabelach
–
Proces “slon” odczytuje te zmiany i przenosi
do serwerów podrzędnych
–
Pomyślne naniesienie zmian we wszystkich
bazach podrzędnych powoduje wykasowanie
logów z serwera
Slony-I
●
●
●
●
Konfiguracja za pomocą programu
“slonik”, wyposażonego w specjalny język
skryptowy
Przed uruchomieniem replikacji należy
przenieść samą strukturę tabel BEZ
danych (pg_dump -s | pg_restore)
Etap I – określenie węzła nadrzędnego i
podrzędnych, następnie uruchomienie
procesów “slon”
Etap II – określenie zestawów tabel do
replikacji
Slony-I
●
Etap I:
cluster name = moj_klaster;
node 1 admin conninfo = 'dbname=nadrzedny
host=192.168.0.1';
node 2 admin conninfo = 'dbname=podrzedny
host=192.168.0.2';
init cluster (id = 1);
store node (id = 2);
store path (server = 1, client = 2,
conninfo = ''dbname=nadrzedny host=192.168.0.1');
store path (server = 2, client = 1,
conninfo = ''dbname=podrzedny host=192.168.0.2');
store listen (origin = 1, provider = 1, receiver = 2);
store listen (origin = 2, provider = 2, receiver = 1);
Slony-I
●
Etap II:
cluster name = moj_klaster;
node 1 admin conninfo = 'dbname=nadrzedny
host=192.168.0.1';
node 2 admin conninfo = 'dbname=podrzedny
host=192.168.0.2';
create set (id = 1, origin = 1);
set add sequence (set id = 1, origin = 1, id = 1,
fully qualified name = 'public.sekwencja');
set add table (set id = 1, origin = 1, id = 1,
fully qualified name = 'public.tabela1');
set add table (set id = 1, origin = 1, id = 2,
fully qualified name = 'public.tabela2');
set add table (set id = 1, origin = 1, id = 3,
fully qualified name = 'public.tabela3');
Slony-I
●
●
●
●
Failover z wyborem węzła najbardziej
aktualnego (wykrywanie awarii musi być
oprogramowane przez administratora)
Możliwość przekazywania danych z
określonym opóźnieniem
Możliwość przekazywania danych poprzez
pliki
Bogactwo języka skryptowego “slonik”
PGCluster, PostgreSQL-R
●
●
●
●
●
Tworzone, ale już całkiem stabilne
rozwiązania replikacji multi-master
Ingerują w kod źródłowy PostgreSQL
Replikacja całej instalacji PostgreSQLa na
raz (bez możliwości wybrania baz danych)
Wszystkie węzły klastra są równorzędne
Odczyty baz danych są realizowane
lokalnie, zapis i blokady muszą być
synchronizowane między węzłami klastra
(wymaga szybkiej sieci)
PostgreSQL-R
●
●
●
●
Dawniej PGReplicator
Dostępna wersja binarna – obraz ISO
płyty z Linuksem i skonfigurowanym
PostgreSQL-R
Do komunikacji między węzłami
wykorzystany jest mechanizm Spread
Wymaga stosowania zewnętrznego
programu do rozkładania obciążenia (np.
pgpool)
PGCluster
●
●
●
Dostępny w postaci łaty na PostgreSQL
(nawet na wersję 8.2.1!)
Ma własny program do rozkładania
obciążenia, ora dodatkowy demon do
monitoringu klastra
Do wstępnej synchronizacji klastra
wykorzystuje program rsync i ssh, na
każdym węźle klastra cała instalacja musi
być w tym samym katalogu
Adresy
–
www.pgfoundry.org - serwis pgFoundry, czyli
katalog i repozytorium wiekszosci
oprogramowania zwiazanego z PostgreSQL,
np. pgpool, PGcluster, PostgreSQL Relay,
SkyTools itp.,
–
slony.info - strona domowa projektu Slony I,
–
www.postgres-r.org - strona domowa projektu
Postgres-R,
–
jotm.objectweb.org - strona domowa JOTM,
–
sequoia.continuent.org – strona projektu
Sequoia,
–
sqlrelay.sourceforge.net - stronaSQL Relay.
Download