SlideShare uma empresa Scribd logo
1 de 24
Open-source СУБД глазами
обычного программиста
Chelyabinsk Python Meetup #2
Eugene Klimov aka Slach
https://t.me/bloodjazman
С какими системами я работал
OLTP SQL – MySQL, PostgreSQL, MSSQL, Firebird
OLAP – MS OLAP (мало)
Колоночные – Vertica, Clickhouse
NoSQL – Redis (много), MongoDb (мало), Tarantool (очень мало)
По каким граблям ходят разработчики всех
СУБД ;) RUM теорема
R (read) U (update) M (memory) overheads
Что должен знать «обычный» программист
про используемые СУБД
Алгоритмы
•Как БД «пишет», «хранит» и «читает» данные?
•Под какой тип нагрузки оптимизирована БД?
•Как обрабатывается конкурентный доступ к
данным?
Что должен знать «обычный» программист
про используемые СУБД
Эксплуатация
• Насколько легко эту БД «мониторить» и «отлаживать»?
• Насколько легко эту БД «обновлять»?
• Насколько легко изменять «схему данных» в данной БД?
• Насколько стабильны драйверы БД в вашем языке?
• Как сделать горизонтальное масштабирование?
Как БД «пишет», «хранит» и «читает» данные?
MySQL, PostgreSQL – нагрузка OLTP
• Запись
mem buffer -> transaction log (innodblog, WAL) -> table space
(innodbdata, base)
• Хранение - «страницы» в них «строки (tuples)» (целиком)
отдельные страницы для «индексов»
отдельные страницы для «жирных столбцов» (BLOB, JSON, any
extended storage)
• Чтение - постранично в память, cache в памяти «для горячих данных»
MySQL - innodb buffer pool + O_DIRECT
Postgres – shared buffers + кеш средствами OS
сортирует и фильтрует в одном ядре (почти всегда ;)
Как БД «пишет», «хранит» и «читает» данные?
Clickhouse – нагрузка OLAP
• Запись
«пишет пачками по XXX записей» сразу на диск
входные данные в «большие» (1M на столбец) буфера в памяти и потом в
каждый столбец отдельно, без transaction log
• Хранение
каждый столбец отдельно и сжато (zstd), нет дельта-кодирования для чисел
(скоро будет), данные разбиты по «партициям» и «отсортированы по первичному
ключу» (легче фильтровать), «новые данные» сливаются со старыми в фоновом
режиме
• Чтение
- большими кусками последовательно, кеширует средствами OS, сортировка и
группировка много ядер (потоки)
Как БД «пишет», «хранит» и «читает» данные?
Redis – in-memory OLTP
• Запись
каждая команда изменяющая данные (кроме PUBSUB) сразу в память и в AOF
файл (если включен)
• Чтение - Глобальная «хеш» таблица
«читает» только из памяти
• Хранение
«хранит» AOF файл, либо > Fork -> Copy on write -> RDB файл
• Есть disk based аналоги - http://ssdb.io/, https://github.com/yinqiwen/ardb
Как БД «пишет», «хранит» и «читает» данные?
MongoDb – OLTP schema less
• Запись
сначала в буфер в памяти -> паралельно WAL + Document Storage (сжатие)
• Хранение
«страницы» в них версии документов + «вторичные индексы»
• Чтение
- кеш в памяти (в памяти тоже сжатие) + файловый кеш OS
Как обрабатывается
конкурентный доступ к данным?
MySQL – thread per connect (+отдельный accept thread) + storage thread pool
PostgreSQL – process per connect (+ auto vacuum)
ClickHouse – thread pool per connect
Redis – single thread to all connection
Mongodb – thread per connect
Насколько легко эту БД «мониторить» и
«отлаживать»?
«Мониторить» легко в принципе всех, инструментов много
Лично мой выбор это Prometheus
Mongo + MySQL https://www.percona.com/software/database-tools/percona-monitoring-and-
management
PostgreSQL http://dalibo.github.io/powa/
Clickhouse https://github.com/f1yegor/clickhouse_exporter
Redis https://github.com/oliver006/redis_exporter
«Отлаживать» уже гораздо сложнее, но инструменты тоже есть
УЧИТЕ EXPLAIN!!!
MySQL Performance Schema
PostgreSQL pg_stat_activity, pg_stat_statement
Redis https://github.com/facebookarchive/redis-faina
https://github.com/gamenet/redis-memory-analyzer
Больше всего не хватает возможности через драйвер вставить место в коде где идет «вызов
запроса»
Насколько легко эту БД «обновлять»?
Обновляться «сложно», но можно ;)
Самое сложное обновлять все БД без «downtime» и без «dump/restore» да еще и
желательно на одной машине
MySQL – логическая репликация + mysql_upgrade
PostgreSQL – pglogical + pg_upgrade
Clickhouse – apt-get upgrade
Redis – apt-get upgrade
MongoDb – после 3.x версии apt-get upgrade сначала для secondary, потом primary
нод, без ReplicaSet
Насколько легко изменять
«схему данных» в БД?
• MySQL – pt-online-schema-change
• PostgreSQL – CREATE INDEX CONCURENTLY + ALTER TABLE бесплатен
для DEFAULT NULL
• Redis – схему ключей надо менять руками
• Clickhouse – ALTER TABLE бесплатен, но ограничен по функционалу
• Mongodb – schema less из коробки, но схему документов все равно
надо «дизайнить»
Насколько стабильны драйверы БД в Python?
Чтобы оценить обычно я иду в github для соответсвующего
драйвера и смотрю issues и history
В python с драйверами все хорошо ;) С багами в них тоже ;)
• MySQL – MySQLdb, aiomysql
• PostreSQL – psycodb2, aiopg
• Clickhouse – clickhouse-driver, aioch
• Redis – драйверов вагон ;)
• MongoDb – pymongo
Как сделать горизонтальное масштабирование?
На самом деле ответ 42 или k8s ;)
• MySQL – http://github.com/youtube/vitess/
• PostgreSQL – https://github.com/zalando/patroni
• Clickhouse https://github.com/count0ru/k8s-clickhouse
• Redis - https://github.com/sobotklp/kubernetes-redis-cluster
• MongoDb – http://k8smongodb.net
Грабли на которые наступал я - MySQL
• row based репликация + mysql_upgrade + xtrabackup
• Single Thread MySQL Replication – LAG
• «сломанная репликация» при ротации binlog
• GROUP BY упирающийся в одно ядро
• Включайте innodb_file_per_table
• Осторожнее с innodb_flush_log_at_trx_commit
• Осторожнее с sort_buffer
• Поймите что такое data cardinality и не пытайтесь мучить индекс ;)
Грабли на которые наступал я - PostgreSQL
• Ломается Streaming Replication – max_wal_size и replication slots
• Autovacuum vs JSONB размером в 1Mb
• Берегите pg_xlog также как base ;)
• Wal-e + swift – восстановление в один поток
• pgbouncer pause – «не савсем pause»
• Patroni гибче чем repmgr
• «Длинный SELECT» на standby - max_standby_streaming_delay один
на всех
• Учитесь правильно считать размер shared_buffers
• GROUP BY в один поток
Грабли на которые я наступал - Redis
• Не допускайте ситуации когда «все ломятся в один ключ»
• Не пытайтесь хранить больше 2-5kb на ключ
• На 32G и выше лучше 4 ноды по 8Gb чем 1 по 32G
• Пользуйтесь KEYS только в самом крайнем случае
• Смотрите «сложность алгоритмов» в документации
• PUBSUB – не очень эффективен по памяти, не пытайтесь через него
гонять данные (чат), только id и не пиками
• AOF может ломаться и это надо отдельно мониторить
• Twemproxy и Codis – стоит присмотреться
Грабли на которые я наступал в Clickhouse
• Не работает с zetcd ;)
https://github.com/yandex/ClickHouse/issues/777
• «Большие буфера» на вставку
https://github.com/yandex/ClickHouse/issues/868
• Репликация «асинхронная», данные до некоторых реплик могут
доехать не сразу
• Float32, Float64 – это не numeric с фиксированной точностью
https://github.com/yandex/ClickHouse/issues/1665
Как выбрать СУБД?
Прежде всего поймите какой у вас тип нагрузки в приложении!
Могут быть разные типы нагрузки в разных частях приложения.
Значит нужны РАЗНЫЕ СУБД!
Ответьте на вопросы:
Чего больше? Чтения или записи?
При чтении данные должны быть актуальны?
При чтении данные группируются? Сортируются? Фильтруются?
Сколько данных читается за один запрос?
Сколько данных пишется за один запрос?
Как долго нам хватит диска по размеру? и т.д. и т.п.
ORM vs Plain SQL
• за «Object Mapping» приходится платить
• IMHO Raw SQL просто надо сделать “prepared” и вынести в
классы моделей
Логика в Базе данных
• В SQL сложную логику писать «не очень» и надо научиться
«обновлять stored процедуры»
• Но вот есть tarantool и там через Lua очень хорошо реализован
hot reload lua кода
• Для «чтения» есть Materialized View и Temporary Tables, но это
«дорого» и может быть по Space и Write
Вопросы из зала?
Пара ссылок на последок
https://github.com/onurakpolat/awesome-bigdata
https://github.com/igorbarinov/awesome-data-engineering
Со мной можно связаться
bloodjazman@gmail.com
https://t.me/bloodjazman

