Alex
зачем ? будь носителем уникального знания ;)
yopp
больше людей знают про шардинг, больше данных, чаще нужен я!
Alex
тогда надо писать непонтяно, чтобы все знали что оно есть а как его готовить неясно )
Alex
шучу конеш
Alexey
так все-таки, для разделения записи на разные шарды уместнее использовать условный client_id. Правильно я понимаю?
yopp
короче, есть у тебя числовая прямая от минус бесконечности до плюс бесконечности
yopp
эта числовая прямая начинает разбиваться на отрезки при выполнении определённого условия (превышение предела размера чанка)
yopp
прямая твоя состоит только из натуральных чисел
yopp
у отрезка есть «место» где он хранится
yopp
вот этот отрезок и есть чанк
yopp
очень важно запомнить про натуральное число
yopp
так вот. монга очень тупая в этом вопросе: она смотрит на шард и смотрит сколько чанков на каком шарде лежит
yopp
если есть шард на котором меньше чанков чем на других шардах, балансировщик просто чанки с других шардов, на этот, чтоб было равномерно
yopp
ему насрать сколько реально данных в чанке, потому что причины
yopp
теперь простая математика
yopp
у тебя есть числовая прямая, поделенная на отрезки
yopp
у тебя есть вектор чисел, это твои документы (а точнее их шард ключ)
yopp
теперь твоя задача сделать так, твой вектор состоял из чисел которые равновероятно попадают в разные отрезки
yopp
тут ты можешь поступить двумя способами: порезать свою числовую прямую или подкрутить числа в векторе
yopp
но нужно понимать что ключ просто их client_id — опасен
yopp
у тебя может получится так, что у какого-то клиента так много данных, что в итоге у тебя чанк будет состоять из 1 значения client_id
Alexey
и будет джомбо чанк
yopp
так как числа натуральные, монга не сможет условный 4242 поделить на (4241.0, 4241.5], [4242.5, 4243)
yopp
или наоборот скобки, не помню уже
yopp
плюс толку это иметь не будет, потому что у тебя айдишник один
yopp
так что выбирать ключ надо исходя из этих ограничений
yopp
второй момент: в монге всегда надо планировать схему исходя не из того как ты пишешь данные, а исходя из того как ты их читаешь
yopp
и уже от этого будет зависеть выбор шрад-ключа
Alexey
но в этом случае можно прикинуть сколько документов наберет такой вот клиент_id и подкрутить размер чанка? правильно же?
yopp
нет
yopp
не надо крутить размер чанка
yopp
нужно ключ выбирать нормальный
yopp
например {client_id, date}
Alexey
а..то есть можно сделать составной?
yopp
можно
Alexey
это уже лучше
yopp
но это требует изменения сознания. потому что у тебя получается отрезок внутри которого ещё один отрезок
yopp
на одно значение client_id у тебя будет уникальный диапазон date
yopp
у этого есть очень большой downside: операционная сложность
Alex
мне понравилось у Zalando как делиться по шардам. побитово.
Alex
там правд не монга :)
Alexey
так. и какие от этого последствия? что принесет с собой операционная сложность?
yopp
в первую очередь сложность с тегированием
yopp
вторая сложность с ручным делением существующих чанков
yopp
третья сложность: невозможно делать некоторые вещи
yopp
например в 90% случаев нужность данных падает во времени
yopp
т.е. держать все данные на дорогом железе — бессмыслено
yopp
потому что ими никто не будет пользоваться. как следствие хорошо бы сделать несколько таеров железа, одно подороже и побыстрее для актуальных данных, а другое с кучей стораджа. и поделить данные так, чтоб менее актуальные лежали на дешевом железе, а более акутальные на дорогом
yopp
с {client_id, date} этого не сделать
yopp
а с {date, client_id} у тебя получается монотонно возрастающий ключ
yopp
и тут начинаются пляски с пилением чанков руками
Alexey
т. е. в идельном случае хорошо бы, чтоб клиент_id менялся бы раз в какое-то время, чтобы не достигнуть максимального размера, но тогда бизнес логика теряется ...нда
yopp
не надо чтоб он менялся
yopp
в смысле с позиции бизнес-логики это так себе решение
Alexey
ну и я про то же...
yopp
нужно просто очень хорошо понимать что ты будешь делать с данными и исходя из этого выбирать ключ. понимая все ограничения и нюансы. проще всего это сделать попробовав на тестовом столе пошардить свои данные. собираешь кластер который эмулирует 3x мощных шардов с быстрым io, 3x архивных с медленным io.
yopp
делаешь себе дамп и играешься с ключами, проверя как быстро оно ресторится, как быстро оно потом выбирается
yopp
как теги обновлять и вот это всё
Alexey
так. хорошо. А все-таки, если clien_id будет меняться, возрастая, раз скажем в какой-то период, то тогда такая проблема как минималный диапазон 4241-4241 уходит? так же?
yopp
нет, не уходит
yopp
я не знаю что у тебя за данные, но если ты там хранишь например показы рекламы, у тебя на один client_id вполне может приехать столько докуметов, сколько не влезет в чанк
yopp
по этому шард ключ состоящий из одного поля, в среднем не очень идея
yopp
нужно либо делать составной ключ, либо делать свой собственный
yopp
например текстовый
yopp
правда с текстовым ключом с дапазонами вообще тяжко будет
Alexey
там что-то вроде клиента, который созает данные. раз в полгода-год номер этого клиента меняется. но номер - это да...строка
yopp
ну вот сколько данных можешь создать один клиент
yopp
можно ли взять ещё какое поле для того чтоб сделать по нему compound key
yopp
короче с выбором ключа нет серебрянной пули. всё очень сильно зависит от данных. решение которое подошло в одном случае, может обернуться катастрофой в другом
Alexey
есть примерно представление, что клиент не создаст за год данных больше полгигабайта
yopp
ну вот видишь, «за год»
yopp
всё, алес, включайте дату в ключ
yopp
либо конечно не дату, а не знаю, какую-то ещё пежню
yopp
просто номер какой-то
Alexey
ну год пройдет, сменится client_id данные уже будут наливаться в другом чанке. А этот останется...
Alexey
но если дату включить, то будет монотонно возрастающий ключ и тогда вся запись будет на одном шарде. так же?
Aleksey
Встречал рекомендации делать шардкей самому.
Aleksey
И писать готовым
yopp
ну год пройдет, сменится client_id данные уже будут наливаться в другом чанке. А этот останется...
ты однобоко на проблему смотришь. записать можно как угодно, включая запись в jumbo chunk
yopp
вопрос что ты потом с этими данными делать собираешься