Еще раз о масштабировании MySQL

Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Еще раз о масштабировании MySQL

Post by Сабина »

Точнее может MySQL уже придется выкинуть в помойку , в общем нужен совет коллектива.
В одной конторе собирались метрики с порядка 2000+ серверов, порядка 20 видов - bandwidth in, bandwidth out и нечто называемое rpo ( для сервера и всех его volumes) etc. Считывалось все это дело раз в 10 минут и потом агрегировалось в daily tables .
Теперь выкатили новые requirements - нужно это все собирать и хранить в raw виде чтобы юзеры могли вытащить каждый sample, zoom in, zoom out etc. В общем практически big data :mrgreen:
Я написала себе программулину, которая моделирует объем данных и получается что если собирать их по прежнему в MySQL то без daily rollups не обойтись , иначе performance аналитических запросов вообще никакая, в сутки пишется порядка 40 миллионов рекордов. Пытаюсь переделать таблицы и партиции, играюсь с индексами, query tuning, но толк почти нулевой.

Что можно еще попробовать ? Из того что я накопала - Cassandra неплохо подходит для timeseries like data. Может сразу Хадуп / Спарк ?
https://www.youtube.com/watch?v=wOwblaKmyVw
User avatar
VladDod
Уже с Приветом
Posts: 56113
Joined: 06 May 2001 09:01

Re: Еще раз о масштабировании MySQL

Post by VladDod »

http://www.postgresql.org/" onclick="window.open(this.href);return false;
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

А мне показалось что не может быть PostgreSQL настолько лучше MySQL в этом плане что глобально решит проблему.
А засчет чего там timeseries на порядки лучше обрабатываются ?

PS. Переделка таблиц и партиций немного помогла, теперь около 1 mln records per 24 hours
https://www.youtube.com/watch?v=wOwblaKmyVw
User avatar
VladDod
Уже с Приветом
Posts: 56113
Joined: 06 May 2001 09:01

Re: Еще раз о масштабировании MySQL

Post by VladDod »

Сабина wrote:А мне показалось что не может быть PostgreSQL настолько лучше MySQL в этом плане что глобально решит проблему.
Без понятия. Я не слишком вникал, но ты навигацию на морской сейсмике представляешь? 40M записей - это менее часа на профиле.
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

VladDod wrote:
Сабина wrote:А мне показалось что не может быть PostgreSQL настолько лучше MySQL в этом плане что глобально решит проблему.
Без понятия. Я не слишком вникал, но ты навигацию на морской сейсмике представляешь? 40M записей - это менее часа на профиле.
Как же все наше морская сейсмика то :). Тогда и правда стоит глянуть. Ты с этим работаеш на уровне кода или пользуешь?

PS. Во :umnik1:
https://news.ycombinator.com/item?id=8368509" onclick="window.open(this.href);return false;
Depending on how 'huge' your timeseries are, you might be pleasantly surprised with Postgres. Postgres scales to multiple TB just fine, and of course the software can be easier to write since you have SQL and ORMs to rely on. It's also an incredibly mature and stable software package, if you're worried about future-proofing.
Some (constantly-growing) timeseries can be stored on a per-row basis, while other (static or older) timeseries can be stored in a packed form (e.g. an array column).
I find that most of the time, "Big Data" isn't really all that big for modern hardware, and so going through all of the extra software work for specialized data stores isn't really all that necessary. YMMV, of course, depending on the nature of your queries.
https://www.youtube.com/watch?v=wOwblaKmyVw
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

Кстати неплохой критерий - просто и со вкусом :)
Approximately, if you have something like 10+ billion items, use Cassandra.
https://www.youtube.com/watch?v=wOwblaKmyVw
User avatar
valchkou
Уже с Приветом
Posts: 4195
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: Еще раз о масштабировании MySQL

Post by valchkou »

Сабина wrote: Из того что я накопала - Cassandra неплохо подходит для timeseries like data. Может сразу Хадуп / Спарк ?
подходит, но занятие не для слабонерных.
Это же надо все поднять, настроить и задизайнить.
Хотя поднять сам кластер из 5-6 нод уйдет дня 3 не более для новичка.
кстати http://www.datastax.com/products/datast ... -analytics" onclick="window.open(this.href);return false;
кассандра идет вместе со спарком, они даже будут запускаться вместе на одном хосте, одним нажатием кнопки.
Для не прод - бесплатно. Никаких лицензионных ключей или trial ограничений, можно попробовать.
User avatar
VladDod
Уже с Приветом
Posts: 56113
Joined: 06 May 2001 09:01

