www.postgrespro.ru
PostgreSQL в кластере.
Скандалы, интриги,
расследования.
Федор Сигаев
Российские разработчики
Олег Бартунов, Федор Сигаев, Александр Коротков
PostgreSQL CORE
● Locale support
● PostgreSQL extendability:
● GiST(KNN), GIN, SP-GiST
● Full Text Search (FTS)
● NoSQL (hstore, jsonb)
● Indexed regexp search
● VODKA access method (WIP)
Расширения:
● Intarray
● Pg_trgm
● Ltree
● Hstore
● plantuner
● JsQuery
● Докладчики PGCon, PGConf: 20+ докладов
● Менторы GSoC
● Коммитеры PostgreSQL (1+1 in progress)
● Организаторы конференций
● 50+ лет экспертизы PostgreSQL: разработка, аудит, консалтинг
● Novartis, Raining Data, Heroku, Engine Yard, WarGaming, Rambler, Avito, 1c
Кластер — это непросто
● Write or Read or Both scalability
● HA
● Географическое разнесение
● Функциональное разнесение
● Филиалы или выездные сотрудники
● Требования к консистентности (согласованности)
Postgres Cluster Matrix
WS RS Parallel
Read
M-M Synchr Recov. HA Consistency
ACID BASE
Postgres-R + + + + + +
XC/XL/X2 +? + + + + +
PGCluster + +
PgPool + + +
Pl/proxy + + +
pg_shard/CituDB + + + +
Greenplum + + +
Bucardo + + + + +
BDR + + + + +
SR + + + + +!
FDW + + + +
PostgreSQL XC/XL/X2
● 2009-2012
Postgres-XC
Development Group
● 2012-2014
TransLattice, Inc
● 2014-2016
Postgres-XL
Development Group
● 2015-2016
2ndQuadrant Ltd
PostgreSQL XC/XL/X2
● GTM — менеджер транзакций (SPOF!)
● ProxyGTM
● N+1 commit logs (sync?)
● Не добавить, не убавить, самому заботиться
● CREATE TABLE ...
DISTRIBUTE BY { REPLICATION |
ROUNDROBIN { [HASH | MODULO ]
( column_name ) } }
● Распределенные запросы
pg_shard/FDW
● Shared nothing
● No ACID, No BASE — всё сам, сам
● Распределенные запросы
BDR 2ndQuadrant Ltd
● Взаимная репликация
● BASE only
● Конфликты (last win)
● Нет распределенных
запросов
Node 1 Node 2
Что объединяет?
● Забота о распределенности (-BDR)
● HA — не трогаем
● Бакапы отсутствуют
Идея
Оторвем менеджер транзакций
DB3DB1 DB2
xTM
Транзакции в PgSQL
Сессия 1 Сессия 2
# begin;
# select ctid, xmin, xmax, *
from foo;
ctid | xmin | xmax | id | val
-------+------+------+----+-----
(0,1) | 693 | 0 | 1 | 111
# update foo set val=222;
# select ctid, xmin, xmax, *
from foo;
ctid | xmin | xmax | id | val
-------+------+------+----+-----
(0,2) | 694 | 0 | 1 | 222
# select txid_current();
txid_current
--------------
694
# begin;
# select ctid, xmin, xmax, *
from foo;
ctid | xmin | xmax | id | val
-------+------+------+----+-----
(0,1) | 693 | 0 | 1 | 111
# select ctid, xmin, xmax, *
from foo;
ctid | xmin | xmax | id | val
-------+------+------+----+-----
(0,1) | 693 | 694 | 1 | 111
Транзакции в PgSQL
Tuple виден, если (Read Commited)
Xmin закоммичен
Xmax == 0 или не закоммичен
Tuple виден, если (Repeatable Read)
Xmin закоммичен
Xmin < Current XID и он закончен до старта нашей транзакции
Xmax == 0 или не закоммичен или Xmax > Current XID или не закончен до
нашего старта
Транзакции в PgSQL
Сессия 1 Сессия 2
# begin;
# select ctid, xmin, xmax, * from foo;
ctid | xmin | xmax | id | val
-------+------+------+----+-----
(0,1) | 697 | 0 | 1 | 111
(0,2) | 697 | 0 | 2 | 222
# update foo set val = 333 where id = 1;
# select ctid, xmin, xmax, * from foo;
ctid | xmin | xmax | id | val
-------+------+------+----+-----
(0,2) | 697 | 699 | 2 | 222
(0,3) | 698 | 0 | 1 | 333
# update foo set val = 555 where id = 2;
-- ждем 2-ую сессию
# begin;
# select ctid, xmin, xmax, * from foo;
ctid | xmin | xmax | id | val
-------+------+------+----+-----
(0,1) | 697 | 0 | 1 | 111
(0,2) | 697 | 0 | 2 | 222
# update foo set val = 444 where id = 2;
# select ctid, xmin, xmax, * from foo;
ctid | xmin | xmax | id | val
-------+------+------+----+-----
(0,1) | 697 | 698 | 1 | 111
(0,4) | 699 | 0 | 2 | 444
# update foo set val = 666 where id = 1;
-- DEADLOCK!!
Count(*) быстрым не будет!
Transaction Manager before patch
Transaction Manager after patch
Distributed Transaction Manager
Pluggable transaction API
UDT
CSP
FDW
AM
TM?
Core
eXtensible Transaction API
● XidStatus (*GetTransactionStatus)(TransactionId xid,
XLogRecPtr *lsn);
● void (*SetTransactionStatus)(TransactionId xid, int
nsubxids, TransactionId *subxids, XidStatus status,
XLogRecPtr lsn);
● Snapshot (*GetSnapshot)(Snapshot snapshot);
● TransactionId (*GetNewTransactionId)(bool isSubXact);
● TransactionId (*GetOldestXmin)(Relation rel, bool
ignoreVacuum);
● bool (*IsInProgress)(TransactionId xid);
● TransactionId (*GetGlobalTransactionId)(void);
● bool (*IsInSnapshot)(TransactionId xid, Snapshot
snapshot);
Что получаем
● Несколько нод имеют одно и тоже
представление о транзакциях/снапшотах
● Уже можно самостоятельно организовывать
распределенную транзакцию с атомарным
(sic!) коммитом
● Если подключить БД с такой же семантикой —
гетерогенная распределенная транзакция!
● Можно сочетать c pg_shard/FDW!
Что не получаем
● Есть SPOF
● Оно же узкое место при некоторых нагрузках
● Его ж майнтайнить надо!
DTM architecture
PostgreSQL
Instance 1
PostgreSQL
Instance 2
PostgreSQL
Instance 3
Arbiter
master
Arbiter
slave 1
Arbiter
slave 2
synchronous
replication
asynchronous
replication
Multiplexing
Unix domain
sockets
Arbiter
Unix domain
sockets
TCP sockets
sockhub
backends
backends
Node 1
Node 2
DTM from client's point of view
Primary server Secondary server
create extension pg_dtm; create extension pg_dtm;
select dtm_begin_transaction();
begin transaction;
update...;
commit;
select dtm_join_transaction(xid);
begin transaction;
update...;
commit;
Идея!
● Есть интерфейс — ок
● Есть семантика — ок
● А почему нужка какая-то искусственная
монотонная последовательность?!
Идея!
Ну время жеж!
Время как id
● Немножко идет по-разному, прыгает
● Сообщения из будущего... спать надо больше!
● Управляем дельтой... что бы это не значило
tsDTM architecture
PostgreSQL
Instance 1
PostgreSQL
Instance 2
PostgreSQL
Instance 3
Lightweight two-phase commit
XactLogCommitRecord
(flush changes in WAL)
ProcArrayEndTransaction
(mark transaction as
completed)
ResourceOwnerRelease
(release transaction locks)
TransactionTreeSetCommitTsData
(set transaction status
in CLOG)
Agreement
Transaction status
Different DTM implementations
Local
transactions
2PC Arbiter Examples
Snapshot
sharing
XL, DTM
Timestamp Spanner,
Cockroach,
tsDTM
Incremental SAP HANA
Postgres Cluster Matrix
WS RS Parallel
Read
M-M Synchr Recov. HA Consistency
ACID BASE
Postgres-R + + + + + +
XC/XL/X2 +? + + + + +
PGCluster + +
PgPool + + +
Pl/proxy + + +
pg_shard/CituDB + + + + + +
Greenplum + + +
Bucardo + + + + +
BDR + + + + +
SR + +? + + +
FDW + + + + +
Postgres Professional
● xTM
● DTM
● tsDTM
● *TM — будущее
Postgres Professional
● Обнаружение сдохшего узла
● Его восстановление (в т.ч. полной заливкой)
● Добавление нового узла (реконфигурирование)
● Знание о кластере синхронизируется raft-
протоколом
● MM-HA-NM внутренний резиз прямо сейчас!
33
Postgres Professional
Российский вендор PostgreSQL в России
●
Поддержка, разработка, консалтинг, обучение
●
Тему технологической независимости СУБД пропагандируем с 2011 г.
●
Члены международного сообщества
●
Участники и спонсоры международных конференций (Канада, Австрия,
Бразилия)
●
PgConf.Russia 2015 и 2016 - крупнейшие в мире конференция по
PostgreSQL
В направлениях, где мы ведем разработку, PostgreSQL
является лидером* среди РСУБД
* геоинформационные системы, слабоструктурированные данные,
полнотекстовый поиск, расширяемость
Все российские ключевые международно признанные
разработчики PostgreSQL работают в нашей компании
В нашей команде 4 кандидата наук: 3 – по PostgreSQL и технологиям БД.
Сотрудничаем с МГУ и СПбГУ.
Postgres Professional NY 2016
Postgres Professional
Выбор настоящих профессионалов!
www.postgrespro.ru
Спасибо за внимание!
Контакты:
teodor@postgrespro.ru
+79166718198

