Не все базы данных одинаково полезны
DESCRIPTION
Не все базы данных одинаково полезны. Сергей Аверин, Badoo. Выбор хранилища данных — сложная задача, с которой часто сталкиваются разработчики. Чаще всего результат этого выбора — это компромисс. Я расскажу о собственном опыте, набитых «шишках», рассмотрю важные, на мой взгляд, связанные с этой задачей проблемы. О компании: Badoo — не только самая большая, но и одна из самых инновационных и высокотехнологичных компаний в сфере социальных сетей, входящий в топ-100 крупнейших мировых проектов. Она насчитывает 139 миллионов пользователей, и еще более чем 100,000 новых пользователей присоединяются к ней каждый день. Badoo — это глобальная социальная онлайн-система, которая дает возможность знакомиться с новыми людьми, живущими пососедству и по всему миру. Мы предлагаем многочисленные технические возможности социальных сетей, делая акцент на играх и сервисах, позволяющих расширить социальный круг. Мы продолжаем расширять географию своего пребывания и использовать самые последние технологии в сетевом общении, позволяющие нашим пользователям знакомиться друг с другом и изменять реальность вокруг себя. Видеоприглашение на конференцию: http://www.youtube.com/watch?v=2mRGcz0UODYTRANSCRIPT
![Page 1: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/1.jpg)
Не все базы данных одинаково полезны
Аверин Сергей,Badoo
![Page 2: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/2.jpg)
Badoo — это:
• Социальная сеть для знакомств с новыми людьми
• В Top-200 Alexa c 2007 года
• 140+ миллионов зарегистрированных пользователей
• 150+ тысяч новых пользователей в день
• 3+ миллиона фотографий загружаются ежедневно
• 2+ тысячи серверов
• 30+ тысяч запросов в секунду к бекендам
• MySQL, PHP, C(++), Linux, nginx, PHP-fpm, memcache
![Page 3: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/3.jpg)
7 советов стартапам
![Page 4: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/4.jpg)
1.Масштабирование
![Page 5: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/5.jpg)
Масштабирование
• Стартап тратит кучу сил и времени на «готовность» к highload, большому масштабированию
• Тратим большие ресурсы без быстрой отдачи
• Сложные вопросы не рассматриваются по причине того, что мало опыта или проблемы еще непонятны
![Page 6: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/6.jpg)
Масштабирование
• Стартап тратит кучу сил и времени на «готовность» к highload, большому масштабированию
• Тратим большие ресурсы без быстрой отдачи
• Сложные вопросы не рассматриваются по причине того, что мало опыта или проблемы еще непонятны
На самом деле, это предполагет, что ваши бизнес-метрики тоже вырастут в десятки и сотни раз, а архитектура сохранится
![Page 7: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/7.jpg)
Масштабирование
Что имеем
![Page 8: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/8.jpg)
Масштабирование
Что рассчитываем получить
![Page 9: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/9.jpg)
Масштабирование
Способ масштабирования
![Page 10: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/10.jpg)
Масштабирование
• «Серебряной пули» масштабирования нет
• Проблемы будут уникальными для вашего проекта
• Понадобится творческое решение
• И многое придется переделывать
![Page 11: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/11.jpg)
Масштабирование
• Для стартапа главными ценностями являются быстрый старт и дешевизна изменений
• Начните с простых, быстрых и несложных решений «по рецепту»
• Клиенты → опыт → понимание, какая архитектура нужна
К. О. предупреждает: истиной для 100% случаев не является
![Page 12: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/12.jpg)
2.Отказоустойчивость
![Page 13: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/13.jpg)
Отказоустойчивость
• При проектировании архитектуры проблемы нижних уровней во внимание не принимаются
• Железо, человеческий фактор, внешние риски и т. д.
• Взаимосвязанность сбоев• В рамках одного сервера на практике не бывает
![Page 14: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/14.jpg)
Отказоустойчивость
Как это сделано в Баду, на примере пользовательских данных:
Выделенные БД-серверы
• проверенного вендора
• резервирование по питанию
• RAID 1+0
![Page 15: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/15.jpg)
Отказоустойчивость
Как это сделано в Баду, на примере пользовательских данных:
Софт
• фаервол• Percona Server
• разные права доступа
• chroot-окружение
![Page 16: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/16.jpg)
Отказоустойчивость
Как это сделано в Баду, на примере пользовательских данных:
Архитектура
• запись в транзакции, на один сервер
• синхронизация с другим ДЦ через общую очередь
![Page 17: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/17.jpg)
3.БД c запасом на вырост
![Page 18: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/18.jpg)
БД c запасом на вырост
• Выбирается БД без большого запаса фич, которые могут понадобиться в будущем
• Ни один стартап не становился огромным в один день
• Узкоспециализированные БД → теряется гибкость
• NoSQL → нет возможности делать сложные вещи худо-бедно, но ценой малых затрат на кодирование
![Page 19: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/19.jpg)
4.БД — хранилище событий
![Page 20: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/20.jpg)
БД — хранилище событий
Использование БД как хранилища событий чаще всего оправдано только ленью
Распространенные use case’ы:
• события, порожденные транзакциями
• события, которые должны надежно доставляться
• события, которые можно потерять
![Page 21: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/21.jpg)
БД — хранилище событий
Cпециализированный движок — RabbitMQ, Kestrel, Scribe, и даже Redis:
• скорость• простота• фичи• масштабируемость
![Page 22: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/22.jpg)
БД — хранилище событий
В Баду для некоторых задач используем Scribe:
• своя обертка с агрегацией данных, вставкой в БД
• меньше сетевых соединений
• передаем данные между ДЦ
• гибкие настройки
• при сбоях сохраняет данные локально
• очень быстрый
![Page 23: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/23.jpg)
Старые песни о главном
![Page 24: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/24.jpg)
5.Поиск
![Page 25: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/25.jpg)
Поиск
• Либо быстро, просто, плохо
• Либо используем бесплатный движок — Sphinx, Solr, Lucene/ElasticSearch
![Page 26: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/26.jpg)
Поиск
99% случаев — быстро, просто, плохо:
SELECT `id`, `body` FROM `entries` WHERE `body` LIKE '%one%'
![Page 27: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/27.jpg)
Поиск
99% случаев — быстро, просто, плохо:
SELECT `id`, `body` FROM `entries` WHERE `body` LIKE '%one%'
SELECT `id`, `body` FROM `entries` WHERE `body` RLIKE '[[:<:]]one[[:>:]]'
http://www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql
![Page 28: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/28.jpg)
Поиск
99% случаев — быстро, просто, плохо:
Some people, when confronted with a problem, think“I know, I’ll use regular expressions.”
Now they have two problems.
— Jamie Zawinsky
![Page 29: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/29.jpg)
Поиск
99% случаев — быстро, просто, плохо:
• потом используем MySQL FULLTEXT Index
• для простых решений прекрасно работает обратный индекс
• Но с полноценным поиском по тексту проблема в том, что просто плохо ищет =)
• а также: мало фич, медленно, хуже масштабируется
![Page 30: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/30.jpg)
Поиск
99% случаев — быстро, просто, плохо:
• а для каких-то задач просто неприменимо
Тест Percona: индекс по всем статьям Википедии.2,5 млн записей, 15 Гб текста на одном сервере
• Sphinx: 20 минут
• MySQL: админ уснул через 6 часов, так и не дождавшись
http://www.percona.com/files//presentations/opensql2008_sphinx.pdf
![Page 31: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/31.jpg)
Поиск
Используйте специализированный софт:
• проще в разработке
• быстрее• больше возможностей
• масштабируется• а главное, лучше ищет
![Page 32: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/32.jpg)
6.Сильная consistency
![Page 33: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/33.jpg)
Сильная consistency
• Не всегда нужна в вебе
• Часто сложно достигаема
• Особенно, когда данные в один сервер не помещаются и надо что-то придумывать
![Page 34: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/34.jpg)
Сильная consistency
• Eventual consistency рулит
• Можно писать в базу выборочно или писать агрегированные данные, не нагружая БД
• Денормализация может дать большой прирост производительности
• Важно знать меру, и что мы теряем, а что получаем
![Page 35: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/35.jpg)
Сильная consistency
Чтобы не получилось так:
SQL DB = ‘A consistent transactional datastore with schema guarantees that uses relational algebra to access normalized tables.’
![Page 36: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/36.jpg)
Сильная consistency
Чтобы не получилось так:
+ добавляем slave — репликация
![Page 37: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/37.jpg)
Сильная consistency
Чтобы не получилось так:
+ добавляем slave — репликация+ мемкеш
![Page 38: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/38.jpg)
Сильная consistency
Чтобы не получилось так:
+ добавляем slave — репликация+ мемкеш+ добавляем еще slave’ов — репликация репликации
![Page 39: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/39.jpg)
Сильная consistency
Чтобы не получилось так:
+ добавляем slave — репликация+ мемкеш+ добавляем еще slave’ов — репликация репликации+ шардинг
![Page 40: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/40.jpg)
Сильная consistency
Чтобы не получилось так:
+ добавляем slave — репликация+ мемкеш+ добавляем еще slave’ов — репликация репликации+ шардинг+ один столбец на таблицу, храним в нем сериализованный объект
![Page 41: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/41.jpg)
Сильная consistency
Чтобы не получилось так:
SQL DB = ‘A consistent transactional datastore with schema guarantees that uses relational algebra to access normalized tables.’
![Page 42: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/42.jpg)
Сильная consistency
Чтобы не получилось так:
SQL DB = ‘A consistent transactional datastore with schema guarantees that uses relational algebra to access normalized tables.’
Много данных кривые руки
![Page 43: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/43.jpg)
Сильная consistency
Чтобы не получилось так:
SQL DB = ‘A consistent transactional datastore with schema guarantees that uses relational algebra to access normalized tables.’
‘A consistent transactional datastore with schema guarantees that uses relational algebra to access normalized tables.’= datastore with access to data, лучше и не скажешь
http://www.youtube.com/watch?v=zAbFRiyT3LU
Много данных кривые руки
![Page 44: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/44.jpg)
7.Используйте хорошо изученные инструменты
![Page 45: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/45.jpg)
Используйте хорошо изученные инструменты
• Неизвестность → опасность
• Выше скорость разработки
• Не поддавайтесь просто так на моду NoSQL
![Page 46: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/46.jpg)
Используйте хорошо изученные инструменты
“Психологическая” популярность NoSQL:
• marketing hype
• мало знаний в области SQL: ACID, CAP, 3 НФ, транзакции
• пытается сделать вид, что БД-специалист не нужен
![Page 47: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/47.jpg)
Используйте хорошо изученные инструменты
“Психологическая” популярность NoSQL:
Идеальная БД для программиста
• хранит объекты классов приложения (сериализация)
• работает быстро (чтобы можно было похвастаться друзьям)
• обо всем остальном заботится сама
![Page 48: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/48.jpg)
Используйте хорошо изученные инструменты
“Психологическая” популярность NoSQL:
Выбор БД
• техн. менеджмент спускает вопрос на тормозах, хотя это его задача
• БД выбирает тот самый программист
• Выбираете NoSQL — понимайте, почему вы это делаете
К. О. предупреждает: так бывает далеко не всегда
![Page 49: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/49.jpg)
Используйте хорошо изученные инструменты
NoSQL:
− запись в один поток
− memory-mapped files, IO scheduling не для БД
− один индекс на запрос
− не очень гибкий шардинг
− производительность тюнится только на уровне ОС
− нет атомарности на уровне одного запроса
− иногда скудный мониторинг, статистика
![Page 50: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/50.jpg)
Используйте хорошо изученные инструменты
NoSQL:
− зачастую, приходится писать кучу довольно скучного кода на уровне приложения
+ чаще всего быстрее SQL-баз
+ проще развертывать, особенно шардинг
+ нет схемы, ALTER TABLE забыто, как страшный сон
![Page 51: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/51.jpg)
Используйте хорошо изученные инструменты
SQL:
− медленнее
− сложнее
(−) много каверзных настроек
− в редких случаях непредсказуемо работает
(−) позволяет писать медленные/плохие запросы
![Page 52: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/52.jpg)
Используйте хорошо изученные инструменты
SQL:
+ более популярно, язык у всех на 80% совпадает
+ хорошо изучено, стабильно
+ оптимизировано хранение данных
+ куча рычагов оптимизации
+ constraint'ы, триггеры, хранимые процедуры
+ ACID
+ B-Tree, R-Tree, GIN, GIST, hash-индексы
![Page 53: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/53.jpg)
Используйте хорошо изученные инструменты
SQL:
(+) Join'ы, которые зло, но иногда выручают
+ очень навороченный оптимизатор запросов
+ параллельное исполнение (под)запросов
+ многоуровневое кеширование
+ статистика, мониторинг
+ можно писать сложные запросы, не перенося логику в код приложения
![Page 54: Не все базы данных одинаково полезны](https://reader033.vdocuments.pub/reader033/viewer/2022052900/555e1c38d8b42a6a4c8b4634/html5/thumbnails/54.jpg)
EVERYBODY LIES
Выводов нет, думайте своей головой!