SlideShare uma empresa Scribd logo
1 de 53
Baixar para ler offline
Отладка и
устранение проблем
в PostgreSQL
Streaming Replication
Алексей Лесовский
План
Немного теории или как работает постгресовая репликация.
Troubleshooting tools или что есть у PostgreSQL и сообщества.
Troubleshooting cases — симптомы, проблемы, диагностика, решения.
Итоги, вопросы — ответы.
Зачем всё это?
Для лучшего понимания потоковой репликации.
Научиться быстро находить и устранять проблемы.
https://www.slideshare.net/alexeylesovsky/presentations
План
Немного теории или как работает постгресовая репликация.
Troubleshooting tools или что есть у PostgreSQL и сообщества.
Troubleshooting cases — симптомы, проблемы, диагностика, решения.
Итоги, вопросы — ответы.
Немного теории
Write-Ahead Log (XLOG) — история всех изменений в БД.
● Бэкенды синхронно пишут все изменения в XLOG;
● Либо это делает WAL writer асинхронно.
Каталог pg_xlog/ (pg_wal/) в $DATADIR.
Потоковая репликация основана на XLOG.
Немного теории
Write-Ahead Log (XLOG) — история всех изменений в БД. почти;)
● Бэкенды синхронно пишут все изменения в XLOG;
● Либо это делает WAL writer асинхронно.
Каталог pg_xlog/ (pg_wal/) в $DATADIR.
Потоковая репликация основана на XLOG.
Немного теории
WAL Sender process (мастер).
WAL Receiver process (реплика).
Startup process (реплика).
Немного теории
WAL
Buffers
Storage
WAL
Sender
Network
WAL
Receiver
Storage
Startup
Process
План
Немного теории или как работает постгресовая репликация.
Troubleshooting tools или что есть у PostgreSQL и сообщества.
Troubleshooting cases — проблемы, симптомы и диагностика.
Итоги, вопросы — ответы.
Сторонние инструменты
Top (procps).
Iostat (sysstat), iotop.
Nicstat.
pgCenter.
Perf.
Сторонние инструменты
Top (procps) — утилизация CPU , load average, использование mem/swap.
Iostat (sysstat), iotop — утилизация хранилища, per-process ввод/вывод.
Nicstat — утилизация интерфейсов.
pgCenter — статистика по репликации.
Perf — подземные стуки.
Встроенные средства
Системные представления (views).
Вспомогательные функции.
Утилита pg_waldump (pg_xlogdump).
Системные представления
● pg_stat_replication, pg_stat_wal_receiver;
● pg_stat_databases, pg_stat_databases_conflicts;
● pg_stat_activity;
● pg_stat_archiver.
Вспомогательные функции
● pg_current_wal_lsn(), pg_current_xlog_location();
● pg_last_wal_receive_lsn(), pg_last_xlog_receive_location();
● pg_wal_lsn_diff(), pg_xlog_location_diff();
● df *(wal|xlog|lsn|location)* — psql мета-команда
pg_waldump
pg_waldump:
● Декодирует XLOG в человеко-понятный формат;
● Может врать при запущенном постгресе.
● pg_waldump -f -p /wal_10 
$(psql -qAtX -c "select pg_walfile_name(pg_current_wal_lsn())")
План
Немного теории или как работает постгресовая репликация.
Troubleshooting tools или что есть у PostgreSQL и сообщества.
Troubleshooting cases — проблемы, симптомы и диагностика.
Итоги, вопросы — ответы.
Проблемы репликации
Лаги репликации.
Распухание pg_wal/.
Долгие запросы и конфликты при восстановлении.
Recovery process: 100% CPU usage.
Проблемы репликации
Лаги репликации.
Распухание pg_wal/.
Долгие запросы и конфликты при восстановлении.
Recovery process: 100% CPU usage.
Лаги репликации
Данные между мастером и репликами отличаются.
Лаги репликации
Как искать?
● pg_stat_replication, pg_wal_lsn_dif();
● pg_last_xact_replay_timestamp().
pg_stat_replication
Column | Type |
------------------+--------------------------+
pid | integer |
usesysid | oid |
usename | name |
application_name | text |
client_addr | inet |
client_hostname | text |
client_port | integer |
backend_start | timestamp with time zone |
backend_xmin | xid |
state | text |
sent_lsn | pg_lsn | <-- Log Sequence Number — позиция внутри XLOG
write_lsn | pg_lsn |
flush_lsn | pg_lsn |
replay_lsn | pg_lsn |
write_lag | interval | <-- Отставание выраженное во времени
flush_lag | interval |
replay_lag | interval |
sync_priority | integer |
sync_state | text |
Лаги репликации
# SELECT
client_addr AS client, usename AS user, application_name AS name,
state, sync_state AS mode,
(pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending,
(pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write,
(pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush,
(pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay,
(pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag
FROM pg_stat_replication;
client | user | name | state | mode | pending | write | flush | replay | total_lag
---------+--------+-------------+-----------+-------+---------+-------+-------+--------+-----------
10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480
10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025
10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552
10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
Лаги репликации
# SELECT
client_addr AS client, usename AS user, application_name AS name,
state, sync_state AS mode,
(pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending,
(pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write,
(pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush,
(pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay,
(pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag
FROM pg_stat_replication;
client | user | name | state | mode | pending | write | flush | replay | total_lag
---------+--------+-------------+-----------+-------+---------+-------+-------+--------+-----------
10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480
10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025
10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552
10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
Лаги репликации
# SELECT
client_addr AS client, usename AS user, application_name AS name,
state, sync_state AS mode,
(pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending, <-- сеть?
(pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write,
(pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush,
(pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay,
(pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag
FROM pg_stat_replication;
client | user | name | state | mode | pending | write | flush | replay | total_lag
---------+--------+-------------+-----------+-------+---------+-------+-------+--------+-----------
10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480
10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025
10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552
10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
Лаги репликации
# SELECT
client_addr AS client, usename AS user, application_name AS name,
state, sync_state AS mode,
(pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending,
(pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write, <-- диски?
(pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush,
(pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay,
(pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag
FROM pg_stat_replication;
client | user | name | state | mode | pending | write | flush | replay | total_lag
---------+--------+-------------+-----------+-------+---------+-------+-------+--------+-----------
10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480
10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025
10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552
10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
Лаги репликации
# SELECT
client_addr AS client, usename AS user, application_name AS name,
state, sync_state AS mode,
(pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending,
(pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write,
(pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush, <-- диски?
(pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay,
(pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag
FROM pg_stat_replication;
client | user | name | state | mode | pending | write | flush | replay | total_lag
---------+--------+-------------+-----------+-------+---------+-------+-------+--------+-----------
10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480
10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025
10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552
10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
Лаги репликации
# SELECT
client_addr AS client, usename AS user, application_name AS name,
state, sync_state AS mode,
(pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending,
(pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write,
(pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush,
(pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay, <-- диски/CPU?
(pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag
FROM pg_stat_replication;
client | user | name | state | mode | pending | write | flush | replay | total_lag
---------+--------+-------------+-----------+-------+---------+-------+-------+--------+-----------
10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480
10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025
10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552
10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
Лаги репликации
# SELECT
client_addr AS client, usename AS user, application_name AS name,
state, sync_state AS mode,
(pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending,
(pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write,
(pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush,
(pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay,
(pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag
FROM pg_stat_replication;
client | user | name | state | mode | pending | write | flush | replay | total_lag
---------+--------+-------------+-----------+-------+---------+-------+-------+--------+-----------
10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480
10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025
10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552
10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
Проверка гипотезы
Сетевой лаг — nicstat.
Проблемы в хранилище — iostat, iotop.
Задержки восстановления — top, pg_stat_activity.
Большой объем WAL:
● pg_stat_activity, pg_stat_progress_vacuum;
● pg_wal_lsn_diff().
Варианты решения
Проблемы на уровне сети/хранения:
● Проверить workload — запросы, миграции, CRUD.
● upgrade hardware?
Варианты решения
Задержки восстановления:
● Стрелять долгие запросы на реплике;
● Либо просто ждать.
Варианты решения
Большой объем WAL:
● Уменьшить объем «изменений» в БД в единицу времени;
● Уменьшить объем записи в WAL в целом:
● full_page_writes = of;
● Увеличить интервал между чекпоинтами.
Проблемы репликации
Лаги репликации.
Распухание pg_wal/.
Долгие запросы и конфликты при восстановлении.
Recovery process: 100% CPU usage.
Распухание pg_wal/
Основные симптомы:
● Непредсказуемый рост использования дискового пространства;
● Ненормальный размер pg_wal/ каталога.
Распухание pg_wal/
Как обнаружить?
● du -csh;
● pg_replication_slots, pg_stat_archiver;
● Ошибки в postgres'овых логах.
Распухание pg_wal/
Варианты проблем:
● Тяжелый CRUD.
● Забытый или неиспользуемый слот репликации.
● Сломанная archive_command.
Распухание pg_wal/
Экстренные меры (100% used space)
● Отстрелить долгие CRUD запросы — pg_terminate_backend();
● Уменьшить reserved space ratio (ext filesystems);
● Добавить еще места (LVM, ZFS, etc);
Распухание pg_wal/
Экстренные меры (100% used space)
● Отстрелить долгие CRUD запросы — pg_terminate_backend();
● Уменьшить reserved space ratio (ext filesystems);
● Добавить еще места (LVM, ZFS, etc);
● НИКОГДА НИЧЕГО НЕ УДАЛЯТЬ РУКАМИ ИЗ pg_xlog/, pg_wal/
Распухание pg_wal/
Что делать дальше:
● Снова проверить workload — CRUD.
● Состояние репликации.
● Уменьшить checkpoints_segments/max_wal_size, wal_keep_segments;
● Удалить слот репликации или починить подписчика;
● Починить WAL archiving;
checkpoint, checkpoint, cheсkpoint...
Проблемы репликации
Лаги репликации.
Распухание pg_wal/.
Долгие запросы и конфликты при восстановлении.
Recovery process: 100% CPU usage.
Конфликты восстановления
Основные симптомы — ошибки в логах постгреса или приложения.
● User was holding shared bufer pin for too long.
● User query might have needed to see row versions that must be removed.
● User was holding a relation lock for too long.
● User was or might have been using tablespace that must be dropped.
● User transaction caused bufer deadlock with recovery.
● User was connected to a database that must be dropped.
Проблемы репликации
Как обнаружить:
● pg_stat_databases, pg_stat_databases_conflicts;
● postgresql logs.
Проблемы репликации
Когда это действительно становится проблемой:
● Отмена запросов происходит слишком часто;
● Большой лаг репликации.
Проблемы репликации
Решения:
● Увеличить max_standby_streaming_delay (риск лага репликации);
● Включить hot_standby_feedback (риск распухания таблиц/индексов);
● Переписать долгие запросы;
● Настроить выделенную реплику для долгих запросов.
Проблемы репликации
Лаги репликации.
Распухание pg_wal/.
Долгие запросы и конфликты при восстановлении.
Recovery process: 100% CPU usage.
Задержка восстановления
Основные симптомы:
● Значительный «replay» лаг;
● 100% утилизация CPU процессом recovery.
Задержка восстановления
Как обнаружить?
● top — CPU usage;
● pg_stat_replication — replay лаг.
Задержка восстановления
Что и как искать:
● perf top/record/report (требуются debug–пакеты);
● GDB;
● pg_waldump.
Задержка восстановления
Решения:
● Зависят от результатов расследования;
● Устранение проблемного workload (как правило).
План
Немного теории или как работает постгресовая репликация.
Troubleshooting tools или что есть у PostgreSQL и сообщества.
Troubleshooting cases — проблемы, симптомы и диагностика.
Итоги, вопросы — ответы.
Итоги
Проблемы потоковой репликации всегда распределены между хостами
Источниками проблем выступают:
● Недостаток ресурсов, запросы, workload.
Без мониторинга никак.
Встроенные средства нужно знать и уметь.
Links
PostgreSQL official documentation – The Statistics Collector
https://www.postgresql.org/docs/current/static/monitoring-stats.html
PostgreSQL Mailing Lists (general, performance, hackers)
https://www.postgresql.org/list/
PostgreSQL-Consulting company blog
http://blog.postgresql-consulting.com
Эти слайды:
https://www.slideshare.net/alexeylesovsky/presentations
Спасибо за внимание!
dataegret.com alexey.lesovsky@dataegret.com

Mais conteúdo relacionado

Mais procurados

Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Ontico
 
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (..."Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...AvitoTech
 
Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.Anastasia Lubennikova
 
Call of Postgres: Advanced Operations (part 4)
Call of Postgres: Advanced Operations (part 4)Call of Postgres: Advanced Operations (part 4)
Call of Postgres: Advanced Operations (part 4)Alexey Lesovsky
 
Использование очередей асинхронных сообщений с PostgreSQL (Илья Космодемьянский)
Использование очередей асинхронных сообщений с PostgreSQL (Илья Космодемьянский)Использование очередей асинхронных сообщений с PostgreSQL (Илья Космодемьянский)
Использование очередей асинхронных сообщений с PostgreSQL (Илья Космодемьянский)Ontico
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Ontico
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Ontico
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Ontico
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)Ontico
 
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...Ontico
 
Расширения для PostgreSQL
Расширения для PostgreSQLРасширения для PostgreSQL
Расширения для PostgreSQLAnastasia Lubennikova
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»Tanya Denisyuk
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Ontico
 
Hacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхHacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхAnastasia Lubennikova
 
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupMail.ru Group
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Ontico
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Ontico
 

Mais procurados (19)

Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
 
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (..."Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
 
Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.Hacking PostgreSQL. Разделяемая память и блокировки.
Hacking PostgreSQL. Разделяемая память и блокировки.
 
Call of Postgres: Advanced Operations (part 4)
Call of Postgres: Advanced Operations (part 4)Call of Postgres: Advanced Operations (part 4)
Call of Postgres: Advanced Operations (part 4)
 
Использование очередей асинхронных сообщений с PostgreSQL (Илья Космодемьянский)
Использование очередей асинхронных сообщений с PostgreSQL (Илья Космодемьянский)Использование очередей асинхронных сообщений с PostgreSQL (Илья Космодемьянский)
Использование очередей асинхронных сообщений с PostgreSQL (Илья Космодемьянский)
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
 
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
Отказоустойчивая обработка 10M OAuth токенов на Tarantool / Владимир Перепели...
 
Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...Современная операционная система: что надо знать разработчику / Александр Кри...
Современная операционная система: что надо знать разработчику / Александр Кри...
 
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
 
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
 
Расширения для PostgreSQL
Расширения для PostgreSQLРасширения для PostgreSQL
Расширения для PostgreSQL
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)Что нового в nginx? / Максим Дунин (Nginx, Inc.)
Что нового в nginx? / Максим Дунин (Nginx, Inc.)
 
Hacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данныхHacking PostgreSQL. Физическое представление данных
Hacking PostgreSQL. Физическое представление данных
 
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru GroupDennis Anikin - Tarantool Case Studies in Mail.Ru Group
Dennis Anikin - Tarantool Case Studies in Mail.Ru Group
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
 
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
Оптимизация работы с данными в мобильных приложениях / Святослав Иванов, Артё...
 

Semelhante a Отладка и устранение проблем в PostgreSQL Streaming Replication.

SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.SECON
 
PostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. МолодёжноPostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. МолодёжноVladislav Bezverhiy
 
Oracle how to live without cloud control
Oracle how to live without cloud controlOracle how to live without cloud control
Oracle how to live without cloud controlAnton Bushmelev
 
React со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингReact со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингTimophy Chaptykov
 
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)Александр Сигачев
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиSQALab
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиZestranec
 
Kostja Root Conf
Kostja Root ConfKostja Root Conf
Kostja Root ConfLiudmila Li
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?phpdevby
 
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...CocoaHeads
 
Nginx Igor Sysoev
Nginx   Igor SysoevNginx   Igor Sysoev
Nginx Igor SysoevMedia Gorod
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)Ontico
 
High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9HighLoad2009
 
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...SIPLABS Communications
 
Миграция данных из Oracle в Postgres
Миграция данных из Oracle в PostgresМиграция данных из Oracle в Postgres
Миграция данных из Oracle в PostgresCUSTIS
 
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...Nikolay Samokhvalov
 

Semelhante a Отладка и устранение проблем в PostgreSQL Streaming Replication. (20)

SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
 
Scorex framework
Scorex frameworkScorex framework
Scorex framework
 
PostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. МолодёжноPostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. Молодёжно
 
Scala On Rest
Scala On RestScala On Rest
Scala On Rest
 
Oracle how to live without cloud control
Oracle how to live without cloud controlOracle how to live without cloud control
Oracle how to live without cloud control
 
React со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингReact со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендеринг
 
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
Тестирование программных фильтров безопасности
Тестирование программных фильтров безопасностиТестирование программных фильтров безопасности
Тестирование программных фильтров безопасности
 
Kostja Root Conf
Kostja Root ConfKostja Root Conf
Kostja Root Conf
 
PHP 5.4: Что нового?
PHP 5.4: Что нового?PHP 5.4: Что нового?
PHP 5.4: Что нового?
 
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
Встреча №8. RESTful клиент — это просто. Тонкости использования RestKit, Миха...
 
Nginx Igor Sysoev
Nginx   Igor SysoevNginx   Igor Sysoev
Nginx Igor Sysoev
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9
 
Apache spark
Apache sparkApache spark
Apache spark
 
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...
KAZOOMEETUP MOSCOW 2015. Владимир Потапьев. Обзор приложения Circlemaker (RAD...
 
Миграция данных из Oracle в Postgres
Миграция данных из Oracle в PostgresМиграция данных из Oracle в Postgres
Миграция данных из Oracle в Postgres
 
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
#PostgreSQLRussia 2015.09.15 - Максим Трегубов, CUSTIS - Миграция из Oracle в...
 

Mais de Alexey Lesovsky

Troubleshooting PostgreSQL with pgCenter
Troubleshooting PostgreSQL with pgCenterTroubleshooting PostgreSQL with pgCenter
Troubleshooting PostgreSQL with pgCenterAlexey Lesovsky
 
GitLab PostgresMortem: Lessons Learned
GitLab PostgresMortem: Lessons LearnedGitLab PostgresMortem: Lessons Learned
GitLab PostgresMortem: Lessons LearnedAlexey Lesovsky
 
Troubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationTroubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationAlexey Lesovsky
 
Tuning Linux for Databases.
Tuning Linux for Databases.Tuning Linux for Databases.
Tuning Linux for Databases.Alexey Lesovsky
 
Managing PostgreSQL with PgCenter
Managing PostgreSQL with PgCenterManaging PostgreSQL with PgCenter
Managing PostgreSQL with PgCenterAlexey Lesovsky
 
Nine Circles of Inferno or Explaining the PostgreSQL Vacuum
Nine Circles of Inferno or Explaining the PostgreSQL VacuumNine Circles of Inferno or Explaining the PostgreSQL Vacuum
Nine Circles of Inferno or Explaining the PostgreSQL VacuumAlexey Lesovsky
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Alexey Lesovsky
 
Streaming replication in practice
Streaming replication in practiceStreaming replication in practice
Streaming replication in practiceAlexey Lesovsky
 
PostgreSQL Streaming Replication Cheatsheet
PostgreSQL Streaming Replication CheatsheetPostgreSQL Streaming Replication Cheatsheet
PostgreSQL Streaming Replication CheatsheetAlexey Lesovsky
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Alexey Lesovsky
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Alexey Lesovsky
 
Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.Alexey Lesovsky
 
PostgreSQL Troubleshoot On-line, (RITfest 2015 meetup at Moscow, Russia).
PostgreSQL Troubleshoot On-line, (RITfest 2015 meetup at Moscow, Russia).PostgreSQL Troubleshoot On-line, (RITfest 2015 meetup at Moscow, Russia).
PostgreSQL Troubleshoot On-line, (RITfest 2015 meetup at Moscow, Russia).Alexey Lesovsky
 
Linux tuning for PostgreSQL at Secon 2015
Linux tuning for PostgreSQL at Secon 2015Linux tuning for PostgreSQL at Secon 2015
Linux tuning for PostgreSQL at Secon 2015Alexey Lesovsky
 

Mais de Alexey Lesovsky (15)

Troubleshooting PostgreSQL with pgCenter
Troubleshooting PostgreSQL with pgCenterTroubleshooting PostgreSQL with pgCenter
Troubleshooting PostgreSQL with pgCenter
 
GitLab PostgresMortem: Lessons Learned
GitLab PostgresMortem: Lessons LearnedGitLab PostgresMortem: Lessons Learned
GitLab PostgresMortem: Lessons Learned
 
Troubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming ReplicationTroubleshooting PostgreSQL Streaming Replication
Troubleshooting PostgreSQL Streaming Replication
 
Tuning Linux for Databases.
Tuning Linux for Databases.Tuning Linux for Databases.
Tuning Linux for Databases.
 
Managing PostgreSQL with PgCenter
Managing PostgreSQL with PgCenterManaging PostgreSQL with PgCenter
Managing PostgreSQL with PgCenter
 
Nine Circles of Inferno or Explaining the PostgreSQL Vacuum
Nine Circles of Inferno or Explaining the PostgreSQL VacuumNine Circles of Inferno or Explaining the PostgreSQL Vacuum
Nine Circles of Inferno or Explaining the PostgreSQL Vacuum
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
 
Streaming replication in practice
Streaming replication in practiceStreaming replication in practice
Streaming replication in practice
 
PostgreSQL Streaming Replication Cheatsheet
PostgreSQL Streaming Replication CheatsheetPostgreSQL Streaming Replication Cheatsheet
PostgreSQL Streaming Replication Cheatsheet
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
 
Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.Deep dive into PostgreSQL statistics.
Deep dive into PostgreSQL statistics.
 
Pgcenter overview
Pgcenter overviewPgcenter overview
Pgcenter overview
 
Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.Highload 2014. PostgreSQL: ups, DevOps.
Highload 2014. PostgreSQL: ups, DevOps.
 
PostgreSQL Troubleshoot On-line, (RITfest 2015 meetup at Moscow, Russia).
PostgreSQL Troubleshoot On-line, (RITfest 2015 meetup at Moscow, Russia).PostgreSQL Troubleshoot On-line, (RITfest 2015 meetup at Moscow, Russia).
PostgreSQL Troubleshoot On-line, (RITfest 2015 meetup at Moscow, Russia).
 
Linux tuning for PostgreSQL at Secon 2015
Linux tuning for PostgreSQL at Secon 2015Linux tuning for PostgreSQL at Secon 2015
Linux tuning for PostgreSQL at Secon 2015
 

Отладка и устранение проблем в PostgreSQL Streaming Replication.

  • 1. Отладка и устранение проблем в PostgreSQL Streaming Replication Алексей Лесовский
  • 2. План Немного теории или как работает постгресовая репликация. Troubleshooting tools или что есть у PostgreSQL и сообщества. Troubleshooting cases — симптомы, проблемы, диагностика, решения. Итоги, вопросы — ответы.
  • 3. Зачем всё это? Для лучшего понимания потоковой репликации. Научиться быстро находить и устранять проблемы. https://www.slideshare.net/alexeylesovsky/presentations
  • 4. План Немного теории или как работает постгресовая репликация. Troubleshooting tools или что есть у PostgreSQL и сообщества. Troubleshooting cases — симптомы, проблемы, диагностика, решения. Итоги, вопросы — ответы.
  • 5. Немного теории Write-Ahead Log (XLOG) — история всех изменений в БД. ● Бэкенды синхронно пишут все изменения в XLOG; ● Либо это делает WAL writer асинхронно. Каталог pg_xlog/ (pg_wal/) в $DATADIR. Потоковая репликация основана на XLOG.
  • 6. Немного теории Write-Ahead Log (XLOG) — история всех изменений в БД. почти;) ● Бэкенды синхронно пишут все изменения в XLOG; ● Либо это делает WAL writer асинхронно. Каталог pg_xlog/ (pg_wal/) в $DATADIR. Потоковая репликация основана на XLOG.
  • 7. Немного теории WAL Sender process (мастер). WAL Receiver process (реплика). Startup process (реплика).
  • 9. План Немного теории или как работает постгресовая репликация. Troubleshooting tools или что есть у PostgreSQL и сообщества. Troubleshooting cases — проблемы, симптомы и диагностика. Итоги, вопросы — ответы.
  • 10. Сторонние инструменты Top (procps). Iostat (sysstat), iotop. Nicstat. pgCenter. Perf.
  • 11. Сторонние инструменты Top (procps) — утилизация CPU , load average, использование mem/swap. Iostat (sysstat), iotop — утилизация хранилища, per-process ввод/вывод. Nicstat — утилизация интерфейсов. pgCenter — статистика по репликации. Perf — подземные стуки.
  • 12. Встроенные средства Системные представления (views). Вспомогательные функции. Утилита pg_waldump (pg_xlogdump).
  • 13. Системные представления ● pg_stat_replication, pg_stat_wal_receiver; ● pg_stat_databases, pg_stat_databases_conflicts; ● pg_stat_activity; ● pg_stat_archiver.
  • 14. Вспомогательные функции ● pg_current_wal_lsn(), pg_current_xlog_location(); ● pg_last_wal_receive_lsn(), pg_last_xlog_receive_location(); ● pg_wal_lsn_diff(), pg_xlog_location_diff(); ● df *(wal|xlog|lsn|location)* — psql мета-команда
  • 15. pg_waldump pg_waldump: ● Декодирует XLOG в человеко-понятный формат; ● Может врать при запущенном постгресе. ● pg_waldump -f -p /wal_10 $(psql -qAtX -c "select pg_walfile_name(pg_current_wal_lsn())")
  • 16. План Немного теории или как работает постгресовая репликация. Troubleshooting tools или что есть у PostgreSQL и сообщества. Troubleshooting cases — проблемы, симптомы и диагностика. Итоги, вопросы — ответы.
  • 17. Проблемы репликации Лаги репликации. Распухание pg_wal/. Долгие запросы и конфликты при восстановлении. Recovery process: 100% CPU usage.
  • 18. Проблемы репликации Лаги репликации. Распухание pg_wal/. Долгие запросы и конфликты при восстановлении. Recovery process: 100% CPU usage.
  • 19. Лаги репликации Данные между мастером и репликами отличаются.
  • 20. Лаги репликации Как искать? ● pg_stat_replication, pg_wal_lsn_dif(); ● pg_last_xact_replay_timestamp().
  • 21. pg_stat_replication Column | Type | ------------------+--------------------------+ pid | integer | usesysid | oid | usename | name | application_name | text | client_addr | inet | client_hostname | text | client_port | integer | backend_start | timestamp with time zone | backend_xmin | xid | state | text | sent_lsn | pg_lsn | <-- Log Sequence Number — позиция внутри XLOG write_lsn | pg_lsn | flush_lsn | pg_lsn | replay_lsn | pg_lsn | write_lag | interval | <-- Отставание выраженное во времени flush_lag | interval | replay_lag | interval | sync_priority | integer | sync_state | text |
  • 22. Лаги репликации # SELECT client_addr AS client, usename AS user, application_name AS name, state, sync_state AS mode, (pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending, (pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write, (pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush, (pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay, (pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag FROM pg_stat_replication; client | user | name | state | mode | pending | write | flush | replay | total_lag ---------+--------+-------------+-----------+-------+---------+-------+-------+--------+----------- 10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480 10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025 10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552 10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
  • 23. Лаги репликации # SELECT client_addr AS client, usename AS user, application_name AS name, state, sync_state AS mode, (pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending, (pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write, (pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush, (pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay, (pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag FROM pg_stat_replication; client | user | name | state | mode | pending | write | flush | replay | total_lag ---------+--------+-------------+-----------+-------+---------+-------+-------+--------+----------- 10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480 10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025 10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552 10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
  • 24. Лаги репликации # SELECT client_addr AS client, usename AS user, application_name AS name, state, sync_state AS mode, (pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending, <-- сеть? (pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write, (pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush, (pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay, (pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag FROM pg_stat_replication; client | user | name | state | mode | pending | write | flush | replay | total_lag ---------+--------+-------------+-----------+-------+---------+-------+-------+--------+----------- 10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480 10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025 10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552 10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
  • 25. Лаги репликации # SELECT client_addr AS client, usename AS user, application_name AS name, state, sync_state AS mode, (pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending, (pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write, <-- диски? (pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush, (pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay, (pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag FROM pg_stat_replication; client | user | name | state | mode | pending | write | flush | replay | total_lag ---------+--------+-------------+-----------+-------+---------+-------+-------+--------+----------- 10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480 10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025 10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552 10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
  • 26. Лаги репликации # SELECT client_addr AS client, usename AS user, application_name AS name, state, sync_state AS mode, (pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending, (pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write, (pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush, <-- диски? (pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay, (pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag FROM pg_stat_replication; client | user | name | state | mode | pending | write | flush | replay | total_lag ---------+--------+-------------+-----------+-------+---------+-------+-------+--------+----------- 10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480 10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025 10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552 10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
  • 27. Лаги репликации # SELECT client_addr AS client, usename AS user, application_name AS name, state, sync_state AS mode, (pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending, (pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write, (pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush, (pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay, <-- диски/CPU? (pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag FROM pg_stat_replication; client | user | name | state | mode | pending | write | flush | replay | total_lag ---------+--------+-------------+-----------+-------+---------+-------+-------+--------+----------- 10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480 10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025 10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552 10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
  • 28. Лаги репликации # SELECT client_addr AS client, usename AS user, application_name AS name, state, sync_state AS mode, (pg_wal_lsn_diff(pg_current_wal_lsn(),sent_lsn) / 1024)::int as pending, (pg_wal_lsn_diff(sent_lsn,write_lsn) / 1024)::int as write, (pg_wal_lsn_diff(write_lsn,flush_lsn) / 1024)::int as flush, (pg_wal_lsn_diff(flush_lsn,replay_lsn) / 1024)::int as replay, (pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn))::int / 1024 as total_lag FROM pg_stat_replication; client | user | name | state | mode | pending | write | flush | replay | total_lag ---------+--------+-------------+-----------+-------+---------+-------+-------+--------+----------- 10.6.6.9 | repmgr | walreceiver | streaming | async | 0 | 0 | 0 | 410480 | 410480 10.6.6.7 | repmgr | walreceiver | streaming | async | 0 | 2845 | 95628 | 112552 | 211025 10.6.6.6 | repmgr | walreceiver | streaming | async | 0 | 0 | 3056 | 9496 | 12552 10.6.6.8 | repmgr | walreceiver | streaming | async | 847582 | 0 | 0 | 3056 | 850638
  • 29. Проверка гипотезы Сетевой лаг — nicstat. Проблемы в хранилище — iostat, iotop. Задержки восстановления — top, pg_stat_activity. Большой объем WAL: ● pg_stat_activity, pg_stat_progress_vacuum; ● pg_wal_lsn_diff().
  • 30. Варианты решения Проблемы на уровне сети/хранения: ● Проверить workload — запросы, миграции, CRUD. ● upgrade hardware?
  • 31. Варианты решения Задержки восстановления: ● Стрелять долгие запросы на реплике; ● Либо просто ждать.
  • 32. Варианты решения Большой объем WAL: ● Уменьшить объем «изменений» в БД в единицу времени; ● Уменьшить объем записи в WAL в целом: ● full_page_writes = of; ● Увеличить интервал между чекпоинтами.
  • 33. Проблемы репликации Лаги репликации. Распухание pg_wal/. Долгие запросы и конфликты при восстановлении. Recovery process: 100% CPU usage.
  • 34. Распухание pg_wal/ Основные симптомы: ● Непредсказуемый рост использования дискового пространства; ● Ненормальный размер pg_wal/ каталога.
  • 35. Распухание pg_wal/ Как обнаружить? ● du -csh; ● pg_replication_slots, pg_stat_archiver; ● Ошибки в postgres'овых логах.
  • 36. Распухание pg_wal/ Варианты проблем: ● Тяжелый CRUD. ● Забытый или неиспользуемый слот репликации. ● Сломанная archive_command.
  • 37. Распухание pg_wal/ Экстренные меры (100% used space) ● Отстрелить долгие CRUD запросы — pg_terminate_backend(); ● Уменьшить reserved space ratio (ext filesystems); ● Добавить еще места (LVM, ZFS, etc);
  • 38. Распухание pg_wal/ Экстренные меры (100% used space) ● Отстрелить долгие CRUD запросы — pg_terminate_backend(); ● Уменьшить reserved space ratio (ext filesystems); ● Добавить еще места (LVM, ZFS, etc); ● НИКОГДА НИЧЕГО НЕ УДАЛЯТЬ РУКАМИ ИЗ pg_xlog/, pg_wal/
  • 39. Распухание pg_wal/ Что делать дальше: ● Снова проверить workload — CRUD. ● Состояние репликации. ● Уменьшить checkpoints_segments/max_wal_size, wal_keep_segments; ● Удалить слот репликации или починить подписчика; ● Починить WAL archiving; checkpoint, checkpoint, cheсkpoint...
  • 40. Проблемы репликации Лаги репликации. Распухание pg_wal/. Долгие запросы и конфликты при восстановлении. Recovery process: 100% CPU usage.
  • 41. Конфликты восстановления Основные симптомы — ошибки в логах постгреса или приложения. ● User was holding shared bufer pin for too long. ● User query might have needed to see row versions that must be removed. ● User was holding a relation lock for too long. ● User was or might have been using tablespace that must be dropped. ● User transaction caused bufer deadlock with recovery. ● User was connected to a database that must be dropped.
  • 42. Проблемы репликации Как обнаружить: ● pg_stat_databases, pg_stat_databases_conflicts; ● postgresql logs.
  • 43. Проблемы репликации Когда это действительно становится проблемой: ● Отмена запросов происходит слишком часто; ● Большой лаг репликации.
  • 44. Проблемы репликации Решения: ● Увеличить max_standby_streaming_delay (риск лага репликации); ● Включить hot_standby_feedback (риск распухания таблиц/индексов); ● Переписать долгие запросы; ● Настроить выделенную реплику для долгих запросов.
  • 45. Проблемы репликации Лаги репликации. Распухание pg_wal/. Долгие запросы и конфликты при восстановлении. Recovery process: 100% CPU usage.
  • 46. Задержка восстановления Основные симптомы: ● Значительный «replay» лаг; ● 100% утилизация CPU процессом recovery.
  • 47. Задержка восстановления Как обнаружить? ● top — CPU usage; ● pg_stat_replication — replay лаг.
  • 48. Задержка восстановления Что и как искать: ● perf top/record/report (требуются debug–пакеты); ● GDB; ● pg_waldump.
  • 49. Задержка восстановления Решения: ● Зависят от результатов расследования; ● Устранение проблемного workload (как правило).
  • 50. План Немного теории или как работает постгресовая репликация. Troubleshooting tools или что есть у PostgreSQL и сообщества. Troubleshooting cases — проблемы, симптомы и диагностика. Итоги, вопросы — ответы.
  • 51. Итоги Проблемы потоковой репликации всегда распределены между хостами Источниками проблем выступают: ● Недостаток ресурсов, запросы, workload. Без мониторинга никак. Встроенные средства нужно знать и уметь.
  • 52. Links PostgreSQL official documentation – The Statistics Collector https://www.postgresql.org/docs/current/static/monitoring-stats.html PostgreSQL Mailing Lists (general, performance, hackers) https://www.postgresql.org/list/ PostgreSQL-Consulting company blog http://blog.postgresql-consulting.com Эти слайды: https://www.slideshare.net/alexeylesovsky/presentations