Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)

1,176 views

Published on

HighLoad++ 2017

Зал «Мумбай», 8 ноября, 10:00

Тезисы:
http://www.highload.ru/2017/abstracts/3045.html

Как мы заставили Druid работать в Одноклассниках.

«Druid is a high-performance, column-oriented, distributed data store» http://druid.io.

Мы расскажем о том, как, внедрив Druid, мы справились с ситуацией, когда MSSQL-based система статистики на 50 терабайт стала:
- медленной: средняя скорость ответа была в разы меньше требуемой (и увеличилась в 20 раз);
- нестабильной: в час пик статистика отставала до получаса (теперь ничего не отстает);
- дорогой: изменилась политика лицензирования Microsoft, расходы на лицензии могли составить миллионы долларов.
...

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)

  1. 1. Как мы заставили Druid работать в Одноклассниках Юрий Невиницин
  2. 2. ЗАЧЕМ? Статистика Менеджеры Разработчики Администраторы • Цели • Аномалии • Мониторинг • Эксперименты • Запуски • Без неё никак
  3. 3. Немного цифр • 350 таблиц • 50TB • 12 млрд событий в сутки • Отставание на полчаса • 6 секунд • Цена в миллионы долларов
  4. 4. Постановка задачи
  5. 5. Постановка задачи • Быстро • 24x7x365 ( -1 ЦОД ) • Масштабируемо • Open-source (Java)
  6. 6. Druid • Быстро • 24x7x365 ( -1 ЦОД ) • Масштабируемо • Open-source (Java) • Предагрегация • Timeseries, TopN, GroupBy
  7. 7. Альтернативы • PostgreSQL • Influx • Prometheus • OpenTSDB • ClickHouse
  8. 8. • Все довольны • Сэкономили миллионы долларов • 1 человек Druid
  9. 9. Событий/сек Кластер 500 000 Нода 50 000 Таблица 10 000 Druid
  10. 10. Событий/сек Кластер 500 000 2 300 000 Нода 50 000 275 000 Таблица 10 000 90 000 Druid MAX
  11. 11. Внешние компоненты • Storage (Amazon, HDFS, local) • Metadata DB (MySQL, Postgres, Derby) • ZooKeeper • Cache (memcache, local)
  12. 12. Собственные компоненты • Realtime • Historical • Broker • Coordinator • Indexing service
  13. 13. DATA Realtime Segment StorageMeta Coordinator Historical
  14. 14. Historical QUERY Broker subquery1 subquery2 subquery3 subquery4 Historical HistoricalRealtime
  15. 15. Отказ MySQL • Данные копятся в Realtime-нодах • Пока не кончатся ресурсы = предсказуемый запас времени
  16. 16. Отказ MySQL Storage, Coordinator • Данные копятся в Realtime-нодах • Пока не кончатся ресурсы = предсказуемый запас времени • Cassandra-based DB • Свежие данные всегда доступны
  17. 17. Отказ ZooKeeper • Маленький таймаут • Много данных • Лавина трафика • «Нет данных» Что делать?
  18. 18. Отказ ZooKeeper • Удалить данные ZK • Иметь запас памяти в ZK • Корректно завершать Historical • Стартовать Historical с паузой • Убрать ненужные чтения • Убрать ненужные данные Что делать?
  19. 19. Загрузка данных
  20. 20. Realtime • sss MMAP MMAP
  21. 21. Искажение данных Persisted Data Source Position Загрузка в Realtime Persisted Data Source Position Потеря Дубль
  22. 22. Деградация чтения Загрузка данных
  23. 23. Time Calls Host 10:45 123 web1 10:45 132 web2 10:45 345 api1 10:45 354 api2 10:50 120 web1 10:50 128 web2 10:50 342 api1 10:50 333 api2
  24. 24. Time Calls Host 10:45 123 web1 10:45 132 web2 10:45 345 api1 10:45 354 api2 10:50 120 web1 10:50 128 web2 10:50 342 api1 10:50 333 api2 long[] long[] api1 api2 web1 web2
  25. 25. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 int[]
  26. 26. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[]
  27. 27. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[]
  28. 28. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[]
  29. 29. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[]
  30. 30. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[]
  31. 31. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] 1 1 0 0 1 1 0 0
  32. 32. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] 1 1 0 0 1 1 0 0
  33. 33. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] SUM(calls) host = web%, mob%, music%, video%
  34. 34. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] SUM(calls) host = web%, mob%, music%, video%
  35. 35. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] SUM(calls) host = web%, mob%, music%, video%
  36. 36. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] SUM(calls) host = web%, mob%, music%, video% 1 1 0 0 1 1 0 0 bitmap1
  37. 37. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] SUM(calls) host = web%, mob%, music%, video% bitmap1 bitmap2
  38. 38. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] SUM(calls) host = web%, mob%, music%, video% bitmap1 bitmap2 bitmap3 bitmap4
  39. 39. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] SUM(calls) host = web%, mob%, music%, video% 1 1 0 0 1 1 0 0
  40. 40. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] SUM(calls) host = web%, mob%, music%, video% 1 1 0 0 1 1 0 0
  41. 41. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] SUM(calls) host = web%, mob%, music%, video% 1 1 0 0 1 1 0 0 5 95
  42. 42. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] Загрузка данных
  43. 43. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 Time Calls Host 10:50 123 2 10:50 132 3 10:50 345 0 10:50 354 1 api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 Time Calls Host 10:55 123 2 … … … api1 api2 web1 web2 0 0 1 0 … … … …
  44. 44. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 Time Calls Host 10:50 123 2 10:50 132 3 10:50 345 0 10:50 354 1 api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 Time Calls Host 10:55 123 2 … … … api1 api2 web1 web2 0 0 1 0 … … … …
  45. 45. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 Time Calls Host 10:50 123 2 10:50 132 3 10:50 345 0 10:50 354 1 api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 Time Calls Host 10:55 123 2 … … … api1 api2 web1 web2 0 0 1 0 … … … …
  46. 46. Деградация чтения Загрузка данных • Размер сегмента • Частота сброса на диск • Использовать Selector
  47. 47. like.photo.main
  48. 48. like.photo.main.favorites
  49. 49. like.photo.main.favorites.widget
  50. 50. like.photo.main.favorites.widget.banner125
  51. 51. like.photo.main like.photo.album like.photo.group like.video.main like.video.album like.video.group like.music.main like.music.album like.music.group share.photo.main share.photo.album share.photo.group share.video.main share.video.album share.video.group share.music.main share.music.album share.music.group comment.photo.main comment.photo.album comment.photo.group comment.video.main comment.video.album comment.video.group comment.music.main comment.music.album comment.music.group SUM(calls) Event = like.%
  52. 52. like.photo.main like.photo.album like.photo.group like.video.main like.video.album like.video.group like.music.main like.music.album like.music.group share.photo.main share.photo.album share.photo.group share.video.main share.video.album share.video.group share.music.main share.music.album share.music.group comment.photo.main comment.photo.album comment.photo.group comment.video.main comment.video.album comment.video.group comment.music.main comment.music.album comment.music.group SUM(calls) Event = like.%
  53. 53. Action Like Share Comment Object Photo Video Music Place Main Album Group SUM(calls) Action = like
  54. 54. Action Like Share Comment Object Photo Video Music Place Main Album Group SUM(calls) Action = like
  55. 55. Time Calls Host 10:45 123 2 10:45 132 3 10:45 345 0 10:45 354 1 10:50 120 2 10:50 128 3 10:50 342 0 10:50 333 1 long[] long[] api1 api2 web1 web2 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 int[] 1 1 0 0 1 1 0 0 5 95 SUM(calls) Action = like 5 11 100 = + 16 = +
  56. 56. Истинно тяжелый запрос • 2TB • 74 секунды • Приоритеты • Надо выставлять в запросе • Работают на уровне очереди
  57. 57. • Отказ MySQL предсказуем • Для ZooKeeper: запас памяти, корректно завершать Historical, а стартовать с паузой • Realtime не гарантирует exactly-once • Подбор размера сегмента и частоты сброса на диск • Использовать Selector • Разбивать большое измерение на мелкие • Приоритеты на уровне очереди
  58. 58. Юрий Невиницин nevinitsin@corp.mail.ru
  59. 59. Юрий Невиницин nevinitsin@corp.mail.ru
  60. 60. Юрий Невиницин nevinitsin@corp.mail.ru
  61. 61. Юрий Невиницин nevinitsin@corp.mail.ru
  62. 62. Деградация чтения Загрузка данных t N rows Historical Realtime N parts = 1
  63. 63. Деградация чтения Загрузка данных t N rows Historical Realtime N parts = 2
  64. 64. Деградация чтения Загрузка данных t N rows Historical Realtime N parts = 3
  65. 65. Деградация чтения Загрузка данных t N rows Historical Realtime N parts = 30
  66. 66. 1 | Область названия раздела
  67. 67. Данные: название источника данных, 2016 74 Слайд с текстом Подзаголовок • Далтон Трамбо, один из самых успешных голливудских сценаристов, автор «Римских каникул» и «Спартака», не подозревал, что черный список «Hollywood 10» реально существует, пока сам не попал туда и не был навсегда выкинут из жизни фабрики грез; • Премьера «Трамбо» состоялась в программе «специальный показ» на кинофестивале в Торонто в сентябре 2015 года. Выход картины в широкий прокат состоялся 6 ноября 2015 года.
  68. 68. Данные: название источника данных, 2016 75 Слайд с цифрой 63 Подпись в две строчки %
  69. 69. Данные: название источника данных, 2016 76 Слайд с двумя цифрами 63 Подпись в две строчки % 27 Подпись в две строчки млн
  70. 70. Данные: название источника данных, 2016 77 Изображение с комментарием Стиль изображений Зайдите в Quick Styles. Выберите стиль с тенью
  71. 71. Данные: название источника данных, 2016 78 Вертикальный скриншот Android с комментарием Скриншот на экране мобильного телефона на платформе Android Вставьте свой скриншот в черное поле мобильного устройства
  72. 72. Данные: название источника данных, 2016 79 Вертикальный скриншот iOS с комментарием Скриншот на экране мобильного телефона на платформе iOs Вставьте свой скриншот в черное поле мобильного устройства
  73. 73. Данные: название источника данных, 2016 80 Горизонтальный скриншот iOS
  74. 74. Данные: название источника данных, 2016 81 Горизонтальный скриншот Android
  75. 75. Данные: название источника данных, 2016 82 Скриншот на экране ноутбука Скриншот на экране ноутбука Вставьте свой скриншот в черное поле ноутбука
  76. 76. Данные: название источника данных, 2016 83 Таблица Размещения CRM (руб.) Значение Промо-баннер (ТГБ под аватаркой) 10000 10000 показов Промо-посты c охватом на свою группу 10000 23000 показов Оповещения для вступления в группу 10000 8000 показов Услуги Промо-баннер (ТГБ под аватаркой) 10000 16000 показов Промо-посты c охватом на свою группу 10000 28000 показов Оповещения для вступления в группу 10000 14000 показов Промо-баннер (ТГБ под аватаркой) 10000 23000 показов Промо-посты c охватом на свою группу 10000 1 пост Оповещения для вступления в группу 10000 23000 показов Промо-баннер (ТГБ под аватаркой) 10000 Бонус
  77. 77. 84 Контакты и полезная информация Поддержка партнеров partners@ok.ru Отдел продаж sales@corp.mail.ru Блог ОК с информацией о запусках, событиях и др. insideok.ru Лучшие кейсы на базе ОК за последние годы awards.insideok.ru Продуктовые обновления ok.ru/gruppa Официальная группа ОК ok.ru/ok

×