SECON'2016. Сигаев Федор, Pg в кластере. Скандалы, интриги, расследования

  • 1.
    www.postgrespro.ru PostgreSQL в кластере. Скандалы,интриги, расследования. Федор Сигаев
  • 2.
    Российские разработчики Олег Бартунов,Федор Сигаев, Александр Коротков PostgreSQL CORE ● Locale support ● PostgreSQL extendability: ● GiST(KNN), GIN, SP-GiST ● Full Text Search (FTS) ● NoSQL (hstore, jsonb) ● Indexed regexp search ● VODKA access method (WIP) Расширения: ● Intarray ● Pg_trgm ● Ltree ● Hstore ● plantuner ● JsQuery ● Докладчики PGCon, PGConf: 20+ докладов ● Менторы GSoC ● Коммитеры PostgreSQL (1+1 in progress) ● Организаторы конференций ● 50+ лет экспертизы PostgreSQL: разработка, аудит, консалтинг ● Novartis, Raining Data, Heroku, Engine Yard, WarGaming, Rambler, Avito, 1c
  • 3.
    Кластер — этонепросто ● Write or Read or Both scalability ● HA ● Географическое разнесение ● Функциональное разнесение ● Филиалы или выездные сотрудники ● Требования к консистентности (согласованности)
  • 4.
    Postgres Cluster Matrix WSRS Parallel Read M-M Synchr Recov. HA Consistency ACID BASE Postgres-R + + + + + + XC/XL/X2 +? + + + + + PGCluster + + PgPool + + + Pl/proxy + + + pg_shard/CituDB + + + + Greenplum + + + Bucardo + + + + + BDR + + + + + SR + + + + +! FDW + + + +
  • 5.
    PostgreSQL XC/XL/X2 ● 2009-2012 Postgres-XC DevelopmentGroup ● 2012-2014 TransLattice, Inc ● 2014-2016 Postgres-XL Development Group ● 2015-2016 2ndQuadrant Ltd
  • 6.
    PostgreSQL XC/XL/X2 ● GTM— менеджер транзакций (SPOF!) ● ProxyGTM ● N+1 commit logs (sync?) ● Не добавить, не убавить, самому заботиться ● CREATE TABLE ... DISTRIBUTE BY { REPLICATION | ROUNDROBIN { [HASH | MODULO ] ( column_name ) } } ● Распределенные запросы
  • 7.
    pg_shard/FDW ● Shared nothing ●No ACID, No BASE — всё сам, сам ● Распределенные запросы
  • 8.
    BDR 2ndQuadrant Ltd ●Взаимная репликация ● BASE only ● Конфликты (last win) ● Нет распределенных запросов Node 1 Node 2
  • 9.
    Что объединяет? ● Заботао распределенности (-BDR) ● HA — не трогаем ● Бакапы отсутствуют
  • 10.
  • 11.
    Транзакции в PgSQL Сессия1 Сессия 2 # begin; # select ctid, xmin, xmax, * from foo; ctid | xmin | xmax | id | val -------+------+------+----+----- (0,1) | 693 | 0 | 1 | 111 # update foo set val=222; # select ctid, xmin, xmax, * from foo; ctid | xmin | xmax | id | val -------+------+------+----+----- (0,2) | 694 | 0 | 1 | 222 # select txid_current(); txid_current -------------- 694 # begin; # select ctid, xmin, xmax, * from foo; ctid | xmin | xmax | id | val -------+------+------+----+----- (0,1) | 693 | 0 | 1 | 111 # select ctid, xmin, xmax, * from foo; ctid | xmin | xmax | id | val -------+------+------+----+----- (0,1) | 693 | 694 | 1 | 111
  • 12.
    Транзакции в PgSQL Tupleвиден, если (Read Commited) Xmin закоммичен Xmax == 0 или не закоммичен Tuple виден, если (Repeatable Read) Xmin закоммичен Xmin < Current XID и он закончен до старта нашей транзакции Xmax == 0 или не закоммичен или Xmax > Current XID или не закончен до нашего старта
  • 13.
    Транзакции в PgSQL Сессия1 Сессия 2 # begin; # select ctid, xmin, xmax, * from foo; ctid | xmin | xmax | id | val -------+------+------+----+----- (0,1) | 697 | 0 | 1 | 111 (0,2) | 697 | 0 | 2 | 222 # update foo set val = 333 where id = 1; # select ctid, xmin, xmax, * from foo; ctid | xmin | xmax | id | val -------+------+------+----+----- (0,2) | 697 | 699 | 2 | 222 (0,3) | 698 | 0 | 1 | 333 # update foo set val = 555 where id = 2; -- ждем 2-ую сессию # begin; # select ctid, xmin, xmax, * from foo; ctid | xmin | xmax | id | val -------+------+------+----+----- (0,1) | 697 | 0 | 1 | 111 (0,2) | 697 | 0 | 2 | 222 # update foo set val = 444 where id = 2; # select ctid, xmin, xmax, * from foo; ctid | xmin | xmax | id | val -------+------+------+----+----- (0,1) | 697 | 698 | 1 | 111 (0,4) | 699 | 0 | 2 | 444 # update foo set val = 666 where id = 1; -- DEADLOCK!! Count(*) быстрым не будет!
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
    eXtensible Transaction API ●XidStatus (*GetTransactionStatus)(TransactionId xid, XLogRecPtr *lsn); ● void (*SetTransactionStatus)(TransactionId xid, int nsubxids, TransactionId *subxids, XidStatus status, XLogRecPtr lsn); ● Snapshot (*GetSnapshot)(Snapshot snapshot); ● TransactionId (*GetNewTransactionId)(bool isSubXact); ● TransactionId (*GetOldestXmin)(Relation rel, bool ignoreVacuum); ● bool (*IsInProgress)(TransactionId xid); ● TransactionId (*GetGlobalTransactionId)(void); ● bool (*IsInSnapshot)(TransactionId xid, Snapshot snapshot);
  • 19.
    Что получаем ● Нескольконод имеют одно и тоже представление о транзакциях/снапшотах ● Уже можно самостоятельно организовывать распределенную транзакцию с атомарным (sic!) коммитом ● Если подключить БД с такой же семантикой — гетерогенная распределенная транзакция! ● Можно сочетать c pg_shard/FDW!
  • 20.
    Что не получаем ●Есть SPOF ● Оно же узкое место при некоторых нагрузках ● Его ж майнтайнить надо!
  • 21.
    DTM architecture PostgreSQL Instance 1 PostgreSQL Instance2 PostgreSQL Instance 3 Arbiter master Arbiter slave 1 Arbiter slave 2 synchronous replication asynchronous replication
  • 22.
    Multiplexing Unix domain sockets Arbiter Unix domain sockets TCPsockets sockhub backends backends Node 1 Node 2
  • 23.
    DTM from client'spoint of view Primary server Secondary server create extension pg_dtm; create extension pg_dtm; select dtm_begin_transaction(); begin transaction; update...; commit; select dtm_join_transaction(xid); begin transaction; update...; commit;
  • 24.
    Идея! ● Есть интерфейс— ок ● Есть семантика — ок ● А почему нужка какая-то искусственная монотонная последовательность?!
  • 25.
  • 26.
    Время как id ●Немножко идет по-разному, прыгает ● Сообщения из будущего... спать надо больше! ● Управляем дельтой... что бы это не значило
  • 27.
  • 28.
    Lightweight two-phase commit XactLogCommitRecord (flushchanges in WAL) ProcArrayEndTransaction (mark transaction as completed) ResourceOwnerRelease (release transaction locks) TransactionTreeSetCommitTsData (set transaction status in CLOG) Agreement Transaction status
  • 29.
    Different DTM implementations Local transactions 2PCArbiter Examples Snapshot sharing XL, DTM Timestamp Spanner, Cockroach, tsDTM Incremental SAP HANA
  • 30.
    Postgres Cluster Matrix WSRS Parallel Read M-M Synchr Recov. HA Consistency ACID BASE Postgres-R + + + + + + XC/XL/X2 +? + + + + + PGCluster + + PgPool + + + Pl/proxy + + + pg_shard/CituDB + + + + + + Greenplum + + + Bucardo + + + + + BDR + + + + + SR + +? + + + FDW + + + + +
  • 31.
    Postgres Professional ● xTM ●DTM ● tsDTM ● *TM — будущее
  • 32.
    Postgres Professional ● Обнаружениесдохшего узла ● Его восстановление (в т.ч. полной заливкой) ● Добавление нового узла (реконфигурирование) ● Знание о кластере синхронизируется raft- протоколом ● MM-HA-NM внутренний резиз прямо сейчас!
  • 33.
    33 Postgres Professional Российский вендорPostgreSQL в России ● Поддержка, разработка, консалтинг, обучение ● Тему технологической независимости СУБД пропагандируем с 2011 г. ● Члены международного сообщества ● Участники и спонсоры международных конференций (Канада, Австрия, Бразилия) ● PgConf.Russia 2015 и 2016 - крупнейшие в мире конференция по PostgreSQL В направлениях, где мы ведем разработку, PostgreSQL является лидером* среди РСУБД * геоинформационные системы, слабоструктурированные данные, полнотекстовый поиск, расширяемость Все российские ключевые международно признанные разработчики PostgreSQL работают в нашей компании В нашей команде 4 кандидата наук: 3 – по PostgreSQL и технологиям БД. Сотрудничаем с МГУ и СПбГУ.
  • 34.
  • 35.
  • 36.