20 апреля, DEV {highload} - конференция о Highload веб-разработке,...

32
"Когда стоит написать свою БД" Олег Краснов Системный Архитектор SEMrush [email protected] 2013 dev.it-portfolio.net

description

20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов (cистемный Архитектор SEMrush) Аннотация В 2008 году система хранения SEMrush была построена на базе сочетания SQL и файлового хранилища. Это позволило выдерживать нагрузку примерно до 3 миллионов запросов в день. Но уже в 2009 году было видно, что интерес к сервису растет стремительно и очень скоро старая система хранения будет основным сдерживающим фактором. Мы провели ряд экспериментов и в результате исследования остановились на собственной структуре хранения данных. Новая система была создана в предельно короткие сроки и уже через 3 месяца была введена в строй. Эта система используется и по сей день, хотя нагрузка выросла на порядок. В докладе будет освещены история и методы построения хранилища данных проекта SEMrush. В ходе выступления будет проведена ретроспектива требований. Также докладчик расскажет об особенностях применяемого хранилища данных и отличиях от стандартных методов и средств. В том числе, будут освещены перспективы данной технологии применительно к реалиям и новым потребностям проекта. О компании Сегодня SEMrush – ведуший сервис для анализа конкурентов. Он позволяет узнать кейворды, по которым любой домен или сайт попадает в AdWords, выдачу Google и Bing. В отличие от других инструментов, которые позволяют анализировать только ваши собственные данные, SEMrush дает возможность изучить рекламные тексты конкурентов и собирает сведения об их бюджетах на продвижение в поисковиках.

Transcript of 20 апреля, DEV {highload} - конференция о Highload веб-разработке,...

Page 1: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

"Когда стоит написать свою БД"

Олег КрасновСистемный Архитектор

[email protected]

2013 dev.it-portfolio.net

Page 2: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 2

Что такое SEMrush

- Ведущий сервис анализа конкурентов- Позволяет узнать ключевые слова- Позволяет анализировать не только ваши

собственные данные- Сведения об бюджетах конкурентов на

продвижение в поисковиках- Данные о затратах на каждое конкретное

объявление и его содержимое

Page 3: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 3

Как выглядит SEMrush

Page 4: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 4

Картина пользователей

- Рядовые пользователи: более 300 тысяч- Крупные клиенты: более 50

- Интеграторы: более 100

Page 5: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 5

Объёмы данных

- 90 миллионов слов- 10 языковых баз- > 2 миллиардов URL- 30% AdWords объявлений- 3 терабайта актуальных данных- 40 терабайт исторических данных

Page 6: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 6

Характер данных

- Ключевые слова- Числовые данные- URL- Небольшие тексты объявлений

Page 7: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 7

Хорошие примеры

- youtube.com : ~ 30 миллионов слов- wikipedia.org : ~ 20 миллионов слов- t-v-links.blogspot.com : 51 слово- tiffanytunes.com : 28 слов

Page 8: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 8

Распределение данных

Page 9: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 9

Как это было в 2009 году

- MySQL 5.0.76 для хранения посчитанных индексов по всем полям (MyISAM)

- Большие файлы для хранения текстовых данных

- PHP 5.2.x для объединения данных и отдачи отчётов

Page 10: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 10

Что же стало понятно

Наличие прототипа – это прекрасно!

Page 11: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 11

Но присутствовали проблемы

- Очень медленно строилось- Плохо масштабировалось- Для каждого столбца нужен был отдельный

индекс- Занимало излишнее место- Никто не понимал как это было написано

Page 12: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 12

А чего же хотелось

- Быстрой отдачи данных- Асинхронной отдачи данных- Отказоустойчивости- Масштабируемости- Простоты

Page 13: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 13

Может быть SQL

- MySQL : медленное построение- PostgreSQL : схожие проблемы- ORACLE : платный- MSSQL : чуждая среда

Page 14: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 14

Может быть NoSQL

- Redis: первый коммит 22 марта 2009 года- MongoDB: первый релиз версии 9 декабря

2009 года (версия 0.0.3)- Hadoop (версия 0.19.2) – большое

количество серверов

Page 15: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 15

А что же тогда

- Файловая система- Бинарные индексы- Текстовые файлы- Хорошая хэш-функция для поиска- Компактное хранение числовых данных

Page 16: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 16

Пробы пера в файловых системах

- UFS2 + Soft Updates- EXT3(4)- ReizerFS 3- ZFS

Page 17: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 17

Магия файловых систем

- Перелинковка- Устойчивость к потерям данных- Работа на уровне ядра- Стабильность- Простота- Возможность создания виртуальных

устройств

Page 18: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 18

Как это строится

- Основной индекс строится во время сбора данных

- Агрегированные данные строятся после этого

- Параллельно строятся дополнительные индексы

- Затем строятся текстовые индексы

Page 19: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 19

Как это хранится

- Индексы- Тексты- Ранки- Исходники

Page 20: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 20

Что стало понятно в процессе

- Необходимо кэширование результатов- Часто запрашиваемые данные должны

лежать отдельно- Учёт пользователей должен быть отдельно

Page 21: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 21

Как это отдаётся

- JSON- TCP сервер- Для числовых данных event сервера- Для текстового поиска и фильтров сервер

полнотекстового поиска

Page 22: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 22

Что же там внутри

- C- UNIX way- Бинарный поиск- Деревья- Хэш таблицы

Page 23: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 23

Как это хранилось раньше

Индексы

Текстовые данные

US

Page 24: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 24

Как это хранится теперьiSCSI через внутренний сетевой интерфейс

Page 25: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 25

А если будет много запросов

Page 26: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 26

Чего мы достигли

- Производительности: количество обрабатываемых увеличилось на порядок с 3 до 30 миллионов запросов в сутки

- Гибкости: ввод в строй новых отчётов не сопряжён с непреодолимыми трудностями

- Простоты развёртывания- Простоты резервного копирования и

восстановления

Page 27: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 27

Вспомогательные сервисы

- libevent + mmap- Sphinx- Python

Page 28: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 28

Взгляд в будущее

- Новые отчёты- Исторические данные- Увеличение количества баз- Непрерывные обновления

Page 29: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 29

Непрерывные обновления

- Слегка поменять технологию сбора- Написать одну утилиту- Удовлетворённо посмотреть на результат

Page 30: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 30

Выводы из вышесказанного

- Стоит писать свою базу данных- Но если чётко известен объём задачи

Page 31: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 31

Будьте на связи

Олег КрасновСистемный архитектор компании SEMrush

[email protected]+7 (962) 700-1771

Page 32: 20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда стоит написать свою БД", Олег Краснов

dev.it-portfolio.net 32

Спасибо за внимание!