Re: Еще раз о масштабировании MySQL

Post by VladDod »

Сабина wrote: Ты с этим работаеш на уровне кода или пользуешь?
Пользую. Иногда надо что то достать или добавить - SQL из под скрипта ... на уровне "select, case, update".
в реале супруги редко бывают друзьями, так как их отношения подпорчены сексом (с)Роза
Плавали-Знаем! (C)
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

Какой partitioning в PostreSQL развесистый кто бы мог подумать?
http://www.postgresql.org/docs/9.1/stat ... oning.html" onclick="window.open(this.href);return false;

Каждую партицию по сути руками создавать надо да еше и insert trigger :yad:
hash partitioning тока в планах
https://wiki.postgresql.org/wiki/Table_partitioning" onclick="window.open(this.href);return false;
https://www.youtube.com/watch?v=wOwblaKmyVw
mskmel
Уже с Приветом
Posts: 946
Joined: 24 Sep 2013 05:58
Location: US\GA

Re: Еще раз о масштабировании MySQL

Post by mskmel »

Сабина wrote:Точнее может MySQL уже придется выкинуть в помойку , в общем нужен совет коллектива.
В одной конторе собирались метрики с порядка 2000+ серверов, порядка 20 видов - bandwidth in, bandwidth out и нечто называемое rpo ( для сервера и всех его volumes) etc. Считывалось все это дело раз в 10 минут и потом агрегировалось в daily tables .
Такую же задачу делали лет 10 назад на постгрессе для на порядок бОльшего количества устройств, тогда это делали шардингом, но железо было в те времена совсем медленное. Партиций или не было, или были совсем сырые (не помню уже).

"2000+ серверов, порядка 20 видов ... раз в 10 минут"
2000*20*10/60=6666 записей в секунду. Нагрузку именно по сохранению данных потянет обычный лэптоп.

Если народу читающего данные не много, и читают по одному серверу детали за кусок времени, то https://dev.mysql.com/doc/refman/5.1/en ... tions.html" onclick="window.open(this.href);return false;

RANGE по дате, HASH по серверу. Предварительно проверив как mysql живет с большим количеством партиций, например 365 дней по 100-200 партиций на серверы. Подумать, может в этой конфигурации будет целесообразно просто удалить все индексы.
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

mskmel wrote: 2000*20*10/60=6666 записей в секунду. Нагрузку именно по сохранению данных потянет обычный лэптоп.

Если народу читающего данные не много, и читают по одному серверу детали за кусок времени, то https://dev.mysql.com/doc/refman/5.1/en ... tions.html" onclick="window.open(this.href);return false;

RANGE по дате, HASH по серверу. Предварительно проверив как mysql живет с большим количеством партиций, например 365 дней по 100-200 партиций на серверы. Подумать, может в этой конфигурации будет целесообразно просто удалить все индексы.
Временные по дням ? Так наверное запросы медленнее будут выполняться потому что across several partitions? У нас большинство запросов идет за последнюю неделю, и один по всему списку (admin), мне казалось партиции должны быть минимум по месяцу. Субпартиции тоже сначала хотела сделать по имени хоста, но запросы идут в основном с customer account Id in where clause.
Надо будет попробовать и такой вариант по любому .

Я поменяла код и запустила крон собирать данные в Postgres, посмотрим что там к понедельнику будет, судя по прочитанному он именно с timeseries должен лучше майсиквела справляться.

А шардинг в чем именно состоял ? Многие под шардингом подразумевают те же партиции. Как я понимаю вы разбили на сервера которые каждый обслуживал определенный account range? Под это дело ведь и код нужно менять глобально ?
Пока тут стоит percona cluster но это просто для failover - две реплики одной и той же базы
https://www.youtube.com/watch?v=wOwblaKmyVw
Easbayguy
Уже с Приветом
Posts: 10632
Joined: 17 Jul 2003 22:11

Re: Еще раз о масштабировании MySQL

Post by Easbayguy »

Сабина wrote:Точнее может MySQL уже придется выкинуть в помойку , в общем нужен совет коллектива.
В одной конторе собирались метрики с порядка 2000+ серверов, порядка 20 видов - bandwidth in, bandwidth out и нечто называемое rpo ( для сервера и всех его volumes) etc. Считывалось все это дело раз в 10 минут и потом агрегировалось в daily tables .
Теперь выкатили новые requirements - нужно это все собирать и хранить в raw виде чтобы юзеры могли вытащить каждый sample, zoom in, zoom out etc. В общем практически big data :mrgreen:
Я написала себе программулину, которая моделирует объем данных и получается что если собирать их по прежнему в MySQL то без daily rollups не обойтись , иначе performance аналитических запросов вообще никакая, в сутки пишется порядка 40 миллионов рекордов. Пытаюсь переделать таблицы и партиции, играюсь с индексами, query tuning, но толк почти нулевой.