Mais conteúdo relacionado

Mais procurados

2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)Nikolay Samokhvalov
 
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...Anton Baranov
 
Бинарные (файловые) хранилища- страшная сказка с мрачным концом
Бинарные (файловые) хранилища- страшная сказка с мрачным концомБинарные (файловые) хранилища- страшная сказка с мрачным концом
Бинарные (файловые) хранилища- страшная сказка с мрачным концомDaniel Podolsky
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Ontico
 
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)Ontico
 
Why we did not choose Hadoop
Why we did not choose HadoopWhy we did not choose Hadoop
Why we did not choose HadoopSerguei Gitinsky
 
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...Ontico
 
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...Ontico
 
Загрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитикиЗагрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитикиBadoo Development
 
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)Ontico
 
Владимир Бородин - PostgreSQL
Владимир Бородин - PostgreSQLВладимир Бородин - PostgreSQL
Владимир Бородин - PostgreSQLYandex
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsDaniel Podolsky
 
Как устроен поиск
Как устроен поискКак устроен поиск
Как устроен поискAndrew Aksyonoff
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Ontico
 
Cоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetCоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetOleg Tsarev
 
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)Ontico
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхSveta Smirnova
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеAlexandr Krasheninnikov
 

Mais procurados (19)

2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
 
Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...Организация надежного резервного копирования веб-проекта. Практика и подводны...
Организация надежного резервного копирования веб-проекта. Практика и подводны...
 
