каждый запрос к СУБД за время своей жизни проходит через несколько подсистем и потребляет какое то кол-во ресурсов (CPU, MEM, DISK, NETWORK) • Важно чтобы ресурсы для всех запросов были сбалансированы, а утилизация их была оптимальна, т.е. ресурсов либо должно быть в избытке, либо постоянно надо искать баланс между нагрузкой и утилизацией ресурсов! • Невозможно нормально мониторить «здоровье» СУБД не понимая как она устроена изнутри и не понимая бизнес логику приложения которое с ним работает
+ Percona Monitoring Plugins (PMP) – 1 раз в минуту https://github.com/percona/percona-monitoring-plugins – есть алерты но мало, «заморожено», но люди шлют PR, графики «кривоваты», но есть https://grafana.com/plugins/alexanderzobnin-zabbix-app , нет TokuDb и RocksDb • Prometheus + Percona Monitoring and Management (PMM) – 3 раза в минуту! https://github.com/percona/pmm - нет алертов (надо писать), но есть query analytics! Зато графики очень красивые и подробные, ProxySQL, TokuDb, RDS и т.п. пример «алертов» для PMM в сторонний Prometheus https://gist.github.com/spacentropy/371c5a5c0df1dd5ae37423b90e11ace9 • https://my-netdata.io/ - 1 раз в СЕКУНДУ!!! Карл ;) • Платные решения http://datadoghq.com, https://dev.mysql.com/doc/mysql- monitor/4.0/en/, http://okmeter.io, http://24mon.ru/, https://www.vividcortex.com/, https://www.webyog.com/product/monyog
tcp 3306 порта с разных локаций Наличие listen сокета, CPU, MEM, SWAP, DISK, NETWORK • SHOW GLOBAL STATUS – Uptime - DISASTER • SHOW SLAVE STATUS Replication status и replication lag, disaster alert https://www.slideshare.net/SvetaSmirnova/lessons-learned- troubleshooting-replication
в минуту • Diff(Handler_rollback) / Diff(Handler_commit) > 0.01 Diff(Handler_savepoint_rollback) / Diff(Handler_savepoint) > 0.01 см. Error log приложения почему rollback идут • Diff(Innodb_log_writes) / Diff(Innodb_log_write_requests) > 0.3 WARNING увеличить innodb_log_buffer_size и играться с adaptive flushing innodb_io_capacity_max и innodb_io_capacity, innodb_flush_trx_commit • Diff(Innodb_log_waits) > 0 – DISASTER логи не успевают писаться на диск! Diff(Innodb_os_log_pending_fsyncs) > 0 – DISASTER кто-то кроме mysql сожрал весь disk IO Diff(Innodb_os_log_pending_writes) > 0 – DISASTER кто-то кроме mysql сожрал весь disk IO пробуем менять innodb_flush_trx_commit 30 раз в минуту (см. my-netdata.io) Avg(Innodb_buffer_pool_pages_data / Innodb_buffer_pool_pages_dirty, 1m) > 0.5 – похоже мы круто массово «изменяем данные»
раз в минуту • Diff(Qcache_hits) / (Diff(Qcache_hits) + Diff(Com_select)) < 0.8 WARNING – отключите query_cache, все равно он IMHO бесполезен в большинстве кейсов (потому что инвалидируется при любом UPDATE таблицы ;) • Diff(Created_tmp_disk_tables) > 0 – WARNING пытаемся менять tmp_table_size и max_heap_table_size • Diff(Innodb_buffer_pool_reads) / Diff(Innodb_buffer_pool_read_requests) > 0.05 – WARNING данные перестают, надо пробовать несколько buffer_pool_instances • (Innodb_buffer_pool_pages_total - Innodb_buffer_pool_pages_free) / Innodb_buffer_pool_pages_total > 0.95 – Innodb pool Usage
GLOBAL STATUS – 1 раз в минуту Diff(Sort_rows) / Diff(Innodb_rows_read) > 0.5 – а не дофига ли у нас ORDER BY ? Diff(Sort_merge_passes) > 0 у нас случаются БОЛЬШИЕ сортировки, пробуем играться с read_rnd_buffer_size, max_sort_length, sort_buffer_size
ENGINE STATUS\G – 1 раз в минуту https://www.percona.com/doc/percona-toolkit/LATEST/pt-deadlock-logger.html SELECT * FROM performance_schema. events_statements_summary_by_digest 1 раз в минуту • https://pmmdemo.percona.com/ • https://github.com/box/Anemometer https://www.percona.com/doc/percona- server/LATEST/diagnostics/response_time_distribution.html Но лучше всего такие вещи делать на стороне приложения, через гистограммы с настраиваемыми бакетами https://prometheus.io/docs/concepts/metric_types/#histogram
date_part('epoch', now() - pg_postmaster_start_time()) Репликация • pg_stat_replication (можно посчитать лаг в байтах) • SELECT extract(epoch from now()-pg_last_xact_replay_timestamp()) Fix для mamonsu https://gist.github.com/Slach/017f12e8a9663f2d587f864e819f9726 Как решать проблемы с репликацией https://www.slideshare.net/alexeylesovsky/troubleshooting-postgresql- streaming-replication
FROM pg_catalog.pg_stat_activity GROUP BY state WARNING триггер на idle_in_transaction / total > 0.10 и idle / total < 0.05 Также надо мониторить fork-rate если вдруг у вас случайно нет pgBouncer И отдельно надо мониторить SHOW STATS в pgBouncer
buffers на чтение SELECT datname, round(sum(blks_hit)*100/sum(blks_hit+blks_read), 2) FROM pg_catalog.pg_stat_database GROUP BY datname Конкретные таблицы эффективность shared buffers SELECT schemaname, relname, ( (heap_blks_hit*100) / NULLIF((heap_blks_hit + heap_blks_read), 0)) AS table_cache_ratio, ( (idx_blks_hit*100) / NULLIF((idx_blks_hit + idx_blks_read), 0)) AS idx_cache_ratio, FROM pg_catalog.pg_statio_user_tables ORDER BY table_cache_ratio, idx_cache_ratio;
work_mem (осторожно бесконечно увеличивать нельзя) • Либо SELECT datname, temp_bytes FROM pg_stat_database • Либо log_temp_files=0 в конфиге + парсинг лог файла • Либо SELECT SUM(tmp_blks_read)+SUM(tmp_blks_write) FROM pg_catalog.pg_stat_statements
есть долгие незакрытые транзакции (idle in transaction) https://github.com/salsify/postgres-vacuum-monitor https://postgrespro.ru/docs/postgrespro/10/pgstattuple HIGH Триггер на то, что есть таблицы у которых dead tuples больше чем, установленный autovacuum_vacuum_threshold + pg_class.reltuples * autovacuum_vacuum_scale_factor и ссылкой на https://blog.2ndquadrant.com/autovacuum-tuning-basics/ pg_stat_progress_vacuum https://postgrespro.ru/docs/postgresql/9.6/progress-reporting.html придется писать код https://github.com/search?q=pg_stat_progress_vacuum&type=Code WARNING на то, что autovacuum занимает полностью все свободные autovacuum_worker_process
забудьте правильно настроить трекинг https://postgrespro.ru/docs/postgrespro/10/runtime-config-statistics https://postgrespro.ru/docs/postgrespro/10/pgstatstatements SELECT * FROM pg_stat_statements - 1 раз в минуту, хранить предыдущее состояние, считать дельту, дополнительно группировать не только по query digest id HIGH триггеры на top10 query по total_time diff(shared_blks_hit) / diff(shared_blks_read) < 0.9 – плохо попадаем в shared buffers diff(temp_blks_read) + diff(temp_blks_write) > 0 – плохо работают JOIN, ORDER BY, возможно надо увеличить work pg_badplan • https://github.com/trustly/pg_badplan мониторинг кол-ва файлов, alert - warning
system.metrics select * from system.asynchronous_metrics select * from system.events select database, table, sum(bytes) as bytes, count() as parts, sum(rows) as rows from system.parts where active = 1 group by database, table Graphite + Grafana + Moira – придется больше доделывать • <use_graphite>true</use_graphite> https://github.com/Slach/clickhouse-metrics-grafana
большими кусками! Diff(Clickhouse.ProfileEvents.InsertQuery) < XX Diff(ProfileEvents.InsertedRows) / Diff(ProfileEvents.InsertQuery) > 100000 • Diff(sum(Clickhouse.Evens.InsertedRows)) < XXX – скорее всего вы недогружаете CH или у вас «авария» в ETL • Diff(ClickHouse.ProfileEvents.ZooKeeperExceptions) > XXX – может разъехаться репликация • Read-only реплики SUM(ClickHouse.Metrics.ReadonlyReplica) > 0 – DISASTER • Diff(ClickHouse.ProfileEvents.DuplicateInsertedBlock) > 0 - WARING такое может быть если отвалилась реплика во время вставки в distributed таблицу • Diff(ProfileEvents.DelayedInserts) > 0 – WARNING • ClickHouse.AsynchronousMetrics.MaxPartCountForPartition > 250 – Мержи не успевают проходить, попробуйте сделать throttling нагрузки на запись, попробуйте OPTIMIZE TABLE, DETACH + ATTACH
Zabbix • https://monitoringartist.github.io/zabbix-searcher/#mongo • https://github.com/marcanpilami/mongodb-collector Триггеров нормальных я не знаю, слишком мало работал