Что можно еще попробовать ? Из того что я накопала - Cassandra неплохо подходит для timeseries like data. Может сразу Хадуп / Спарк ?
Вот тут та и приходит попа, весело будет когда индех коррапнется.
Пх'нглуи мглв'нафх Ктулху Р'лайх угахнагл фхтагн
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

Да и еще все индексы дропнуть вроде не вариант. Нужен как минимум primary key по комбинации time stamp + metric Id + host name
https://www.youtube.com/watch?v=wOwblaKmyVw
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

Eastbayguy, о какой попе речь и какой именно индекс должен корапнуться ?
https://www.youtube.com/watch?v=wOwblaKmyVw
mskmel
Уже с Приветом
Posts: 946
Joined: 24 Sep 2013 05:58
Location: US\GA

Re: Еще раз о масштабировании MySQL

Post by mskmel »

Сабина wrote:Временные по дням ? Так наверное запросы медленнее будут выполняться потому что across several partitions?
С чего они будут медленнее? Просканирует 7 партиций поменьше, вместо одной большой. Зато если надо чуть из июля и чуть из августа, то не надо будет по двум месячным партициям бегать.
Если данные одного клиента никогда не выбираются совместно с данными другого клиента, то вообще хоть отдельные таблицы\БД под его статистику создавай. Опять же тестировать новый функционал можно будет на небольшой популяции клиентов.
Сабина wrote:Я поменяла код и запустила крон собирать данные в Postgres, посмотрим что там к понедельнику будет, судя по прочитанному он именно с timeseries должен лучше майсиквела справляться.
Зачем прыгать с БД на БД даже не попробовав уже имеющуюся? Для mysql у вас уже есть специалисты.
Сабина wrote:А шардинг в чем именно состоял ? Многие под шардингом подразумевают те же партиции. Как я понимаю вы разбили на сервера которые каждый обслуживал определенный account range? Под это дело ведь и код нужно менять глобально ?
Многие не читают определения терминов.
Но в твоём случае, если нет 100500 юзеров постоянно выбирающих статистику по своим хостам, шардинг не надо. Сохранить и иногда запрашивать небольшой кусок данных справится любая БД из тобой рассматриваемых.
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

mskmel wrote: Но в твоём случае, если нет 100500 юзеров постоянно выбирающих статистику по своим хостам, шардинг не надо. Сохранить и иногда запрашивать небольшой кусок данных справится любая БД из тобой рассматриваемых.
Да sharding не нужен я согласна. а вот с "иногда запрашивать" проблема. Сейчас вообще сделано так что просто волосы дыбом, все из-за того что база не тянет. UI code в каждой сессиии вытаскивает из вебсервиса 15-20К samples/rows и агрегирует на клиенте. Они до недавнего времени делали daily rollups, но по новым requirements нужно и raw data и aggregated причем минимум за два года.
При таком раскладе много чего нучно поменять - без caching at the service layer не обойтись, а самое главное оптимизировать object model и базу чтобы те хотя бы last 2 weeks data возврашали быстро.
PostgresSQL - потому что речь идет о microservices и там базу можно выбрать другую с нуля, не обязательно чтобы совпадала в базой которая в monolithic app
https://www.youtube.com/watch?v=wOwblaKmyVw
User avatar
stenking
Уже с Приветом
Posts: 14455
Joined: 26 May 2006 02:39

Re: Еще раз о масштабировании MySQL

Post by stenking »

Тут без разницы какая база данных. 40М в сутки значит то так просто квирей не посчитаеш и нужно время. Т.е. даже если спарк в 10 раз быстрее будет то какая разница - все равно аналитика будет считается 10 минут вместо 2 часов.

Т.е. подходить нужно с позиций - а что именно нужно и если нужно дату быстро то делать промежуточные расчёты вперёд а если нужно считать on demand то делать что бы репорты в бэкграунде работали и юзеру потом нотификейшин слать.

Ну и для таких вещей я бы ещё https://www.elastic.co/products/elasticsearch" onclick="window.open(this.href);return false; посмотрел - он как раз предназначен что бы отвечать на вопросы типа а сколько серверов имело траффик за последние 2 дня больше чем за последние 2 недели
Бога нет.
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

