Upload
-
View
531
Download
1
Embed Size (px)
Citation preview
pg_dump
Снимок состояния данных
● Не возвращает в прежнее состояние
● Кроссплатформенность
● Большое время и сложность восстановления
репликация
● в PostgreSQL работает практически идеально
● не поможет от логической ошибки
● не является бэкапом (см пункт выше)
● не стоит бояться синхронной
checksums
Записанные и прочитанные данные могут содержать искажения:
● любой софт, в том числе и firmware содержит баги
● могут отключать только пользователи zfs, btrfs :)
● mdadm может сказать только что пора восстанавливать бакап
pg_basebackup && PITR
● восстановление быстрое, но не кроссплатформенное
● приемлемая нагрузка при снятии бэкапа (rsync)
● бэкап необходимо проверять (см пункт выше)
● доставка логов и PITR. REDO
Производительность
● Анализируйте происходящее!
● Логи запросов для статистического анализа (pgbadger)
● Снимайте метрики с системы и с PostgreSQL (OKMeter.IO, mamonsu, ...)
● Мы поговорим о внутреннем устройстве
Обработка запроса
update tset y = y + 1 where x = 1
BACKEND
PARSER
PLANNER
EXECUTER
user=# \d+ t Table "user.t" Column | Type --------+---------+ x | integer | y | integer |Indexes: "t_pkey" PRIMARY KEY, btree (x)
-[ RECORD 1 ]-------+---------relid | 24639schemaname | userrelname | tseq_scan | 1seq_tup_read | 0idx_scan | 0idx_tup_fetch | 0n_tup_ins | 0n_tup_upd | 0n_tup_del | 0n_tup_hot_upd | 0n_live_tup | 0n_dead_tup | 0n_mod_since_analyze | 0last_vacuum | last_autovacuum | last_analyze | last_autoanalyze | vacuum_count | 0autovacuum_count | 0analyze_count | 0autoanalyze_count | 0
-[ RECORD 1 ]-+-------relid | 24639indexrelid | 24642schemaname | userrelname | tindexrelname | t_pkeyidx_scan | 0idx_tup_read | 0idx_tup_fetch | 0
| t_xmin | t_xmax | x | y |---------+---------+---+---+| 1 | 2 | 1 | 1 |---------+---------+---+---+| 2 | 0 | 1 | 2 |---------+---------+---+---+
Update on t -> Index Scan using t_pkey on t -> Index Cond: (x = 1)
Управление памятью
DISK STORAGE
OS CACHE(hint: effective_cache)
SHARED BUFFERSBACKEND (work_mem, temp_buffers)
BACKEND (work_mem, temp_buffers)
BACKEND (work_mem, temp_buffers)OS DIRTY
R/W PAGE
Write Ahead Log
Оптимальный размер Shared Buffers
pg_buffercache
-[ RECORD 1 ]----+------bufferid | 331relfilenode | 2654reltablespace | 1663reldatabase | 16432relforknumber | 0relblocknumber | 1isdirty | fusagecount | 5pinning_backends | 0
● зависит от вашего железа
● зависит от типа нагрузки
● использовать pg_buffercache в бою нельзя
● мы сделали правильную версию, скоро будет
Vacuum
-[ RECORD 1 ]----+-------------------------datid | 16384datname | databasepid | 10190usesysid | 16431usename | userapplication_name | psqlclient_addr | client_hostname | client_port | -1backend_start | 2016-04-22 22:47:50xact_start | query_start | 2016-04-22 22:48:12state_change | 2016-04-22 22:48:12waiting | fstate | idlebackend_xid | 4backend_xmin | 4query | update t set y = y + 1
+--------+---------+---+---+| t_xmin | t_xmax | x | y |---------+---------+---+---+| 1 | 2 | 1 | 1 |---------+---------+---+---+| 2 | 0 | 1 | 2 |+--------+---------+---+---+| 3 | 5 | 2 | 4 |+--------+---------+---+---+
Vacuum ускоряет
Page
TupleTupleHeader
PageHeader
TupleHeader:
XMIN_COMMITTEDXMIN_ABORTEDXMAX_COMMITTEDXMAX_ABORTED
PageHeader:
pd_lsn, pd_checksum,pd_flags:
PD_HAS_FREE_LINESPD_PAGE_FULLPD_ALL_VISIBLE
Bloat: агрессивный вакуум
● autovacuum_max_workers
● autovacuum_naptime
● autovacuum_vacuum_scale_factor
● autovacuum_work_mem
Bloat: плохой код
● statement_timeout
● PgBouncer: server_idle_timeout
● pg_stat_activity && pg_cancel_backend()
● snapshot too old (~ 9.6)
Wraparound
● xmin, xmax являются 32 битным int
● счетчик переполняется:2 недели на скорости 3k tp/s ~ 2^32
● current_xid должен только расти!
Freeze && Vacuum && Wraparound
Заморозкой всех строк, созданных ОЧЕНЬ старыми транзакциями занимается
vacuum
PgBouncer
PgBouncermodes:
● session● transaction● statement
PostgreSQL
Client
Client
Client
Client
Client
TCP Balancing
PgBouncer
PostgreSQL
Client
Client
Client
Client
Client
RW
RW
RW
RW
RW
HaProxy
PostgreSQL
http-check
http-check
TCP Balancing
PostgreSQL(slave)
Client
Client
Client
Client
Client
RO
RO
RO
RO
RO
NGINXor
HaProxy
PostgreSQL(slave)
PostgreSQL(slave)