Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
Skalowanie 
PostgreSQL 
Filip Rembiałkowski 
DBConf.pl 2014, Szczyrk
Skalowanie 
PostgreSQL - Agenda 
Skalowanie pionowe 
● CPU 
● RAM 
● I/O 
Skalowanie poziome 
● replikacja 
● agregacja 
●...
Podstawy 
- czym jest PostgreSQL 
- metody konfiguracji 
- metody diagnostyki
Czym jest PostgreSQL 
system zarządzania relacyjnymi bazami danych 
„The world's most advanced open source database” 
Siln...
Wersje PostgreSQL 
X.Y – wersja główna (wprowadza zmiany, 
"major") 
Przy zmianie głównej wersji wewnętrzny format danych ...
Nowości 
http://www.postgresql.org/about/featurematrix 
Wersja 9.0 – wydana 2010 
wbudowana replikacja binarna (Hot Standb...
Nowości 
Wersja 9.2 – wydana 2012 
Ulepszenia odczytu (index-only scans), lepsze plany zapytań dla 
„prepared statements”,...
Dokumentacja / źródła informacji 
● Strona główna projektu: 
http://www.postgresql.org 
● Pełna dokumentacja: 
http://www....
Konfiguracja PostgreSQL 
● Komenda SET: zmiana tylko dla bieżącej sesji 
SET add_missing_from=off; 
● Komenda ALTER: zmian...
Medody diagnostyki 
- Narzędzia systemu operacyjnego (top, ps, 
iostat, netstat, ...) 
- logi serwera 
- widok pg_stat_act...
Poznaj Swe Workloady 
postgres=# select * from pg_stat_database where 
datname='prod'; 
-[ RECORD 1 ]-+--------------- 
da...
Skalowanie 
PostgreSQL - CPU 
Skalowanie pionowe 
● CPU, czyli procesujmyż! 
● RAM 
● I/O 
Skalowanie poziome 
● replikacj...
Skalowanie 
PostgreSQL - CPU 
● Architektura procesów, a wykorzystanie CPU 
● Operacje wrażliwe na CPU 
● Szybsze rdzenie ...
Procesy serwera 
każda sesja to osobny proces. 
$ ps xf 
PID TTY STAT TIME COMMAND 
1378 ? S 0:00 /usr/lib/postgresql/9.3/...
CPU - parametry 
max_connections - dostosowanie do zasobów 
SSL – koszty połączenia 
join_collapse_limit, from_collapse_li...
CPU – operacje wrażliwe: COPY 
(a także INSERT) 
● COPY do tej samej tabeli - do wersji 9.2 bardzo 
wrażliwe na wal_level....
CPU – operacje wrażliwe: inne 
1. Dla wersji 9.1 i starszych: równoległa praca na 
wielu rdzeniach - np. SELECT z tej same...
Skalowanie PostgreSQL 
CPU: HOW TO FAIL 
● Zbyt małe lub zbyt duże max_connections (np. 
max_connections = 10 na 12-core'o...
Ograniczenia w skalowaniu 
Szybsze rdzenie czy więcej rdzeni? 
Bez dużego znaczenia, dzięki efektywnemu 
schedulerowi na p...
CPU - Linki 
● Heikki Linnakangas, prezentacja „Multi-CPU 
performance in PostgreSQL 9.2” 
http://wiki.postgresql.org/imag...
Skalowanie 
PostgreSQL - RAM 
Skalowanie pionowe 
● CPU, czyli procesujmyż! 
● RAM, czyli o czym słonie (nie) zapominają. ...
Buforowanie R/W 
w PostgreSQL 
PostgreSQL 
Write-Ahead Log 
h/t Bruce Momjian
Zużycie pamięci roboczej 
Pojedyncza sesja 
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
1196 postgres 20 0 4531...
Pamięć robocza - ustawienia 
● shared_buffers – współdzielona pamięć stron 
10% - 50% pamięci RAM (ale nie więcej niż 8-16...
Pamięć robocza – zdrowy footprint 
h/t Where 2 Get It
Skalowanie 
PostgreSQL – I/O 
Skalowanie pionowe 
● CPU, czyli procesujmyż! 
● RAM, czyli o czym słonie (nie) zapominają. ...
Skalowanie 
PostgreSQL – I/O 
● WAL & fsync 
● RAID & Tablespaces 
● Indeksy & partycje 
● HDD & SSD
„iostat” 
avg-cpu: %user %nice %system %iowait %steal %idle 
40.55 1.75 2.85 3.28 0.00 51.56 
Device: rrqm/s wrqm/s r/s w/...
profil I/O
IOPS 
h/t Jignesh Shah
WAL 
Przy każdym COMMIT, kolejne bloki logu transakcji 
są zapisywane na dysk i wywoływana jest na nich 
funkcja fsync/fda...
fsync 
h/t Bruce Momjian
fsync 
h/t Bruce Momjian
fsync 
h/t Bruce Momjian
I/O – ustawienia WAL & fsync 
fsync wymusza synchronizację na nośnik (ACID!) 
„off” tylko tam, gdzie można sobie pozwolić ...
I/O – RAID & tablespaces 
●More Spindles is Good 
● RAID 10 lub zarządzanie ręczne wieloma 
dyskami (tablespace, dowiązani...
Tablespace 
Command: CREATE TABLESPACE 
Description: define a new tablespace 
Syntax: 
CREATE TABLESPACE tablespacename [ ...
partycjonowanie 
Tabela główna 
CREATE TABLE sales ( 
product text, year integer, date date, value numeric 
); 
Partycje 
...
Indeksy. Są. Miłe.
Indeksy 
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name 
ON table [ USING method ] 
( { column | ( expression ) } [ opclass...
Indeksy częściowe 
CREATE INDEX idx_active_articles_act 
ON articles (id) WHERE active=true; 
CREATE INDEX idx_active_arti...
HDD & SSD 
- Dyski SSD to „rewolucja” w tradycyjnym 
przetwarzaniu danych 
- Uwaga na starsze modele SSD 
- Konieczność do...
HDD & SSD 
H/t: Michael March
„tuning”: linki / narzędzia 
http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server 
http://wiki.postgresql.org/wik...
Skalowanie 
PostgreSQL - replikacja 
Skalowanie pionowe 
● CPU, czyli procesujmyż! 
● I/O, czyli o trudnej sztuce wchodzen...
Replikacja – definicja i cele 
Replikacja to synchronizacja danych na więcej niż 
jeden serwer. 
Cele: 
● Wysoka dostępnoś...
Replikacja – narzędzia 
Replikacja możliwa jest w wielu warstwach 
● Oparte na urządzeniach blokowych 
np. DRBD 
● Oparte ...
Archiwizacja ciągła plików WAL 
i mechanizm PITR 
PITR = point in time recovery 
● zaczynamy od kopii bazy („online backup...
Replikacja wbudowana (9.0+) 
Hot Standby - tryb „standby” z możliwością zapytań R/O 
http://wiki.postgresql.org/wiki/Hot_S...
Serwer zapasowy WAL-based 
DATA 
MASTER 
WAL 
Aktywny segment WAL 
(HOT) STANDBY 
Backup startowy 
(jednorazowo) 
Streamin...
Replikacja WAL – postgresql.conf 
# format logów WAL umożliwiający pełne odtworzenie transakcji 
wal_level = hot_standby 
...
Replikacja WAL – recovery.conf 
# polecenie OS do de-archiwizacji segmentów WAL 
restore_command = 'cp /mnt/nas1/pg/wal/%f...
Replikacja „trigger-based” 
Tabele replikowane 
triggery replikator 
Tabela log zmian 
MASTER 
SLAVE 
Tabele replikowane 
...
Replikacja „trigger-based” 
Narzędzia: Slony-I, londiste, inne 
Co jest replikowane: 
● TYLKO zmiany w danych (na poziomie...
Skalowanie PostgreSQL 
- agregacja połączeń 
Skalowanie pionowe 
● CPU, czyli procesujmyż! 
● I/O, czyli o trudnej sztuce ...
Agregacja połączeń 
(connection pooling) 
● Cele 
– Ograniczenie ilości połączeń 
– Redukcja zużycia RAM 
– Szybsze nawiąz...
connection pooling
pgbouncer 
(c) Skype, na licencji BSD 
http://pgfoundry.org/projects/pgbouncer 
Agregator połączeń w architekturze 
„Store...
pgbouncer.ini 
- Tryb pracy: sesja / transakcja / polecenie 
- konfiguracja połączeń do serwerów / baz 
Minimalny konfig: ...
Skalowanie 
PostgreSQL - rozkładanie ruchu 
Skalowanie pionowe 
● CPU, czyli procesujmyż! 
● I/O, czyli o trudnej sztuce w...
„load balancing” 
Definicja: Dynamiczne rozłożenie obciążenia 
poprzez kierowanie ruchu na wiele serwerów 
Założenia dodat...
pgpool-II 
http://www.pgpool.net/ 
Funkcje: 
● Pule połączeń 
● Replikacja (zapytań, nie danych!) 
● Równoważenie ruchu 
●...
pgpool: równoważenie ruchu
Pgpool: tworzenie klastrów
Skalowanie 
PostgreSQL - sharding 
Skalowanie pionowe 
● CPU, czyli procesujmyż! 
● I/O, czyli o trudnej sztuce wchodzenia...
Sharding 
● Definicja: tak jak partycjonowanie, tylko na 
wielu serwerach. 
„sharding” w najprostszej formie to podział 
t...
PL/Proxy 
http://pgfoundry.org/projects/plproxy/ 
„Application level proxy” 
zaimplementowany na poziomie wywołań 
języka ...
PL/Proxy 
← LB + backend replication 
LB + DB partitions ↓
PL/Proxy - konfiguracja 
-- (Pg <= 8.3) Stworzyć funkcje konfiguracyjne 
get_cluster_partitions(clustername text) 
get_clu...
PL/Proxy - przykład 
-- na bazach składowych (= partycjach) 
CREATE FUNCTION insert_user(i_username text, i_email 
text) 
...
Sharding - linki 
Plproxy Step-by-step→ 
http://www.depesz.com/2011/12/02/the-secret-ingredient-in-the-we 
bscale-sauce/ 
...
Podziękowania 
Dla Was, drodzy słuchacze! 
Oraz: 
- żona Marylka za cierpliwość 
- Dariusz Grzesista / dBConf 
- Compendiu...
Kontakt z autorem: 
filip.rembialkowski@gmail.com
Nächste SlideShare
Wird geladen in …5
×

Skalowanie PostgreSQL @ DBConf.PL 2014

1.901 Aufrufe

Veröffentlicht am

Prezentacja pokazująca ogólne kierunki skalowania silnika bazy danych PostgreSQL

Veröffentlicht in: Software
  • Als Erste(r) kommentieren

Skalowanie PostgreSQL @ DBConf.PL 2014

  1. 1. Skalowanie PostgreSQL Filip Rembiałkowski DBConf.pl 2014, Szczyrk
  2. 2. Skalowanie PostgreSQL - Agenda Skalowanie pionowe ● CPU ● RAM ● I/O Skalowanie poziome ● replikacja ● agregacja ● rozkładanie ruchu ● sharding
  3. 3. Podstawy - czym jest PostgreSQL - metody konfiguracji - metody diagnostyki
  4. 4. Czym jest PostgreSQL system zarządzania relacyjnymi bazami danych „The world's most advanced open source database” Silnik SQL maks. zgodny ze standardem ISO Pełna transakcyjność, ACID Programowalny i rozszerzalny Niezawodność i poprawność danych Open Source + licencja „używaj jak tylko chcesz”
  5. 5. Wersje PostgreSQL X.Y – wersja główna (wprowadza zmiany, "major") Przy zmianie głównej wersji wewnętrzny format danych może się zmieniać, co komplikuje proces aktualizacji. Tradycyjną metodą jest użycie pg_dump oraz przeładowanie bazy. Nowe wersje główne zwykle wprowadzają pewne widoczne dla użytkownika różnice, które mogą wymagać zmiany sposobu programowania aplikacji. {X.Y}.{Z} – wersja mała (tylko naprawia błędy, "minor") Małe ("minor") wydania nigdy nie zmieniają wewnętrznego formatu danych i są zawsze kompatybilne z wcześniejszymi i późniejszymi wydaniami tej samej wersji głównej. Żeby zaktualizować serwer do innej małej wersji, wystarczy podmienić pliki wykonywalne serwera, gdy jest zatrzymany, i uruchomić go ponownie. Katalog danych pozostaje bez zmian - upgrade do małej wersji jest bardzo prosty.
  6. 6. Nowości http://www.postgresql.org/about/featurematrix Wersja 9.0 – wydana 2010 wbudowana replikacja binarna (Hot Standby+Streaming Replication), ulepszenia w PL/xxx (DO, nazwane argumenty), GRANT/REVOKE all, triggery warunkowe i na kolumnach, wsparcie dla Win64, EXCLUDE constraints, ulepszenia funkcji analitycznych, lepsze wsparcie LDAP i RADIUS Wersja 9.1 – wydana 2011 replikacja synchroniczna (Synchronous Replication), „sepgsql” (integracja z SE Linux), ulepszenie obsługi rozszerzeń ‑ (EXTENSION), COLLATE na kolumnach, prawdziwy tryb SERIALIZABLE, algorytm KNN-Gist (najbliższy sąsiad), aktualizacja języka PL/Python, obsługa modyfikacji danych w klauzuli WITH
  7. 7. Nowości Wersja 9.2 – wydana 2012 Ulepszenia odczytu (index-only scans), lepsze plany zapytań dla „prepared statements”, kaskadowa replikacja, row-level views security (security_barrier), typy zakresowe (range data types), pg_receivexlog, wsparcie dla JSON Wersja 9.3 – wydana 2013 Widoki zmaterializowane, auto-update na widokach, więcej funkcji JSON, Foreign-Data Wrappers, sumy kontrolne, mniej blokujące FK, lepsze indeksy, poprawki wydajnościowe Wersja 9.4 – wydana 2014 wal_level = logical, format jsonb, ALTER SYSTEM, mniej blokujące ALTER TABLE, czas planowania w EXPLAIN ANALYZE, lepsze pg_basebackup, poprawki wydajnościowe
  8. 8. Dokumentacja / źródła informacji ● Strona główna projektu: http://www.postgresql.org ● Pełna dokumentacja: http://www.postgresql.org/docs/current/ http://www.postgresql.org/docs/manuals/ wyszukiwarka, indeks rzeczowy, SQL reference + pomoc wbudowana w psql ● Listy mailingowe: http://archives.postgresql.org pgsql-sql, pgsql-general, pgsql-performance ● Wiki http://wiki.postgresql.org ● Rozszerzenia: http://pgfoundry.org/ ● Fora i usenet (np. pl.comp.bazy-danych) ● Google Is Your Friend
  9. 9. Konfiguracja PostgreSQL ● Komenda SET: zmiana tylko dla bieżącej sesji SET add_missing_from=off; ● Komenda ALTER: zmiana na stałe dla użytkownika ALTER USER fred SET add_missing_from=off; ● Komenda ALTER: zmiana na stałe dla bazy danych ALTER DATABASE mydb SET add_missing_from=off; ● Edycja pliku: zmiana na stałe dla danej instancji plik postgresql.conf – lub komenda ALTER SYSTEM Odczyt: komenda SHOW , widok pg_settings
  10. 10. Medody diagnostyki - Narzędzia systemu operacyjnego (top, ps, iostat, netstat, ...) - logi serwera - widok pg_stat_activity - monitoring ciągły (cacti, munin, zabbix itp..) - pgbench - EXPLAIN (ANALYZE, BUFFERS)
  11. 11. Poznaj Swe Workloady postgres=# select * from pg_stat_database where datname='prod'; -[ RECORD 1 ]-+--------------- datid | 16385 datname | prod numbackends | 24 xact_commit | 40514353778 xact_rollback | 25485300 blks_read | 27614252499 blks_hit | 2277209676929 tup_returned | 47020592916188 tup_fetched | 1484013188102 tup_inserted | 31088271924 tup_updated | 227632003 tup_deleted | 1827540389 PgBadger / PgFouine / sed
  12. 12. Skalowanie PostgreSQL - CPU Skalowanie pionowe ● CPU, czyli procesujmyż! ● RAM ● I/O Skalowanie poziome ● replikacja ● agregacja ● rozkładanie ruchu ● sharding
  13. 13. Skalowanie PostgreSQL - CPU ● Architektura procesów, a wykorzystanie CPU ● Operacje wrażliwe na CPU ● Szybsze rdzenie czy więcej rdzeni? ● Ograniczenia w skalowaniu
  14. 14. Procesy serwera każda sesja to osobny proces. $ ps xf PID TTY STAT TIME COMMAND 1378 ? S 0:00 /usr/lib/postgresql/9.3/bin/postgres -D /var/lib/pos... 1380 ? Ss 0:00 _ postgres: logger process 1383 ? Ss 0:00 _ postgres: checkpointer process 1384 ? Ss 0:00 _ postgres: writer process 1385 ? Ss 0:00 _ postgres: wal writer process 1386 ? Ss 0:00 _ postgres: autovacuum launcher process 1387 ? Ss 0:00 _ postgres: archiver process last was 0000000200... 1388 ? Ss 0:01 _ postgres: stats collector process 18169 ? Ss 0:12 _ postgres: db1 app1 [local] SELECT 18170 ? Ss 0:12 _ postgres: db1 app1 [local] COMMIT 18276 ? Ds 0:03 _ postgres: db1 app2 127.0.0.1(42090) SELECT 18277 ? Ss 0:03 _ postgres: db1 app2 127.0.0.1(42091) UPDATE waiting komunikacja przez SHM i semafory
  15. 15. CPU - parametry max_connections - dostosowanie do zasobów SSL – koszty połączenia join_collapse_limit, from_collapse_limit, geqo cpu_tuple_cost, cpu_operator_cost log_lock_waits
  16. 16. CPU – operacje wrażliwe: COPY (a także INSERT) ● COPY do tej samej tabeli - do wersji 9.2 bardzo wrażliwe na wal_level. ● Zabójcze: triggery użytkownika, zwłaszcza z efektami zewnętrznymi ● Nieco mniej zabójcze: CHECK, klucze obce
  17. 17. CPU – operacje wrażliwe: inne 1. Dla wersji 9.1 i starszych: równoległa praca na wielu rdzeniach - np. SELECT z tej samej tabeli. Hasło: „lock contention” 2. Funkcje użytkownika
  18. 18. Skalowanie PostgreSQL CPU: HOW TO FAIL ● Zbyt małe lub zbyt duże max_connections (np. max_connections = 10 na 12-core'owym serwerze, albo max_connections=100 na 1- core'owym) ● Wszystkie sesje wiszące na COPY IN lub na funkcjach uzytkownika (UDF) ● UDF: B. dużo arytmetyki, złożone regexpy, programowanie wszystkiego w bazie ● Wersja 9.1 i 2k TPS na jednej tabeli
  19. 19. Ograniczenia w skalowaniu Szybsze rdzenie czy więcej rdzeni? Bez dużego znaczenia, dzięki efektywnemu schedulerowi na poziomie O/S Ograniczenia IPC & Blokady W nowszych wersjach lepiej ... ale. → Minimalizujcie ilość sesji! → Unikajcie scenariuszy z „HOW TO FAIL”
  20. 20. CPU - Linki ● Heikki Linnakangas, prezentacja „Multi-CPU performance in PostgreSQL 9.2” http://wiki.postgresql.org/images/e/e8/FOSDEM 2012-Multi-CPU-performance-in-9.2.pdf ● Robert Haas, „Scalability, in Graphical Form, Analyzed” http://rhaas.blogspot.com/2011/09/scalability-in -graphical-form-analyzed.html ● Oficjalne „PostgreSQL performance tips” http://www.postgresql.org/docs/current/static/pe rformance-tips.html
  21. 21. Skalowanie PostgreSQL - RAM Skalowanie pionowe ● CPU, czyli procesujmyż! ● RAM, czyli o czym słonie (nie) zapominają. ● I/O, czyli o trudnej sztuce wchodzenia i wychodzenia. Skalowanie poziome ● replikacja, czyli trąby w górę ● agregacja, czyli nie wszyscy na raz ● rozkładanie ruchu, czyli po co nam nadzorca ● sharding, czyli słoń to czy zebra
  22. 22. Buforowanie R/W w PostgreSQL PostgreSQL Write-Ahead Log h/t Bruce Momjian
  23. 23. Zużycie pamięci roboczej Pojedyncza sesja PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1196 postgres 20 0 4531m 3.3g 3.1g S 0 2.6 5:15.14 postgres PID UID URES SHR VIRT data exe 1196 postgres 198596 3255988 4639784 201368 4756 Globalnie total used free shared buffers cached Mem: 129180 127753 1427 0 53 124091 -/+ buffers/cache: 3609 125571 Swap: 16385 125 16260
  24. 24. Pamięć robocza - ustawienia ● shared_buffers – współdzielona pamięć stron 10% - 50% pamięci RAM (ale nie więcej niż 8-16GB) ● work_mem - pamięć indywidualna sesji do sortowania 1 - 20 MB (stosownie do max_connections) ● maintenance_work_mem dla VACUUM, CREATE INDEX, 100-1000 MB ● effective_cache_size – oszacowanie rozmiaru pamięci podręcznej stron na poziomie systemu operacyjnego, 5% - 40% pamięci RAM ● log_temp_files – ujawnia niedostatki work_mem http://www.postgresql.org/docs/current/static/runtime-config-resource.html
  25. 25. Pamięć robocza – zdrowy footprint h/t Where 2 Get It
  26. 26. Skalowanie PostgreSQL – I/O Skalowanie pionowe ● CPU, czyli procesujmyż! ● RAM, czyli o czym słonie (nie) zapominają. ● I/O, czyli o sztuce wchodzenia i wychodzenia. Skalowanie poziome ● replikacja, czyli trąby w górę ● agregacja, czyli nie wszyscy na raz ● rozkładanie ruchu, czyli po co nam nadzorca ● sharding, czyli słoń to czy zebra
  27. 27. Skalowanie PostgreSQL – I/O ● WAL & fsync ● RAID & Tablespaces ● Indeksy & partycje ● HDD & SSD
  28. 28. „iostat” avg-cpu: %user %nice %system %iowait %steal %idle 40.55 1.75 2.85 3.28 0.00 51.56 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util dm-0 0.00 0.50 220.90 111.10 3460.80 1140.15 27.72 3.05 9.18 2.26 75.08
  29. 29. profil I/O
  30. 30. IOPS h/t Jignesh Shah
  31. 31. WAL Przy każdym COMMIT, kolejne bloki logu transakcji są zapisywane na dysk i wywoływana jest na nich funkcja fsync/fdatasync (synchronizacja danych na nośnik). COMMIT jest relatywnie tani i szybki. Przy każdym CHECKPOINT, ten log jest scalany do bazy, a zużyte segmenty WAL są usuwane. CHECKPOINT wykonuje się automatycznie, gdy log się zapełni (albo upłynie określony czas). CHECKPOINT jest drogi i powolny. http://www.postgresql.org/docs/current/static/wal-reliability.html
  32. 32. fsync h/t Bruce Momjian
  33. 33. fsync h/t Bruce Momjian
  34. 34. fsync h/t Bruce Momjian
  35. 35. I/O – ustawienia WAL & fsync fsync wymusza synchronizację na nośnik (ACID!) „off” tylko tam, gdzie można sobie pozwolić na utratę transakcji! (np. bazy testowe, redundantne) full_page_writes „off” tylko tam, gdzie nie ma ryzyka partial page writes! (sprawdzalne narzędziem) checkpoint_segments Większa ilość segmentów WAL to rzadsze checkpointy checkpoint_completion _target rozłożenie I/O wywołanego przez checkpoint w czasie, zalecane 0.9 log_checkpoints przydatna informacja diagnostyczna effective_io _concurrency Ilość niezależnych kanałów zapisu. 1,2,3,4, … - stosownie do układu macierzy RAID Więcej → http://www.postgresql.org/docs/current/static/wal-configuration.html
  36. 36. I/O – RAID & tablespaces ●More Spindles is Good ● RAID 10 lub zarządzanie ręczne wieloma dyskami (tablespace, dowiązania) ● logi transakcji (WAL) na innym dysku niż dane ● indeksy na innym dysku niż dane
  37. 37. Tablespace Command: CREATE TABLESPACE Description: define a new tablespace Syntax: CREATE TABLESPACE tablespacename [ OWNER username ] LOCATION 'directory' CREATE TABLESPACE data3 LOCATION '/mnt/data3'; ALTER TABLE foo SET TABLESPACE data3; ALTER USER foo SET default_tablespace TO data3; ALTER TABLESPACE data3 SET random_page_cost = 2;
  38. 38. partycjonowanie Tabela główna CREATE TABLE sales ( product text, year integer, date date, value numeric ); Partycje CREATE TABLE sales10 ( check(year=2010) ) INHERITS(sales); CREATE TABLE sales11 ( check(year=2011) ) INHERITS(sales); CREATE TABLE sales12 ( check(year=2012) ) INHERITS(sales); Trigger rozdzielający dane CREATE TRIGGER trg_insert_sales BEFORE INSERT OR UPDATE ON sales FOR EACH ROW EXECUTE PROCEDURE trg_sales_insert (); Zapytanie do tabeli głównej, które używa partycji SELECT sum(value) FROM sales WHERE year=2012; Pełne informacje → http://www.postgresql.org/docs/current/static/ddl-partitioning.html
  39. 39. Indeksy. Są. Miłe.
  40. 40. Indeksy CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] name ON table [ USING method ] ( { column | ( expression ) } [ opclass ] [, ...] ) [ WITH ( storage_parameter = value [, ... ] ) ] [ TABLESPACE tablespace ] [ WHERE predicate ] Uwaga na klasy operatorów. Ten sam typ indeksu może się różnie zachowywać w zależności od opclass Pytanie: jakie operacje mogą zyskać na indeksach? Pytanie: skąd mam wiedzieć, która tabela/kolumna potrzebuje indeksu? Pytanie: a co z indeksami wielokolumnowymi?
  41. 41. Indeksy częściowe CREATE INDEX idx_active_articles_act ON articles (id) WHERE active=true; CREATE INDEX idx_active_articles_inact ON articles (id) WHERE active=false; (odpowiednik partycjonowania)
  42. 42. HDD & SSD - Dyski SSD to „rewolucja” w tradycyjnym przetwarzaniu danych - Uwaga na starsze modele SSD - Konieczność dostosowania parametrów, a co najmniej tego: random_page_cost
  43. 43. HDD & SSD H/t: Michael March
  44. 44. „tuning”: linki / narzędzia http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server http://wiki.postgresql.org/wiki/Performance_Optimization http://wiki.postgresql.org/wiki/Community_Disk_Tuning_Guide http://momjian.us/main/writings/pgsql/hw_performance/ https://blogs.oracle.com/jkshah/resource/pgeast_ssd.pdf http://pgfoundry.org/projects/pgtune FAQ: Database servers, unlike many other applications, are usually I/O and memory constrained, so it is wise to focus on the I/O subsystem first, then memory capacity, and lastly consider CPU issues. A good quality, high performance SSD is often the cheapest way to improve database performance.
  45. 45. Skalowanie PostgreSQL - replikacja Skalowanie pionowe ● CPU, czyli procesujmyż! ● I/O, czyli o trudnej sztuce wchodzenia i wychodzenia. ● RAM, czyli o czym słonie (nie) zapominają. Skalowanie poziome ● replikacja, czyli trąby w górę ● agregacja, czyli nie wszyscy na raz ● rozkładanie ruchu, czyli po co nam nadzorca ● sharding, czyli słoń to czy zebra
  46. 46. Replikacja – definicja i cele Replikacja to synchronizacja danych na więcej niż jeden serwer. Cele: ● Wysoka dostępność ● Wyrównywanie obciążenia ● Konserwacja / migracje danych
  47. 47. Replikacja – narzędzia Replikacja możliwa jest w wielu warstwach ● Oparte na urządzeniach blokowych np. DRBD ● Oparte na binarnym logu WAL Replikacja wbudowana od wersji 9.0 ● Oparte na triggerach Slony-I, inne ● Wbudowane w aplikację
  48. 48. Archiwizacja ciągła plików WAL i mechanizm PITR PITR = point in time recovery ● zaczynamy od kopii bazy („online backup”) z przeszłości ● “replay” aktywności bazy do pewnego punktu w czasie wymagania ● backup podstawowy ( kopia katalogu $PGDATA ) ● “strumień zmian” w postaci archiwum logów WAL ograniczenia ● dużo miejsca na dysku ● dużo czasu na „replay” danych
  49. 49. Replikacja wbudowana (9.0+) Hot Standby - tryb „standby” z możliwością zapytań R/O http://wiki.postgresql.org/wiki/Hot_Standby Streaming Replication – kopiowanie rekordów WAL „w locie” - osobne połączenie TCP walsender - walreceiver http://wiki.postgresql.org/wiki/Streaming_Replication
  50. 50. Serwer zapasowy WAL-based DATA MASTER WAL Aktywny segment WAL (HOT) STANDBY Backup startowy (jednorazowo) Streaming archive_command DATA WAL archive Watchdog odpytywanie (HA-Linux, inne) sygnał przejęcia (failover) restore_ command Więcej → http://www.postgresql.org/docs/current/interactive/continuous-archiving.html
  51. 51. Replikacja WAL – postgresql.conf # format logów WAL umożliwiający pełne odtworzenie transakcji wal_level = hot_standby # włączenie archiwizacji logów WAL archive_mode = on # polecenie OS do archiwizacji segmentów WAL archive_command = 'cp %p /mnt/nas1/pg/wal/%f' # „strumieniowanie” WAL (uwaga na pg_hba.conf) max_wal_senders = 10 # zapytania R/O po stronie odbiorcy hot_standby = on
  52. 52. Replikacja WAL – recovery.conf # polecenie OS do de-archiwizacji segmentów WAL restore_command = 'cp /mnt/nas1/pg/wal/%f %p' # przywracanie ciągłe (tryb „standby”) standby_mode = 'on' # streaming z serwera „master” primary_conninfo = 'host=master port=5900' # PITR - przywróć do punktu w czasie # recovery_target_time = '2014-07-01 14:07:01'
  53. 53. Replikacja „trigger-based” Tabele replikowane triggery replikator Tabela log zmian MASTER SLAVE Tabele replikowane - kopia
  54. 54. Replikacja „trigger-based” Narzędzia: Slony-I, londiste, inne Co jest replikowane: ● TYLKO zmiany w danych (na poziomie wiersza tabeli) NIE są replikowane: ● zmiany struktury - czyli polecenia DDL (CREATE, ALTER) ● obiekty globalne (użytkownicy, bazy, “large objects”, …) Główna zaleta w stosunku do replikacji WAL: Możliwość replikacji jednej lub kilku tabel a nie całej instancji.
  55. 55. Skalowanie PostgreSQL - agregacja połączeń Skalowanie pionowe ● CPU, czyli procesujmyż! ● I/O, czyli o trudnej sztuce wchodzenia i wychodzenia. ● RAM, czyli o czym słonie (nie) zapominają. Skalowanie poziome ● replikacja, czyli trąby w górę ● agregacja, czyli nie wszyscy na raz ● rozkładanie ruchu, czyli po co nam nadzorca ● sharding, czyli słoń to czy zebra
  56. 56. Agregacja połączeń (connection pooling) ● Cele – Ograniczenie ilości połączeń – Redukcja zużycia RAM – Szybsze nawiązywanie połączeń ● Narzędzia – PgBouncer – PgPool ● Wyniki – 1500 połączeń Apache - pgbouncer – 250 połączeń pgbouncer - backend
  57. 57. connection pooling
  58. 58. pgbouncer (c) Skype, na licencji BSD http://pgfoundry.org/projects/pgbouncer Agregator połączeń w architekturze „Store-Nothing” Poniżej 4 KiB / połączenie
  59. 59. pgbouncer.ini - Tryb pracy: sesja / transakcja / polecenie - konfiguracja połączeń do serwerów / baz Minimalny konfig: [databases] #db1 = host=192.168.1.101 port=5432 dbname=mydb #db2 = host=10.0.0.1 port=5432 dbname=mydb * = port=5432 [pgbouncer] pool_mode = transaction # JDBC: protocolVersion=2 (bez PS) listen_port = 5433 listen_addr = 192.168.1.1 auth_type = md5 # trust - w zaufanych sieciach auth_file = /var/lib/postgresql/8.4/main/global/pg_auth logfile = /var/log/postgresql/pgbouncer.log pidfile = /var/log/postgresql/pgbouncer.pid admin_users = postgres # kto może administrować pgbouncerem
  60. 60. Skalowanie PostgreSQL - rozkładanie ruchu Skalowanie pionowe ● CPU, czyli procesujmyż! ● I/O, czyli o trudnej sztuce wchodzenia i wychodzenia. ● RAM, czyli o czym słonie (nie) zapominają. Skalowanie poziome ● replikacja, czyli trąby w górę ● agregacja, czyli nie wszyscy na raz ● rozkładanie ruchu, czyli po co nam nadzorca ● sharding, czyli słoń to czy zebra
  61. 61. „load balancing” Definicja: Dynamiczne rozłożenie obciążenia poprzez kierowanie ruchu na wiele serwerów Założenia dodatkowe ● wymaga replikacji danych ● wymaga middleware i/lub obsługi w aplikacji Narzędzia: PgPool
  62. 62. pgpool-II http://www.pgpool.net/ Funkcje: ● Pule połączeń ● Replikacja (zapytań, nie danych!) ● Równoważenie ruchu ● Zrównoleglanie zapytań ● Dowolnie wiele serwerów składających się na klaster ● Narzędzia administracyjne – pcp ● Współpraca z Slony-I lub innym systemem replikacji http://www.slideshare.net/adorepump/pgpoolii-demonstration
  63. 63. pgpool: równoważenie ruchu
  64. 64. Pgpool: tworzenie klastrów
  65. 65. Skalowanie PostgreSQL - sharding Skalowanie pionowe ● CPU, czyli procesujmyż! ● I/O, czyli o trudnej sztuce wchodzenia i wychodzenia. ● RAM, czyli o czym słonie (nie) zapominają. Skalowanie poziome ● replikacja, czyli trąby w górę ● agregacja, czyli nie wszyscy na raz ● rozkładanie ruchu, czyli po co nam nadzorca ● sharding, czyli słoń to czy zebra
  66. 66. Sharding ● Definicja: tak jak partycjonowanie, tylko na wielu serwerach. „sharding” w najprostszej formie to podział tabeli na wiele instancji, gdzie każda posiada podzbiór wierszy. ● Cele: Skalowanie odczytów i zapisów ● Narzędzia: PL/Proxy
  67. 67. PL/Proxy http://pgfoundry.org/projects/plproxy/ „Application level proxy” zaimplementowany na poziomie wywołań języka proceduralnego
  68. 68. PL/Proxy ← LB + backend replication LB + DB partitions ↓
  69. 69. PL/Proxy - konfiguracja -- (Pg <= 8.3) Stworzyć funkcje konfiguracyjne get_cluster_partitions(clustername text) get_cluster_version(clustername text) get_cluster_config(in clustername text, out key text, out val text) -- (Pg >= 8.4) zapis definicji wg SQL/MED CREATE FOREIGN DATA WRAPPER plproxy; CREATE SERVER mycluster FOREIGN DATA WRAPPER plproxy OPTIONS ( connection_lifetime '1800', p0 'dbname=part00 host=127.0.0.1', p1 'dbname=part01 host=127.0.0.1' ); # 2^n CREATE USER MAPPING FOR PUBLIC SERVER mycluster; GRANT USAGE ON SERVER mycluster TO PUBLIC;
  70. 70. PL/Proxy - przykład -- na bazach składowych (= partycjach) CREATE FUNCTION insert_user(i_username text, i_email text) RETURNS integer AS $$ INSERT INTO users (username, email) VALUES ($1,$2); SELECT 1; $$ LANGUAGE SQL; -- na serwerze partycjonującym CREATE FUNCTION insert_user(i_username text, i_email text) RETURNS integer AS $$ CLUSTER 'mycluster'; RUN ON hashtext(i_username); $$ LANGUAGE plproxy; -- Uwaga: każde wywołanie to połączenie do partycji
  71. 71. Sharding - linki Plproxy Step-by-step→ http://www.depesz.com/2011/12/02/the-secret-ingredient-in-the-we bscale-sauce/ Problem identyfikatorów→ http://instagram-engineering.tumblr.com/post/10853187575/shardin g-ids-at-instagram
  72. 72. Podziękowania Dla Was, drodzy słuchacze! Oraz: - żona Marylka za cierpliwość - Dariusz Grzesista / dBConf - Compendium Centrum Edukacyjne - Stefan Batory & eo Networks - Hubert „depesz” Lubaczewski - Konrad Mazurkiewicz
  73. 73. Kontakt z autorem: filip.rembialkowski@gmail.com

×