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

MySQL глазами обычного программиста

MySQL глазами обычного программиста

обзорный доклад, по внутреннему устройству и эксплуатации MySQL

Avatar for Eugene Klimov

Eugene Klimov

April 07, 2018
Tweet

More Decks by Eugene Klimov

Other Decks in Programming

Transcript

  1. Под какой тип нагрузки оптимизирован MySQL? Изначально для OLTP -

    т.е. «часто» пишем и «часто читаем», «малыми порциями» данных https://ru.wikipedia.org/wiki/OLTP Есть некоторые подвижки сторону OLAP («тяжелые» выборки с GROUP BY, ORDER BY и JOIN) https://mariadb.com/kb/en/library/mariadb-columnstore/ Быстрая batch вставка через LOAD DATA https://dev.mysql.com/doc/en/load-data.html
  2. Вопросы залу Чем thread отличается от process? Чем LEFT JOIN

    отличается от INNER JOIN? Чем sharding отличается от partioning?
  3. Как MySQL «хранит» данные в InnoDB? • Данные разбиты на

    «страницы» 16Kb • Внутри страниц «строки» целиком • Отдельные страницы для «вторичных индексов» и для «больших полей (BLOB, JSON, TEXT) • Страницы с данными строки «упорядочены» по clustered index (primary key, first unique key или internal 6 bytes index) Подробнее https://dev.mysql.com/doc/refman/5.7/en/innodb- physical-record.html
  4. Как MySQL «пишет» данные в InnoDB? • Любые изменения сначала

    делаются в «странице» памяти см. innodb_buffer_pool, чтобы сделать delete или update страницу надо прочитать (см. innodb_read_io_threads) • Параллельно «изменения» формируются в log buffer (в памяти) • Log buffer скидывается на диск в ib_logdata при каждом commit, либо при заполнении, либо 1 раз в секунду см. innodb_flush_at_trx_commit • Параллельно в фоне через «thread pool» (размер ограничен innodb_write_io_threads) + O_DIRECT (чтобы) делается «сброс» в <table_name>.ibd (ibdata) в double write buffer
  5. Как MySQL «читает» данные? • Из текста запроса SQL определяются

    индексы и таблицы из которых будет произведено чтение • Чтение идет с диска через O_DIRECT «страницами» (16kb) и кешируется в buffer pool (если страница уже в памяти, то нет смысла читать ее второй раз) • Чтение из clustered\secondary индекса «по значению» = O(log n) дисковых операций где n общее кол-во «страниц» • Для «страниц данных» даже если вам нужно 1 поле из 100, прочитается вся строка
  6. Как MySQL обрабатывает много запросов «одновременно»? • Отдельный Thread на

    каждый коннект, можно оптимизировать через thread_cache_size и back_log • Innodb\Xtradb storage engine использует свой thread pool для «чтения» и «записи» настраивается через innodb_io_write_threads и innodb_io_read_threads (пропорционально возможностям диска и кол-ву ядер) • Есть отдельный механизм thread pools в Mariadb и Percona, для узких специализированных видов нагрузки
  7. Как «мониторить» MySQL? • https://www.percona.com/downloads/percona-monitoring- plugins/LATEST/ • https://www.percona.com/software/database-tools/percona-monitoring- and-management DISASTER

    триггеры - репликация running status, replication lag - 90% connection usage - low innodb cache hit rate - deadlocks - high CPU\Memory usage - high iowait, high disk utilization
  8. Как «отлаживать» MySQL «на живую»? • SHOW FULL PROCESSLIST; •

    SELECT * FROM threads WHERE PROCESSLIST_COMMAND=‘Query’ ORDER BY PROCESSLIST_TIME DESC; • tcpdump -i any -w mysql.pcap port 3306 pt-query-digest –type tcpdump mysql.pcap • slow_log=1 long_query_time=1 log-queries-not-using-indexes=1 pt-query-digest –type slowlog /var/log/mysql/slowlog.log • https://gist.github.com/benders/114299 - Unused indexes • Query response time distribution https://www.percona.com/doc/percona- server/5.7/diagnostics/response_time_distribution.html
  9. Как обновлять «схему данных» в MySQL? • https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl.html • https://www.percona.com/doc/percona-toolkit/LATEST/pt-online-schema-change.html

    triggers+INSERT INTO SELECT, плохо работает если таблица сильно нагружена, прерывание в середине процесса опасно, нельзя использовать foreign keys и triggers, написано на perl • https://github.com/github/gh-ost ROW binary log (меньше нагрузка), но foreign key и triggers все равно нельзя (может сделают), вместо RENAME – LOCK TABLE, нельзя NULL в индексах, не поддерживается JSON • https://github.com/facebookincubator/OnlineSchemaChange triggers + SELECT INTO OUTFILE\LOAD DATA, запускается на мастере, python – можно попробовать использовать как библиотеку для миграций • https://github.com/skeema/skeema используется в связке с pt-online-schema-change, тоже куча ограничений • https://dev.mysql.com/doc/mysql-utilities/1.6/en/mysqldbcompare.html мало кто вспоминает, но может даже INSERT данных
  10. Как обновлять версию MySQL • Downgrade – очень больно, оно

    вам точно нужно? ;) • Основной алгоритм – логическая репликация + mysql_upgrade + failover proxy • https://www.slideshare.net/freshdaz/upgrade-to-mysql-56-without- downtime • https://www.percona.com/doc/percona-toolkit/LATEST/pt- upgrade.html DEMO stand • https://bitbucket.org/production_databases/mysql_live_upgrade
  11. Как делать backup в MySQL? xtrabackup • https://github.com/ShahriyarR/MySQL-AutoXtraBackup • https://github.com/dotmanila/pyxbackup

    • https://blog.pythian.com/mysql-encrypted-streaming-backups-directly- aws-s3/ если хочется stream+s3/google cloud через pipes mysqldump • https://github.com/sixhop/AutoMySQLBackup Tokudb • https://github.com/markwardt-pythian/tokubackup_wrapper LVM • http://www.lenzg.net/mylvmbackup/
  12. Как делать «отказоустойчивость» в MySQL? Master-slave • https://vitess.io/user-guide/introduction/ • https://github.com/github/orchestrator

    • https://github.com/signal18/replication-manager Master-Master • http://galeracluster.com/ • https://www.percona.com/doc/percona-xtradb-cluster/LATEST/manual/ • https://dev.mysql.com/doc/refman/5.7/en/group-replication.html Master-slave failover «ручками» • https://dev.mysql.com/doc/mysql-utilities/1.6/en/mysqlrpladmin.html
  13. Как делать «sharding» в MySQL? Лучше всего делать руками в

    приложении (особенно решардинг) • https://vitess.io/user-guide/sharding/ • https://www.percona.com/blog/2016/08/30/mysql-sharding-with- proxysql/ • https://mariadb.com/resources/blog/schema-sharding-mariadb- maxscale-21-part-1 - платно после 3х серверов ;) • https://github.com/flike/kingshard (golang+китайцы) • https://github.com/actiontech/dble (java)