34
www.postgrespro.ru Беспроблемная эксплуатация PostgreSQL Васильев Дмитрий

Беспроблемная эксплуатация PostgreSQL

  • Upload
    -

  • View
    531

  • Download
    1

Embed Size (px)

Citation preview

www.postgrespro.ru

Беспроблемная эксплуатация PostgreSQL

Васильев Дмитрий

Задача доклада

● отказоустойчивость

● производительность

● балансировка

Часть №1

Целостность данных

Инструменты

● pg_dump

● replication

● checksums

● backup && PITR

pg_dump

Снимок состояния данных

● Не возвращает в прежнее состояние

● Кроссплатформенность

● Большое время и сложность восстановления

репликация

● в PostgreSQL работает практически идеально

● не поможет от логической ошибки

● не является бэкапом (см пункт выше)

● не стоит бояться синхронной

checksums

Записанные и прочитанные данные могут содержать искажения:

● любой софт, в том числе и firmware содержит баги

● могут отключать только пользователи zfs, btrfs :)

● mdadm может сказать только что пора восстанавливать бакап

pg_basebackup && PITR

● восстановление быстрое, но не кроссплатформенное

● приемлемая нагрузка при снятии бэкапа (rsync)

● бэкап необходимо проверять (см пункт выше)

● доставка логов и PITR. REDO

Часть №2

Производительность

Производительность

● Анализируйте происходящее!

● Логи запросов для статистического анализа (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 в бою нельзя

● мы сделали правильную версию, скоро будет

Ручки для управления памятью бакэнда

● work_mem

● maintenance_work_mem

● temp_buffers

Vacuum

● Зачем

● Почему

● Как

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)

Bloat: инструменты

● vacuum

● pg_repack

● pgcompacttable

Wraparound

● xmin, xmax являются 32 битным int

● счетчик переполняется:2 недели на скорости 3k tp/s ~ 2^32

● current_xid должен только расти!

Freeze && Vacuum && Wraparound

Заморозкой всех строк, созданных ОЧЕНЬ старыми транзакциями занимается

vacuum

Wraparound

● FrozenXid (9.4)

● HEAP_XMIN_FROZEN (9.5)

● VM_ALL_FROZEN (9.6)

Часть №3

Балансировка клиентов

Балансировка клиентов

● PgBouncer

● PgPool-II

● Nginx (TCP)

● Haproxy

PgBouncer

PgBouncermodes:

● session● transaction● statement

PostgreSQL

Client

Client

Client

Client

Client

SlaveSlave

Master

Write

Read

Query

PgPool: silver bullet ?

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)

www.postgrespro.ru

Спасибо за внимание!

www.postgrespro.ru

Вопросы?