Do Some
Вообще задача - периодически снимать с внешней базы данные и переносить в локальную с удалением из внешней базы.
Пишу свой скрипт потому что mongodump не подходит - не может мержить коллекции на сколько я понял. Если есть решение лучше и стандартными инструментами буду рад узнать об этом.
yopp
yopp
Мержить очень дорого. Если во внешнем источнике полный набор даных, то вставка с версионированим — самый дешевый вариант.
Do Some
Логика такая:
База А
База Б
Имееют одинаковый набор данных кроме одной коллекции. Эту коллекцию нужно перенести с А на Б с удалением с А. Делать это периодически.
Правильно ли я понял что нужно:
1. В начале переноса обновить все документы проставив им, условно говоря поле sync: true
2. Перенести все документы на Б
3. Удалить все документы с установленным полем sync: true
В это время будут добавлятся документы без поля и они не будут удалены.
Так?
yopp
Нет, sync плохая идея. Потому что потом этом его ещё раз придётся обновлять.
yopp
Любое поле которое может выступать как версия. Либо в документе, либо префиксом в _id
yopp
Но зачем удалять и переносить?
Do Some
Мне нужно как-то идентифицировать документ для удаления. Проблема в том что _id меняется почему-то
Do Some
Места мало
Do Some
Деваться не куда надо удалять и переносить =)
yopp
Шардируйте
yopp
Выделите новое блочное устройство
Do Some
Это все понятно, пока что таким путем не получится пойти. Надо костылить.
Anonymous
yopp
Do Some
Заказчик не выделит дополнительные деньги на данный момент, а может и никогда.
yopp
Но при этом он выделяет денег на ваше время?
yopp
Ваше время дешевле чем хранилище?
Do Some
Да выделяет. Предлагаю сконцентрируемся на проблеме.
На сколько я понял на данный момент:
1. Решения стандартными средставами нет и нужно писать скрипт
2. Документы прилетают с изменившимеся ID и на них плагаться нельзя
Может выгребать тупо по created за какой-то период и все?
Nick
не могу догнать, ну вы же куда их копируете, значит там место есть, так чего бы не использовать?
Do Some
Да в том то и дело что тупость все это на данный момент.
Но надо вот такой вариант сделать и если сервис вырастет то там будет уже другое железо и наверняка найдут спеца по монге чтобы он ей рулил.
Выгружать на локальный комп надо там более или менее нормально с железом и копиться данные могут какое-то разумное время.
Do Some
Короче делаю пока вариант с {sync: true} если есть идеи лучше для бомжей - велкам.
Nick
данных сколько в штуках и собственно объеме?
Nick
каков прирост, какая дельта по размеру должна вычищаться?
yopp
Да делайте дампы и все. Зачем их разворачивать?
yopp
Данные вам явно не нужны
yopp
yopp
Если вы старые данные удаляете, а они повторно создаются, то айдищники конечно будут новыми.
yopp
Сделать надежную считалку дельт, это месяцок работы
Nick
за месяцок работы простого прогера можно смело десяток тб докупить, хот ьи медленных
yopp
yopp
Вы из оригинальной базы уделяете документы же
Nick
а как вы опредилил что у документа изменился ид? есть другой уникальный ключ для идентификации?
Do Some
Притом не гуглится проблема а это значит что я где-то ошибся, видимо. Но где не понятно.
yopp
Я вам рекомендую остановиться на простых дампах
Do Some
yopp
Когда вам потребуется их смержить, тогда и будете думать.
Do Some
Мне уже сейчас надо их смержить.
yopp
Зачем?
Nick
тонее лучше спросить а что вы делаете с тем что кудато там скопировали?
Do Some
Чтобы другие люди могли свои выборки по ним делать.
Do Some
yopp
Короче. Ответ на ваш вопрос: встроенных инструментов нет. Разницу между двумя коллекциями вам надо высчитывать руками. Как — вопрос к вашим данным.
Nick
ну вот у вас два хранилища, зачем используется первое откуда вы данные тягаете, и для чего второе?
Nick
что мешает сразу использовать второе
yopp
Вы выбрали убыточную стратегию. 4.5гб в месяц это буквально даже в атласе смешные деньги.
yopp
Особенно если с этим данным работают
Do Some
Ну было бы круто если бы можно было бы ни куда ни чего не таскать а записывать и хранить. Эх!
yopp
yopp
Купить 50гб в год будут дешевле чем вам делать синхронизацию
Nick
скажите начальству что по вашим данным обеспечить целостность данных при копирования в таком режиме пиздец как сложно и их статистика будет всегда кривая
yopp
Это реально баксов сто
yopp
В год!
Do Some
Короче ребзя спасибо за инфу =) Есть над чем подумать в другой раз.
Nick
если прям горит, то на ваших данных и через флаг синка можно работать, но эт пиздец если честно, в один прекрасный момент вы не вывезете количество пришедших данных и ваш "прод" помрет от нехватки места
Max
do_some_thing, слушайте парней, и делайте именно так.
или доводите до сведения владельцев проекта, что попытка скроить сто баксов в год принесёт дикий кошмар.
я вот этого кошмара нахватался, и не могу понять, зачем было экономить копейки и потерять миллион
Max
А тем временем - подкскажите, при шардированном кластере и primary shard в виде MSA, есть возможность запредить secondary становиться мастером?
то есть, если мастер вдруг сдохнет - я хочу, чтобы репликасет/шард был полностью оффлайн или read-only.
или только своими скриптами както?
Nick
Do Some
Max
кроилово ведёт к попадалову.
Max
внутреннюю кухню вытаскивать на свет не буду, но вечный replica lag в праймари реплика сете привел к проблеме:
- сдох праймари
- секондари отставал на ~15 часов. И он после креша секондари стал праймари.
дальше продолжать? :)
Nick
а данные для бизнеса на сколько критичные были?
Max
ну как сказать...
"все пропало", "как такое могло случиться", "делайте что хотите, только верните"
и вот это вот всё.
Max
выразить в финансовом виде не могу
не знаю.
yopp
Max
если примитивно посчитать месячный доход и умножить на часы "потери" данных - ну, около 5 нулей.
yopp
Да. Сломалось все-же?
yopp
Max
Да. Сломалось все-же?
да.
ну и дальше классика - 1 день (!!!) работы одного программера и проблемы решились.
вплоть до того, что за 1 час времени прям сейчас реплика догоняется на 2 часа.
это кактойто дикий восторг, который не могли родить уже пару лет.
yopp
А что сделали?
Max
наврал - 1 час. но всё равно восторг.
сегодня утром при добавлении реплики был рассинхрон 15+ часов, сейчас уже около трёх.
Max
А что сделали?
две вещи.
1. уменьшили поток данных на запись на ~50%
тесты тут еще не делал - буду делать после того как пожар потухнет.
2. поменяли логику работы консумеров, которые из mq очереди пихают данные в монгу.
раньше было, что всовывание документа приводило к апдейту документа в соседней коллекции (инкремент).
сейчас этот инкремент не делается, а данные пихаются в aerospike.
дальше раз в N минут данные в аэроспайке схлопываются и результат едет в монгу.
Max
в общем всё очевидно и примитивно, но гораздо важнее было, чтобы программеры переименовывали "колонки" и меняли цвет иконок.
а когда петух клюнул - все засуетились.
yopp
Делать надо то, что приносит денег. Иногда и петух-driven-development экономически целесообразен ;)