stenking wrote: Ну и для таких вещей я бы ещё https://www.elastic.co/products/elasticsearch" onclick="window.open(this.href);return false; посмотрел - он как раз предназначен что бы отвечать на вопросы типа а сколько серверов имело траффик за последние 2 дня больше чем за последние 2 недели
Интересная штука. Не на предмет использовать а чисто ознакомительно
https://www.youtube.com/watch?v=wOwblaKmyVw
User avatar
stenking
Уже с Приветом
Posts: 14455
Joined: 26 May 2006 02:39

Re: Еще раз о масштабировании MySQL

Post by stenking »

Сабина wrote:
stenking wrote: Ну и для таких вещей я бы ещё https://www.elastic.co/products/elasticsearch" onclick="window.open(this.href);return false; посмотрел - он как раз предназначен что бы отвечать на вопросы типа а сколько серверов имело траффик за последние 2 дня больше чем за последние 2 недели
Интересная штука. Не на предмет использовать а чисто ознакомительно
Почему не использовать. Использовать его как раз нужно - он быстрый, поднимается с полпинка и шардается также. Т.е. он как раз и нужен что бы дату на лету обрабатывать а вот writes туда немного медленные. Другое дело что например сложная выборка по миллиарду записей это всегда долго и тут нужно смотреть как именно архитектуру сделать в зависимости от конкретных вопросов которые возникают к этой дате.
Бога нет.
User avatar
stenking
Уже с Приветом
Posts: 14455
Joined: 26 May 2006 02:39

Re: Еще раз о масштабировании MySQL

Post by stenking »

mskmel wrote: 2000*20*10/60=6666 записей в секунду. Нагрузку именно по сохранению данных потянет обычный лэптоп.
.
2000*20/(10*60) = 66

6666 это уже совсем немало, тут SSD может столько не потянуть. Если даже данные по 100 байт то это добрых 0.5Г в секунду :)
Бога нет.
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

stenking wrote:
mskmel wrote: 2000*20*10/60=6666 записей в секунду. Нагрузку именно по сохранению данных потянет обычный лэптоп.
.
2000*20/(10*60) = 66

6666 это уже совсем немало, тут SSD может столько не потянуть. Если даже данные по 100 байт то это добрых 0.5Г в секунду :)
Сохранить то не проблема как раз, проблема вытащить нужные варианты быстро. Там есть и запрос cross all accounts (admin) и по эккаунту - агрегированные за неделю по дням и latest.
Моя мысль была на каждый сервер ( account range) создать свой микросервис. А потом сделать REST endpoint ( API Gateway), который будет сначала из distirubted cache в основном ( Redis ?) вытаскивать aggregated for a day ( за предидущие дни недели, until yesterday inclusive) + latest and greatest for today из самого сервиса
https://www.youtube.com/watch?v=wOwblaKmyVw
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

stenking wrote:Почему не использовать.
Тут ops support нулевой. Народ умудряется один и тот же mysql deployment портачить каждый раз, что уж тут говорить про совсем незнакомый фреймворк
https://www.youtube.com/watch?v=wOwblaKmyVw
User avatar
stenking
Уже с Приветом
Posts: 14455
Joined: 26 May 2006 02:39

Re: Еще раз о масштабировании MySQL

Post by stenking »

Сабина wrote:
stenking wrote:Почему не использовать.
Тут ops support нулевой. Народ умудряется один и тот же mysql deployment портачить каждый раз, что уж тут говорить про совсем незнакомый фреймворк
https://qbox.io/pricing" onclick="window.open(this.href);return false;
Бога нет.
Сабина
Уже с Приветом
Posts: 19041
Joined: 11 Jan 2012 09:25
Location: CA

Re: Еще раз о масштабировании MySQL

Post by Сабина »

stenking wrote:
https://qbox.io/pricing" onclick="window.open(this.href);return false;
Да, клауд у них "свой", как говорится "There is no cloud. It is just someone else's computer" (C)
https://www.youtube.com/watch?v=wOwblaKmyVw
mskmel
Уже с Приветом
Posts: 946
Joined: 24 Sep 2013 05:58
Location: US\GA

Re: Еще раз о масштабировании MySQL

Post by mskmel »

stenking wrote:6666 это уже совсем немало, тут SSD может столько не потянуть. Если даже данные по 100 байт то это добрых 0.5Г в секунду :)
6,666*100byte=666,600byte=667KByte.

Return to “Вопросы и новости IT”