Бинарные (файловые) хранилища- страшная сказка с мрачным концом
Бинарные (файловые) хранилища- страшная сказка с мрачным концомБинарные (файловые) хранилища- страшная сказка с мрачным концом
Бинарные (файловые) хранилища- страшная сказка с мрачным концом
 
Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)Где живут Ваши объявления / Тюрин Михаил (Avito)
Где живут Ваши объявления / Тюрин Михаил (Avito)
 
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
Sphinx 3.0, поиск 15 лет спустя / Андрей Аксенов (Sphinx)
 
Why we did not choose Hadoop
Why we did not choose HadoopWhy we did not choose Hadoop
Why we did not choose Hadoop
 
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
 
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Моск...
 
Загрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитикиЗагрузка больших объемов данных для бизнес-аналитики
Загрузка больших объемов данных для бизнес-аналитики
 
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
 
Владимир Бородин - PostgreSQL
Владимир Бородин - PostgreSQLВладимир Бородин - PostgreSQL
Владимир Бородин - PostgreSQL
 
RTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwordsRTB DSP на языке Go: укрощение buzzwords
RTB DSP на языке Go: укрощение buzzwords
 
Как устроен поиск
Как устроен поискКак устроен поиск
Как устроен поиск
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
 
pgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresqlpgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresql
 
Cоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTargetCоциальный граф "Одноклассников" в myTarget
Cоциальный граф "Одноклассников" в myTarget
 
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)RTB DSP на языке Go укрощение buzzwords /  Даниил Подольский (Qmobi.Com)
RTB DSP на языке Go укрощение buzzwords / Даниил Подольский (Qmobi.Com)
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
 
Near-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проектеNear-realtime аналитика событий в высоконагруженном проекте
Near-realtime аналитика событий в высоконагруженном проекте
 

Semelhante a Open source субд глазами обычного программиста

Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновOntico
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, ParallelsNikolay Samokhvalov
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrusAlex Chistyakov
 
Top-10 популярных вопросов администраторам баз данных или почему я против св...
Top-10  популярных вопросов администраторам баз данных или почему я против св...Top-10  популярных вопросов администраторам баз данных или почему я против св...
Top-10 популярных вопросов администраторам баз данных или почему я против св...Ilya Kosmodemiansky
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
 
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)Ontico
 
Aлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreetAлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreetOntico
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ontico
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Oleg Tsarev
 
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...Ontico
 
My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014Alex Chistyakov
 
Пётр Зайцев, Percona
Пётр Зайцев, PerconaПётр Зайцев, Percona
Пётр Зайцев, PerconaOntico
 
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)Ontico
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеit-people
 
