Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Сага о кластереСага о кластере
Олег Бартунов, Александр Коротков, Фёдор СигаевОлег Бартунов, Александр Коротков, Фёдор Сиг...
Российские разработчики
Олег Бартунов, Федор Сигаев, Александр Коротков
PostgreSQL CORE
● Locale support
● PostgreSQL exte...
Распределенные несчастия
2PC — не серебряная пуля
Распределенные несчастия: #1
Распределенные несчастия: #1
Решение:
Сделай сам или добавь арбитра
Распределенные несчастия: #2
Распределенные несчастия: #2
Вывод:
Целостный read не имеет решения в 2PC
Политические игры
Мировые тенденции ПО
Gartner's Magic Quadrant
DB-ENGINES.COM
Gartner.Тенденции рынка СУБД
* Gartner, State of Open Source RDBMS, 2015, Donald Feinberg and Merv Adrian, April 21, 2015
...
Этапы развития PostgreSQL
Стабилизация работыСтабилизация работы
Совместимость с SQL
стандартами
Совместимость с SQL
станд...
Community Todo: No Cluster !
НЕ ТОТ КЛАСТЕР !
https://wiki.postgresql.org/wiki/Todo
Кластер —
важнейшая
фича почти
всех форков !
Политические игры
Энтерпрайз хочет энтерпрайзных решений
• No Cluster in community roadmap !
Кластерные решения сбоку:
• X...
Cluster Summit 2015, Vienna
Cluster Summit 2015, Vienna
● Community Todo:
• добавить КЛАСТЕР
● Продолжать развивать кластерные решения
• Не мешать дру...
Этапы развития PostgreSQL
Совместимость с SQL
стандартами
Совместимость с SQL
стандартами
Возможности уровня
Enterprise / ...
Приготовление кластера
Postgres Cluster Matrix
WS RS
Parallel
Read
M-M Synchr Recov. HA
Consistency
ACID BASE
Postgres-R + + + + + +
XC/XL/X2 +? ...
Distributed transaction manager
Pluggable transaction API
UDT
CSP
FDW
AM
TM?
Core
eXtensible Transaction API
● XidStatus (*GetTransactionStatus)(TransactionId xid,
XLogRecPtr *lsn);
● void (*SetTransactio...
New commit callback events
● XACT_EVENT_START,
● XACT_EVENT_COMMIT,
● XACT_EVENT_PARALLEL_COMMIT,
● XACT_EVENT_ABORT,
● XA...
Transaction Manager before patch
transam/clog.c:
GetTransactionStatus
SetTransactionStatus
transam/varsup.c:
GetNewTransac...
Transaction Manager after patch
transam/clog.c:
GetTransactionStatus
SetTransactionStatus
transam/varsup.c:
GetNewTransact...
Distributed Transaction Manager
transam/clog.c:
GetTransactionStatus
SetTransactionStatus
transam/varsup.c:
GetNewTransact...
Different DTM implementations
Local
transactions
2PC Arbiter Examples
Snapshot
sharing
XL, DTM
Timestamp Spanner,
Cockroac...
DTM architecture
PostgreSQL
Instance 1
PostgreSQL
Instance 2
PostgreSQL
Instance 3
Arbiter
master
Arbiter
slave 1
Arbiter
...
DTM from client's point of view
Primary server Secondary server
create extension pg_dtm; create extension pg_dtm;
select d...
Arbiter protocol (begin)
dtmd
node a
node b
begin
xid, snaphsot, gxmin
join(xid)
snaphsot, gxmin
Arbiter protocol (end)
dtmd
node a
node b
commit(xid)
ok
commit(xid)
ok
DTM transaction control flow
Node 1
Node 2
Node 3
dtm_begin_
transaction
dtm_join_
transaction
dtm_join_
transaction
XID
b...
tsDTM architecture
PostgreSQL
Instance 1
PostgreSQL
Instance 2
PostgreSQL
Instance 3
tsDTM transaction control flowsnapshot
prepare
transaction
Node 1
Node 2
Node 3
prepare
transaction
prepare
transaction
co...
Lightweight two-phase commit
XactLogCommitRecord
(flush changes in WAL)
ProcArrayEndTransaction
(mark transaction as
compl...
Multiplexing
Unix domain
sockets
Arbiter
Unix domain
sockets
TCP sockets
sockhub
backends
backends
Node 1
Node 2
Example of interaction with DTM
xid := execQuery(con1, "select dtm_begin_transaction()")
exec(con2, "select dtm_join_trans...
Example of interaction with tsDTM
exec(con1, "begin transaction")
exec(con2, "begin transaction")
snapshot = execQuery(con...
Example of using FDW
exec(con, "select dtm_begin_transaction()")
exec(con, "begin transaction")
exec(con, "update t set v ...
Example of using pg_shard
exec(con, "begin transaction")
exec(con, "update t set v = v + $1 where u=$2",
amount, account1)...
Test configuration
Client 1 Client 2
Worker 2
Client 2Client 2Client 2
Worker 1 Worker 1 Worker 1
Arbiter
Performance measurement
1 2 3 4
0
10
20
30
40
50
60
70
80
90
100
pg_shard
fdw
w/o DTM
with DTM
Simple bank debit/credit be...
Multimaster performance
1 2 3 4
0
50
100
150
200
250
300
350
400
450
no writers
8 writers
Simple update/select queries
Thr...
Roadmap
● Add XTM patch to PostgreSQL 9.6
● Experiment with different DTM implementations
● Provide integration of DTM wit...
Postgres Cluster Matrix
WS RS
Parallel
Read
M-M Synchr Recov. HA
Consistency
ACID BASE
Postgres-R + + + + + +
XC/XL/X2 +? ...
Спасибо за внимание!
Upcoming SlideShare
Loading in …5
×

Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в постгресе / О.Бартунов, А.Коротков, Ф.Сигаев

2,064 views

Published on

Популярность постгреса в мире и России растет, с каждым новым релизом появляется все новая и новая функциональность, постгрес становится реальной угрозой монополии Оракл, уже подвинул Монго на поле свободных NoSQL СУБД, однако мировое сообщество ждет решения для горизонтального масштабирования. Создание постгресового кластера является крайне трудной задачей, так как постгрес является базой данных, ориентированной на целостность данных, а используемый алгоритм обеспечения конкурентности транзакций ставит серьезные челленджи перед разработчиками алгоритмов распределенных транзакций.

Оказывается, уже целых пять групп работает над этой задачей, и мы расскажем про их подходы, трудности, в том числе, и политические. Отдельно остановимся на российском опыте и нашем вкладе в решение этой задачи.

Published in: Engineering
  • Login to see the comments

  • Be the first to like this

Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в постгресе / О.Бартунов, А.Коротков, Ф.Сигаев

  1. 1. Сага о кластереСага о кластере Олег Бартунов, Александр Коротков, Фёдор СигаевОлег Бартунов, Александр Коротков, Фёдор Сигаев Postgres ProfessionalPostgres Professional Highload++ 2015, МоскваHighload++ 2015, Москва
  2. 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. 3. Распределенные несчастия 2PC — не серебряная пуля
  4. 4. Распределенные несчастия: #1
  5. 5. Распределенные несчастия: #1 Решение: Сделай сам или добавь арбитра
  6. 6. Распределенные несчастия: #2
  7. 7. Распределенные несчастия: #2 Вывод: Целостный read не имеет решения в 2PC
  8. 8. Политические игры
  9. 9. Мировые тенденции ПО
  10. 10. Gartner's Magic Quadrant DB-ENGINES.COM
  11. 11. Gartner.Тенденции рынка СУБД * Gartner, State of Open Source RDBMS, 2015, Donald Feinberg and Merv Adrian, April 21, 2015 будут использовать реляционные базы данных с открытым кодом в 2018 году* новых приложений существующих приложений 50%70% И
  12. 12. Этапы развития PostgreSQL Стабилизация работыСтабилизация работы Совместимость с SQL стандартами Совместимость с SQL стандартами Возможности уровня Enterprise / простота использования Возможности уровня Enterprise / простота использования 1996 1998 2001 2015 Базовая функциональность JDBC MVCC Optimizer Stats PL/pgSQL Стабилизация Исправление сбоев в работе Очистка кода Культура совершенства Стандарты SQL 92 Joins Prepared queries Foreign Keys Функциональность ядра Write Ahead Log Prepared Queries Info. Schema Auto Vacuum Возможности уровня Enterprise Потоковая репликация Производительность Вертикальное масштабирование PITR pg_upgrade NoSQL BDR Параллелизм Простота использования Портирование на Windows pg_basebackup Различные инструменты
  13. 13. Community Todo: No Cluster ! НЕ ТОТ КЛАСТЕР ! https://wiki.postgresql.org/wiki/Todo
  14. 14. Кластер — важнейшая фича почти всех форков !
  15. 15. Политические игры Энтерпрайз хочет энтерпрайзных решений • No Cluster in community roadmap ! Кластерные решения сбоку: • XC→X2, XL — Huawei, 2ndQuadrant, NTT (9.5+) • MPPDB (XC?) — Huawei (?) • pg_shard — CitusDB (9.5+) • FDW — EDB+NTT ( 9.5+) • Greenplum — Pivotal (8.2) • DTM — Postgres Professional Есть ресурсы, а решения нет :(
  16. 16. Cluster Summit 2015, Vienna
  17. 17. Cluster Summit 2015, Vienna ● Community Todo: • добавить КЛАСТЕР ● Продолжать развивать кластерные решения • Не мешать друг другу • Дружественность расширениям (кластерное решение как расширение ?) ● Решить с DTM для 9.6
  18. 18. Этапы развития PostgreSQL Совместимость с SQL стандартами Совместимость с SQL стандартами Возможности уровня Enterprise / простота использования Возможности уровня Enterprise / простота использования 1998 2001 31.10.2015 Стандарты ● SQL 92 Joins ● Prepared queries ● Foreign Keys Функциональность ядра ● Write Ahead Log ● Prepared Queries ● Info. Schema ● Auto Vacuum Возможности уровня Enterprise ● Потоковая репликация ● Производительность ● Вертикальное масштабирование ● PITR ● pg_upgrade ● NoSQL ● BDR ● Параллелизм Простота использования ● Портирование на Windows ● pg_basebackup ● Различные инструменты Цели ● Read-Write scalability ● High availability Задачи ● Управление распределенными транзакциями ● Планировщик и исполнитель распределенных запросов ● Обнаружение распределенных взаимных блокировок ● Онлайн перераспределение данных ● Поддержка глобальных ограничений ● Онлайн добавление и удаление узлов ● Средства администрирования Горизонтальное масштабирование (Шардинг) Горизонтальное масштабирование (Шардинг)
  19. 19. Приготовление кластера
  20. 20. 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 + + + +
  21. 21. Distributed transaction manager
  22. 22. Pluggable transaction API UDT CSP FDW AM TM? Core
  23. 23. 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);
  24. 24. New commit callback events ● XACT_EVENT_START, ● XACT_EVENT_COMMIT, ● XACT_EVENT_PARALLEL_COMMIT, ● XACT_EVENT_ABORT, ● XACT_EVENT_PARALLEL_ABORT, ● XACT_EVENT_PREPARE, ● XACT_EVENT_PRE_COMMIT, ● XACT_EVENT_PARALLEL_PRE_COMMIT, ● XACT_EVENT_PRE_PREPARE, ● XACT_EVENT_COMMIT_PREPARED, ● XACT_EVENT_ABORT_PREPARED
  25. 25. Transaction Manager before patch transam/clog.c: GetTransactionStatus SetTransactionStatus transam/varsup.c: GetNewTransactionId ipc/procarray.c: TransactionIdIsInProgress GetOldestXmin GetSnapshotData time/tqual.c: XidInMVCCSnapshot
  26. 26. Transaction Manager after patch transam/clog.c: GetTransactionStatus SetTransactionStatus transam/varsup.c: GetNewTransactionId ipc/procarray.c: TransactionIdIsInProgress GetOldestXmin GetSnapshotData time/tqual.c: XidInMVCCSnapshot Transaction Manager
  27. 27. Distributed Transaction Manager transam/clog.c: GetTransactionStatus SetTransactionStatus transam/varsup.c: GetNewTransactionId ipc/procarray.c: TransactionIdIsInProgress GetOldestXmin GetSnapshotData time/tqual.c: XidInMVCCSnapshot Transaction Manager pg_dtm.so
  28. 28. Different DTM implementations Local transactions 2PC Arbiter Examples Snapshot sharing XL, DTM Timestamp Spanner, Cockroach, tsDTM Incremental SAP HANA
  29. 29. DTM architecture PostgreSQL Instance 1 PostgreSQL Instance 2 PostgreSQL Instance 3 Arbiter master Arbiter slave 1 Arbiter slave 2 synchronous replication asynchronous replication
  30. 30. 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;
  31. 31. Arbiter protocol (begin) dtmd node a node b begin xid, snaphsot, gxmin join(xid) snaphsot, gxmin
  32. 32. Arbiter protocol (end) dtmd node a node b commit(xid) ok commit(xid) ok
  33. 33. DTM transaction control flow Node 1 Node 2 Node 3 dtm_begin_ transaction dtm_join_ transaction dtm_join_ transaction XID begin transaction begin transaction begin transaction commit transaction commit transaction commit transaction Arbiter Assign XID Vote
  34. 34. tsDTM architecture PostgreSQL Instance 1 PostgreSQL Instance 2 PostgreSQL Instance 3
  35. 35. tsDTM transaction control flowsnapshot prepare transaction Node 1 Node 2 Node 3 prepare transaction prepare transaction commit prepared commit prepared commit prepared max CSN
  36. 36. Lightweight two-phase commit XactLogCommitRecord (flush changes in WAL) ProcArrayEndTransaction (mark transaction as completed) ResourceOwnerRelease (release transaction locks) TransactionTreeSetCommitTsData (set transaction status in CLOG) Arbiter Transaction status
  37. 37. Multiplexing Unix domain sockets Arbiter Unix domain sockets TCP sockets sockhub backends backends Node 1 Node 2
  38. 38. Example of interaction with DTM xid := execQuery(con1, "select dtm_begin_transaction()") exec(con2, "select dtm_join_transaction($1)", xid) exec(con1, "begin transaction") exec(con2, "begin transaction") exec(con1, "update t set v = v + $1 where u=$2", amount, account1) exec(con2, "update t set v = v - $1 where u=$2", amount, account2) var wg sync.WaitGroup wg.Add(2) asyncExec(con1, “commit”, &wg) asyncExec(cnn2, “commit”, &wg) wg.Wait()
  39. 39. Example of interaction with tsDTM exec(con1, "begin transaction") exec(con2, "begin transaction") snapshot = execQuery(con1, "select dtm_extend($1)", gtid) snapshot = execQuery(con2, "select dtm_access($1, $2)", snapshot, gtid) exec(con1, "update t set v = v + $1 where u=$2", amount, account1) exec(con2, "update t set v = v - $1 where u=$2", amount, account2) exec(con1, "prepare transaction '" + gtid + "'") exec(con2, "prepare transaction '" + gtid + "'") exec(con1, "select dtm_begin_prepare($1)", gtid) exec(con2, "select dtm_begin_prepare($1)", gtid) csn = execQuery(con1, "select dtm_prepare($1, 0)", gtid) csn = execQuery(con2, "select dtm_prepare($1, $2)", gtid, csn) exec(con1, "select dtm_end_prepare($1, $2)", gtid, csn) exec(con2, "select dtm_end_prepare($1, $2)", gtid, csn) exec(con1, "commit prepared '" + gtid + "'") exec(con2, "commit prepared '" + gtid + "'")
  40. 40. Example of using FDW exec(con, "select dtm_begin_transaction()") exec(con, "begin transaction") exec(con, "update t set v = v + $1 where u=$2", amount, account1) exec(con, "update t set v = v - $1 where u=$2", amount, account2) exec(con, “commit”)
  41. 41. Example of using pg_shard exec(con, "begin transaction") exec(con, "update t set v = v + $1 where u=$2", amount, account1) exec(con, "update t set v = v - $1 where u=$2", amount, account2) exec(con, “commit”)
  42. 42. Test configuration Client 1 Client 2 Worker 2 Client 2Client 2Client 2 Worker 1 Worker 1 Worker 1 Arbiter
  43. 43. Performance measurement 1 2 3 4 0 10 20 30 40 50 60 70 80 90 100 pg_shard fdw w/o DTM with DTM Simple bank debit/credit benchmark (a-la TPC-A) Two clients with 60 writers kTPS Nodes
  44. 44. Multimaster performance 1 2 3 4 0 50 100 150 200 250 300 350 400 450 no writers 8 writers Simple update/select queries Three clients with 140 readers kTPS Nodes
  45. 45. Roadmap ● Add XTM patch to PostgreSQL 9.6 ● Experiment with different DTM implementations ● Provide integration of DTM with different cluster solutions (pg_shard, FDW, XL,...) ● Implement multimaster on top of DTM
  46. 46. 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/Citus + + + + + + Greenplum + + + Bucardo + + + + + BDR + + + + + SR + +? + + + FDW + + + + +
  47. 47. Спасибо за внимание!

×