Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Мониторинг Opensource СУБД

Мониторинг Opensource СУБД

глазами обычного программиста, раскрываю свое видение мониторинга сервера СУБД

Eugene Klimov

April 16, 2018
Tweet

More Decks by Eugene Klimov

Other Decks in Programming

Transcript

  1. Какой подход в мониторинге СУБД вообще? • Важно помнить, что

    каждый запрос к СУБД за время своей жизни проходит через несколько подсистем и потребляет какое то кол-во ресурсов (CPU, MEM, DISK, NETWORK) • Важно чтобы ресурсы для всех запросов были сбалансированы, а утилизация их была оптимальна, т.е. ресурсов либо должно быть в избытке, либо постоянно надо искать баланс между нагрузкой и утилизацией ресурсов! • Невозможно нормально мониторить «здоровье» СУБД не понимая как она устроена изнутри и не понимая бизнес логику приложения которое с ним работает
  2. Инструменты мониторинга MySQL – лучший инструмент Напильник ;( • Zabbix

    + 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
  3. Что мониторить в MySQL - UPTIME + Репликация • Доступность

    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
  4. Что мониторить в MySQL – Коннекты • SHOW GLOBAL STATUS

    1 раз в минуту Threads_running / Threads_connected < 0.1 OR > 0.95 WARNING Diff(Threads_created) / Threads_cached > 1 – WARNING (нужен тюнинг threads_cache_size) Diff(Aborted_connects) / Diff(Connections) > 0.01 WARNING Diff(Aborted_clients) > 0 – WARNING – см. логи приложения Diff(Connection_errors%) > 0 – WARNING – см. логи приложения
  5. Что мониторить MySQL – Запись SHOW GLOBAL STATUS 1 раз

    в минуту • 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 – похоже мы круто массово «изменяем данные»
  6. Что мониторить MySQL – Чтение SHOW GLOBAL STATUS – 1

    раз в минуту • 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
  7. Что мониторить MySQL – Order By \ Group By SHOW

    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
  8. Что мониторить MySQL – Deadlocks и Запросы вообще SHOW INNODB

    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
  9. Инструменты мониторинга PostgreSQL лучший инструмент опять напильник =( Zabbix •

    https://github.com/postgrespro/mamonsu (есть алерты, но маловато) • https://github.com/pg-monz/pg_monz (китайцы) • https://monitoringartist.github.io/zabbix-searcher/#postgres (есть пара хороших) Standalone • https://github.com/cybertec-postgresql/pgwatch2/ (InfluxDb, нет алертов из коробки, но графики хорошие, умеет pgBouncer) • https://github.com/dalibo/pgbadger (анализ логов, мне не нравится интерфейс) • https://dalibo.github.io/powa/ (нормальный Query Analytics, но нет алертов) • https://github.com/ankane/pghero (ruby, IMHO немного скомкано) Prometheus • http://git.cbaines.net/prometheus-pgbouncer-exporter/about https://github.com/UnitedTraders/ansible-postgresql-exporter https://github.com/wrouesnel/postgres_exporter JSON - https://pgmetrics.io Платные http://okmeter.io, http://24mon.ru, http://pgdash.io
  10. Что мониторить в PostgreSQL UPTIME / репликация UPTIME • SELECT

    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
  11. Что мониторить в PostgreSQL Коннекты SELECT state, count(*) AS conns

    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
  12. Что мониторить в PostgreSQL Чтение – WARNING триггеры Эффективность shared

    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;
  13. Что мониторить в PostgreSQL Запись • DISASTER на SELECT failed_count

    FROM pg_stat_archiver • WARNING на SELECT checkpoints_req FROM pg_catalog.pg_stat_bgwriter > X, с рекомендацией увеличить max_wal_size
  14. Что мониторить в PostgreSQL Временные файлы WARNING триггер на увеличение

    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
  15. Что мониторить в PostgreSQL Vacuum Vacuum может не работать, если

    есть долгие незакрытые транзакции (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
  16. Что мониторить в PostgreSQL Дедлоки • SELECT datname, deadlocks FROM

    pg_stat_database HIGH Триггер со ссылками на тюнинг deadlock_timeout, log_lock_waits, max_locks_per_transaction и т.п.
  17. Что мониторить в PostgreSQL - Запросы pg_stat_statements • https://habrahabr.ru/company/okmeter/blog/311028/ Не

    забудьте правильно настроить трекинг 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
  18. Инструменты мониторинга Clickhouse Prometheus • https://github.com/f1yegor/clickhouse_exporter https://grafana.com/dashboards?search=Clickhouse select * from

    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
  19. Что мониторить в ClickHouse - запись • CH должен вставлять

    большими кусками! 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
  20. Что мониторить в ClickHouse - чтение • Кеш на чтение

    файлы «засечек» - WARNING Diff(Clickhouse.ProfileEvents.MarkCacheHits) / Diff(Clickhouse.ProfileEvents.MarkCacheMisses+Clickhouse.ProfileEve nts.MarkCacheHits) < 0.9 • Кеш Dictionary – WARNING Diff(ClickHouse.ProfileEvents.DictCacheKeysRequestedMiss) / Diff(ClickHouse.ProfileEvents.DictCacheKeysRequested) > 0.05 • Расхождение данных между словарями и таблицей фактов – HIGH Diff(ClickHouse.ProfileEvents.DictCacheKeysNotFound)/ Diff(ClickHouse.ProfileEvents.DictCacheKeysRequestedFound) > 0.1
  21. Что мониторить в ClickHouse - Репликация • ClickHouse.AsynchronousMetrics.ReplicasMaxAbsoluteDelay > X

    • ClickHouse.AsynchronousMetrics.ReplicasMaxQueueSize > X Можно попробовать вешать AVERAGE триггер «медленныая репликация»
  22. Что мониторить в ClickHouse - запросы • Плагин для grafana

    https://github.com/Vertamedia/clickhouse-grafana • Dashboard https://grafana.com/dashboards/2515 Можно попробовать вешать триггер «медленные SELECT»
  23. Инструменты мониторинга MongoDb • https://docs.mongodb.com/manual/administration/monitoring/ Prometheus • http://pmmdemo.percona.com (лучшие графики)

    Zabbix • https://monitoringartist.github.io/zabbix-searcher/#mongo • https://github.com/marcanpilami/mongodb-collector Триггеров нормальных я не знаю, слишком мало работал
  24. Что мониторить в MongoDb - кратко • Утилизация коннектов и

    их состояние • Кеш на чтение • Длину очереди на запись (checkpoint time и checkpoint frequency) • Replication Lag