High load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rusHigh load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rusVladd Ev
 
Как устроен NoSQL, Андрей Аксенов (Sphinx)
Как устроен NoSQL, Андрей Аксенов (Sphinx)Как устроен NoSQL, Андрей Аксенов (Sphinx)
Как устроен NoSQL, Андрей Аксенов (Sphinx)Ontico
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Ontico
 
Диагностика postgresql для системного администратора
Диагностика postgresql для системного администратораДиагностика postgresql для системного администратора
Диагностика postgresql для системного администратораNikolay Sivko
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Ontico
 

Semelhante a Open source субд глазами обычного программиста (20)

Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels2014.12.23 Александр Андреев, Parallels
2014.12.23 Александр Андреев, Parallels
 
Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
Top-10 популярных вопросов администраторам баз данных или почему я против св...
Top-10  популярных вопросов администраторам баз данных или почему я против св...Top-10  популярных вопросов администраторам баз данных или почему я против св...
Top-10 популярных вопросов администраторам баз данных или почему я против св...
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
 
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
 
Aлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreetAлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreet
 
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
Ускоряем и разгружаем веб-сервер, прозрачно кэшируя на SSD, Станислав Николов...
 
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
Асинхронная репликация без цензуры: архитектурные проблемы MySQL, или почему ...
 
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...Устройство современного распределенного Object Storage на примере LeoFS, Алек...
Устройство современного распределенного Object Storage на примере LeoFS, Алек...
 
My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014My talk on LeoFS, Highload++ 2014
My talk on LeoFS, Highload++ 2014
 
Пётр Зайцев, Percona
Пётр Зайцев, PerconaПётр Зайцев, Percona
Пётр Зайцев, Percona
 
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
Асинхронная репликация без цензуры, Олег Царёв (Mail.ru Group)
 
Pgconfru 2015 kosmodemiansky
Pgconfru 2015 kosmodemianskyPgconfru 2015 kosmodemiansky
Pgconfru 2015 kosmodemiansky
 
ekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилищеekbpy'2012 - Данила Штань - Распределенное хранилище
ekbpy'2012 - Данила Штань - Распределенное хранилище
 
High load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rusHigh load2007 scaling-web-applications-rus
High load2007 scaling-web-applications-rus
 
Как устроен NoSQL, Андрей Аксенов (Sphinx)
Как устроен NoSQL, Андрей Аксенов (Sphinx)Как устроен NoSQL, Андрей Аксенов (Sphinx)
Как устроен NoSQL, Андрей Аксенов (Sphinx)
 
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
Как считать и анализировать сотни гигабит трафика в секунду, Станислав Николо...
 
Диагностика postgresql для системного администратора
Диагностика postgresql для системного администратораДиагностика postgresql для системного администратора
Диагностика postgresql для системного администратора
 
Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)Распространенные ошибки применения баз данных (Сергей Аверин)
Распространенные ошибки применения баз данных (Сергей Аверин)
 

Mais de Slach

Sampling profiling
Sampling profilingSampling profiling
Sampling profilingSlach
 
мониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonмониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonSlach
 
мониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBAмониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBASlach
 
phpConf 2010 Классификация систем хранения
phpConf 2010 Классификация систем храненияphpConf 2010 Классификация систем хранения
phpConf 2010 Классификация систем храненияSlach
 
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXMLSlach
 
Php Conf2007 Mapscript
Php Conf2007 MapscriptPhp Conf2007 Mapscript
Php Conf2007 MapscriptSlach
 

Mais de Slach (6)

Sampling profiling
Sampling profilingSampling profiling
Sampling profiling
 
мониторинг производительности Web приложений на python
мониторинг производительности Web приложений на pythonмониторинг производительности Web приложений на python
мониторинг производительности Web приложений на python
 
мониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBAмониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBA
 
phpConf 2010 Классификация систем хранения
phpConf 2010 Классификация систем храненияphpConf 2010 Классификация систем хранения
phpConf 2010 Классификация систем хранения
 
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXML
 
Php Conf2007 Mapscript
Php Conf2007 MapscriptPhp Conf2007 Mapscript
Php Conf2007 Mapscript
 

Open source субд глазами обычного программиста

  • 1. Open-source СУБД глазами обычного программиста Chelyabinsk Python Meetup #2 Eugene Klimov aka Slach https://t.me/bloodjazman
  • 2. С какими системами я работал OLTP SQL – MySQL, PostgreSQL, MSSQL, Firebird OLAP – MS OLAP (мало) Колоночные – Vertica, Clickhouse NoSQL – Redis (много), MongoDb (мало), Tarantool (очень мало)
  • 3. По каким граблям ходят разработчики всех СУБД ;) RUM теорема R (read) U (update) M (memory) overheads
  • 4. Что должен знать «обычный» программист про используемые СУБД Алгоритмы •Как БД «пишет», «хранит» и «читает» данные? •Под какой тип нагрузки оптимизирована БД? •Как обрабатывается конкурентный доступ к данным?
  • 5. Что должен знать «обычный» программист про используемые СУБД Эксплуатация • Насколько легко эту БД «мониторить» и «отлаживать»? • Насколько легко эту БД «обновлять»? • Насколько легко изменять «схему данных» в данной БД? • Насколько стабильны драйверы БД в вашем языке? • Как сделать горизонтальное масштабирование?
  • 6. Как БД «пишет», «хранит» и «читает» данные? MySQL, PostgreSQL – нагрузка OLTP • Запись mem buffer -> transaction log (innodblog, WAL) -> table space (innodbdata, base) • Хранение - «страницы» в них «строки (tuples)» (целиком) отдельные страницы для «индексов» отдельные страницы для «жирных столбцов» (BLOB, JSON, any extended storage) • Чтение - постранично в память, cache в памяти «для горячих данных» MySQL - innodb buffer pool + O_DIRECT Postgres – shared buffers + кеш средствами OS сортирует и фильтрует в одном ядре (почти всегда ;)
  • 7. Как БД «пишет», «хранит» и «читает» данные? Clickhouse – нагрузка OLAP • Запись «пишет пачками по XXX записей» сразу на диск входные данные в «большие» (1M на столбец) буфера в памяти и потом в каждый столбец отдельно, без transaction log • Хранение каждый столбец отдельно и сжато (zstd), нет дельта-кодирования для чисел (скоро будет), данные разбиты по «партициям» и «отсортированы по первичному ключу» (легче фильтровать), «новые данные» сливаются со старыми в фоновом режиме • Чтение - большими кусками последовательно, кеширует средствами OS, сортировка и группировка много ядер (потоки)
  • 8. Как БД «пишет», «хранит» и «читает» данные? Redis – in-memory OLTP • Запись каждая команда изменяющая данные (кроме PUBSUB) сразу в память и в AOF файл (если включен) • Чтение - Глобальная «хеш» таблица «читает» только из памяти • Хранение «хранит» AOF файл, либо > Fork -> Copy on write -> RDB файл • Есть disk based аналоги - http://ssdb.io/, https://github.com/yinqiwen/ardb
  • 9. Как БД «пишет», «хранит» и «читает» данные? MongoDb – OLTP schema less • Запись сначала в буфер в памяти -> паралельно WAL + Document Storage (сжатие) • Хранение «страницы» в них версии документов + «вторичные индексы» • Чтение - кеш в памяти (в памяти тоже сжатие) + файловый кеш OS
  • 10. Как обрабатывается конкурентный доступ к данным? MySQL – thread per connect (+отдельный accept thread) + storage thread pool PostgreSQL – process per connect (+ auto vacuum) ClickHouse – thread pool per connect Redis – single thread to all connection Mongodb – thread per connect
  • 11. Насколько легко эту БД «мониторить» и «отлаживать»? «Мониторить» легко в принципе всех, инструментов много Лично мой выбор это Prometheus Mongo + MySQL https://www.percona.com/software/database-tools/percona-monitoring-and- management PostgreSQL http://dalibo.github.io/powa/ Clickhouse https://github.com/f1yegor/clickhouse_exporter Redis https://github.com/oliver006/redis_exporter «Отлаживать» уже гораздо сложнее, но инструменты тоже есть УЧИТЕ EXPLAIN!!! MySQL Performance Schema PostgreSQL pg_stat_activity, pg_stat_statement Redis https://github.com/facebookarchive/redis-faina https://github.com/gamenet/redis-memory-analyzer Больше всего не хватает возможности через драйвер вставить место в коде где идет «вызов запроса»
  • 12. Насколько легко эту БД «обновлять»? Обновляться «сложно», но можно ;) Самое сложное обновлять все БД без «downtime» и без «dump/restore» да еще и желательно на одной машине MySQL – логическая репликация + mysql_upgrade PostgreSQL – pglogical + pg_upgrade Clickhouse – apt-get upgrade Redis – apt-get upgrade MongoDb – после 3.x версии apt-get upgrade сначала для secondary, потом primary нод, без ReplicaSet
  • 13. Насколько легко изменять «схему данных» в БД? • MySQL – pt-online-schema-change • PostgreSQL – CREATE INDEX CONCURENTLY + ALTER TABLE бесплатен для DEFAULT NULL • Redis – схему ключей надо менять руками • Clickhouse – ALTER TABLE бесплатен, но ограничен по функционалу • Mongodb – schema less из коробки, но схему документов все равно надо «дизайнить»
  • 14. Насколько стабильны драйверы БД в Python? Чтобы оценить обычно я иду в github для соответсвующего драйвера и смотрю issues и history В python с драйверами все хорошо ;) С багами в них тоже ;) • MySQL – MySQLdb, aiomysql • PostreSQL – psycodb2, aiopg • Clickhouse – clickhouse-driver, aioch • Redis – драйверов вагон ;) • MongoDb – pymongo
  • 15. Как сделать горизонтальное масштабирование? На самом деле ответ 42 или k8s ;) • MySQL – http://github.com/youtube/vitess/ • PostgreSQL – https://github.com/zalando/patroni • Clickhouse https://github.com/count0ru/k8s-clickhouse • Redis - https://github.com/sobotklp/kubernetes-redis-cluster • MongoDb – http://k8smongodb.net
  • 16. Грабли на которые наступал я - MySQL • row based репликация + mysql_upgrade + xtrabackup • Single Thread MySQL Replication – LAG • «сломанная репликация» при ротации binlog • GROUP BY упирающийся в одно ядро • Включайте innodb_file_per_table • Осторожнее с innodb_flush_log_at_trx_commit • Осторожнее с sort_buffer • Поймите что такое data cardinality и не пытайтесь мучить индекс ;)
  • 17. Грабли на которые наступал я - PostgreSQL • Ломается Streaming Replication – max_wal_size и replication slots • Autovacuum vs JSONB размером в 1Mb • Берегите pg_xlog также как base ;) • Wal-e + swift – восстановление в один поток • pgbouncer pause – «не савсем pause» • Patroni гибче чем repmgr • «Длинный SELECT» на standby - max_standby_streaming_delay один на всех • Учитесь правильно считать размер shared_buffers • GROUP BY в один поток
  • 18. Грабли на которые я наступал - Redis • Не допускайте ситуации когда «все ломятся в один ключ» • Не пытайтесь хранить больше 2-5kb на ключ • На 32G и выше лучше 4 ноды по 8Gb чем 1 по 32G • Пользуйтесь KEYS только в самом крайнем случае • Смотрите «сложность алгоритмов» в документации • PUBSUB – не очень эффективен по памяти, не пытайтесь через него гонять данные (чат), только id и не пиками • AOF может ломаться и это надо отдельно мониторить • Twemproxy и Codis – стоит присмотреться
  • 19. Грабли на которые я наступал в Clickhouse • Не работает с zetcd ;) https://github.com/yandex/ClickHouse/issues/777 • «Большие буфера» на вставку https://github.com/yandex/ClickHouse/issues/868 • Репликация «асинхронная», данные до некоторых реплик могут доехать не сразу • Float32, Float64 – это не numeric с фиксированной точностью https://github.com/yandex/ClickHouse/issues/1665
  • 20. Как выбрать СУБД? Прежде всего поймите какой у вас тип нагрузки в приложении! Могут быть разные типы нагрузки в разных частях приложения. Значит нужны РАЗНЫЕ СУБД! Ответьте на вопросы: Чего больше? Чтения или записи? При чтении данные должны быть актуальны? При чтении данные группируются? Сортируются? Фильтруются? Сколько данных читается за один запрос? Сколько данных пишется за один запрос? Как долго нам хватит диска по размеру? и т.д. и т.п.
  • 21.
  • 22. ORM vs Plain SQL • за «Object Mapping» приходится платить • IMHO Raw SQL просто надо сделать “prepared” и вынести в классы моделей
  • 23. Логика в Базе данных • В SQL сложную логику писать «не очень» и надо научиться «обновлять stored процедуры» • Но вот есть tarantool и там через Lua очень хорошо реализован hot reload lua кода • Для «чтения» есть Materialized View и Temporary Tables, но это «дорого» и может быть по Space и Write
  • 24. Вопросы из зала? Пара ссылок на последок https://github.com/onurakpolat/awesome-bigdata https://github.com/igorbarinov/awesome-data-engineering Со мной можно связаться bloodjazman@gmail.com https://t.me/bloodjazman