Nick
спасибо за ответ, я приведу реальные данные и опишу более подробно чего хотелось бы в результате
такто понятно чего хочется, но если уже работающий прод с реальными данными, то надо бы сразу тестировать на них. Сдампить на стейдж если на проде экпериментировать не позволяют. Хотя бы десятую часть, сохранив распределение как на проме и выполнять реальные запросы, которые например были залогированы в реальности
Alex
Проверил на большом объеме, с тем же распределением что и на проде (прям взять дамп с прода нет возможности) после указания { url: {$exists: true} } все стало +- ожидаемо эффективно > db.pi_with_url.count() 5000000 > db.pi_with_url.count({createdAt: { $gte: 1671518585 }, url: {$exists: true}}); 100040 // с возрастом до одного года > db.pi_with_url.count({createdAt: { $lt: 1671518585 }, url: {$exists: true}}); 4899960 // старые, старше года explain через время url у большинства документов будет удалено, останутся только "свежие" документы explain без url на старых документах (для которых createdAt < 1671518585) добавилось условие у FETCH url: {$exists: true}, как и писал выше, кажется не логичным ведь в индексе итак только такие ссылки на документы но не страшно, прочел все про индексы в MongoDB: The definitive guide, но там про такое поведение partial индекса не былоо может кто посоветует материал как оно под капотом работает?
Alexander
Ребят ставлю Монгу в кластер, не ставится, говорит что требуется у проца avx cat /proc/cpuinfo | grep avx - говорит что нет его... как быть?
Alexander
1. В виртуалке включить avx поддержку 2. Поставить старую версию mongo 4.4.6
Я написал в тех поддержку хостинга они почему то говорят что не могут этого сделать
Andrey
Mar
можно ещё с исходников собрать https://github.com/mongodb/mongo/blob/master/docs/building.md
Andrew
Здраствуйте, при билде сервера получаю такую ошибку
fenogentov
из гошного драйвера в цикле в 3 потока идут запросы к кластеру из 4 серверов базы
fenogentov
и сервера 6 ядерные в потолок
fenogentov
как можно оптимизировать запросы?
fenogentov
т.е. в цикле идут запросы к монге, ограниченно в 3 потока а нагрузка прям в потолок
fenogentov
неужели кластер из 4 шестиядерных серверов может так так сильно нагружаться всего 3 постоянными потоками запросов?
fenogentov
не, индексы сделал, без индексов падало с дедлайном
Nick
не, индексы сделал, без индексов падало с дедлайном
тогда дальше уже специфка, что за запросы, как много их
fenogentov
тогда дальше уже специфка, что за запросы, как много их
filter := bson.M{"name_field": "something"} var result bson.M err := collection.FindOne(ctx, filter).Decode(&result)
fenogentov
в цикле такие запросы (порядка 5 миллионов) но одновременно запускается всего 3 воркера
Nick
и поток то какой?
fenogentov
запрос просто узнать что есть документ с значением "something"
fenogentov
Nick
в смысле?
rps суммарный на кластер
fenogentov
5млн, и постепенно посылаются одновременно запускаются 3 запроса, как ответ пришел запускается следующий
fenogentov
судя по статистике 1000 за минуту (в данный момент)
Nick
это 10 в секунду на воркера. Мониторинг монги что показывает ? во что упираетесь
fenogentov
это 10 в секунду на воркера. Мониторинг монги что показывает ? во что упираетесь
сначала в проц, а потом и мемори все 16 гигов выжирается
fenogentov
4 реплики
fenogentov
Если не ошибаюсь
Nick
4 реплики
в запросе read concern какой указан? и нагрзука на вскех нодах одинаково большая?
fenogentov
Второе - одинаково. Первое не помню щас.
Nick
Второе - одинаково. Первое не помню щас.
нагрузка на все реплики намекает что на все летят запросы и либо это балансировка, либо read concern majority, либо ктото еще кроме вас грузит кластер
fenogentov
Спасибо
mfgskv ✙
guys, есть надобность в монге хранить список файлов, часть из которых есть в корзине юзеров. Есть потребность онли в двух кверях - GetStandardFiles, GetBinFiles. Файлы часто будут перемещаться между Bin и Standard, global search может и будет но приемлимо сделать поиск сначала по standard хранилищу а потом добавить в серч резалты файлы в бине - скорость не в прямом приоритете. Как лучше хранить данные? Две коллекции или boolean files + compound index по типу user id + boolean isBin. Read/Write rate документов особо не продумать, будут и читаться и добавляться часто (у удаление lifecycle - isBin=true, until:+7 days а потом чистим). Изменяться никогда.
mfgskv ✙
скорее интерсует наскольок норм будет работать boolean индекс, от этого по сути решение зависит
Nick
скорее интерсует наскольок норм будет работать boolean индекс, от этого по сути решение зависит
селективность булеан индексов крайне низкая, поэтому большого профита оно принесет только если есть большой перекос и условно только 1% будет isBin:true а остальное false и тогда для запросов где будет указано isBin:true будет хорошо, но для isBin: false мало пригодно
mfgskv ✙
Понял. Спасибо.
Ящик водки
Вы хамите, но я вам отвечу. Других способы есть, искали ли вы их? Skip limit - самый примитивный способ реализации pagination в лоб. Его использует, когда данных мало, когда вызовов со skip мало, и да он тут работает. Если у вас много skip limit(вы об этом выше писали) - это означает, что у вас или безысходная ситуация, или вы ошибочно составили структуру документа, и не можете итерироваться по документам, кроме как требовать от mongodb делать skip. Явление низкой производительности MongoDB со множеством skip - это давно и часто обсуждалось без привязки к вообще какому-либо языку разработки. Например, вопрос, ответ: https://www.mongodb.com/community/forums/t/what-is-the-fastest-way-to-filter-documents-with-pagination-in-collection-with-millions-of-records/209413/3 "MongoDB" как бы пишет, что по мере увеличения количества skip, ,будет медленно, и что можно придумать: https://www.mongodb.com/docs/manual/reference/method/cursor.skip/#behavior Вторая проблема со skip - может возникнуть с консистентностью данных, если в базу пишут более или менее активно. Может просто не "кидать камни" в разрабов почти единственной библиотекой работы с mongodb, а просто погуглить, то найдутся и вопросы, и ответы. Вот тут есть решения и даже красивые картинки с замерами производительности. https://medium.com/swlh/mongodb-pagination-fast-consistent-ece2a97070f3 Можно придумать на backend-е еще более экзотические способы. Но в целом, если у вас много skip limit при запросе и много данных - значит вы точно что-то не то делаете.
решения перечисленные там - туфта ага, предлагают использовать регулярки 😂 и при чем тут структура документа? "ошибочно составили структуру документа" почитай для начала в core, как работает skip параметр с выходным условием .find() и каким образом при этом итерируется курсор с условием итерации по индексу. других способов не существует пропустить N документов удовлетворяющих D условию и чуши нагаллюционировал про консистентность ;) почитай для начала в чем отличие консистентности от изолированности, да и вообще о принципах ACID. а на разрабов драйвера - я корректно наезжаю и по делу. дизайн функций не стандартизирован, в одном случае я получаю исключение - что является самым оптимальным решением, в другом случае не получаю ничего. так быть не должно.
Ящик водки
и кстати, ответ очень похож на галлюцинацию всяких чатов жпт, админы запрещали это делать тут - писать ответы с помощью жпт и подобной ереси
Dmitry
Доброго дня. У меня в бд появляются дубли, только если интервал запроса к одному документу < 5 мс. Считаю, что проблема в блокировках на уровне бд. Подскажите, какие варианты решения возможны? Добавлять uid, кажется неправильным, нужно будет на уровне кода обрабатывать ошибку при ошибочной повторной вставке. Не могу найти в доке можно ли как-то крутить таймауты для локеров и вообще как их добавить на уровне коллекций. Подскажите мануал нормальный или вариант решения
Dmitry
Что тут подразумевается под дублями?
Документ в коллекции, значения всех его полей идентичны уже имеющемуся документу в этой коллекции , за исключением _id - на 1 больше, чем в идентичном документе.
Nick
Документ в коллекции, значения всех его полей идентичны уже имеющемуся документу в этой коллекции , за исключением _id - на 1 больше, чем в идентичном документе.
Это проблема двойной вставки. Зачем дважды доки вставляете? Если это нормально для приклада, то нужно навесить уникальные индексы, которые будут предотвращать дубль
Dmitry
Это проблема двойной вставки. Зачем дважды доки вставляете? Если это нормально для приклада, то нужно навесить уникальные индексы, которые будут предотвращать дубль
Обращение к бд идет из скрипта. Дубль наблюдается только, когда запущены два скрипта (процесса) условно параллельных (< 50 мс интервал) процесса. Почему тогда при работе только одного процесса нет дублей?! Думаю очевидно, что проблема в рекурентном доступе на уровне бд.
Ящик водки
Доброго дня. У меня в бд появляются дубли, только если интервал запроса к одному документу < 5 мс. Считаю, что проблема в блокировках на уровне бд. Подскажите, какие варианты решения возможны? Добавлять uid, кажется неправильным, нужно будет на уровне кода обрабатывать ошибку при ошибочной повторной вставке. Не могу найти в доке можно ли как-то крутить таймауты для локеров и вообще как их добавить на уровне коллекций. Подскажите мануал нормальный или вариант решения
самым оптимальным решением будет добавить уникальный индекс и обрабатывать на уровне приложения, так мы получим наилучшую изолированность и консистентность. второй, по убыванию по эффективности вариант - использовать поиск и обновление уже существующей записи, что ты не обрабатывать исключения, но тогда вероятность дублей остаётся ненулевой. третий подход - использовать очереди для записи, что бы 2 скрипта складывали в общую очередь то, что предполагается записывать, а в очереди удалялись дубли
Vladimir
Подскажите используете ли view, есть ли задержки или подводные камни при использовании?
Dmitry
что делают скрипты?
Тянутся актуальные данные от интегратора, кладутся в массив A. Удаляются все документы из коллекции. В цикле из массива A достается объект и сохраняется в коллекцию.
Dmitry
Раньше это было в основной логике монолита. И каждый запрос к ресурсу содержал эту логику. При определенном рпс начали появляться дубли в бд и как следствие на фронте. Я вынес эту логику в джобу, админы настроили ее запуск по крону. Но по какой-то причине в логах вижу, что она запускается дважды условно параллельно. Не хочу зависеть от админских настроек, не хочу переписывать логику и фильтровать дубли в ней. Хочу сделать блокировку на уровне коллекции средствами монги или средствами кода, добавив коллекцию с блокировками.
Nick
хотя очевидно что надо просто пересмотреть то как запускается джоба и это должно полностью рулиться на программном уровне без участия админов
Dmitry
тут только уникальный индекс или транзакции
Транзакции для монги я не делал и сейчас это кажется оверхэд для проекта и тем более для этого бага. Возможно стоит рассмотреть uid.
Dmitry
хотя очевидно что надо просто пересмотреть то как запускается джоба и это должно полностью рулиться на программном уровне без участия админов
Мне как разработчику и начальству удобно, что крон джобы можно конфигурировать без моего участия, без нового релиза, без отдела тестирования
Nick
Я про уникальный индекс
если имеется в иду сгенерить ид для каждой записи, тогда это вполне решение. Главное чтобы оно всегда было одинаково для одной и той же записи
Dmitry
отсутствие отдела тестирование заметно)
Как раз в тестовом контуре все ок, джоба отрабатывает единожды)
Nick
Как раз в тестовом контуре все ок, джоба отрабатывает единожды)
и вы серьезно вместо того чтобы привести в соответствие тест стенда к прому и воспроизвести проблему занимаетесь решением одного бага, фикс которого не сможете протестировать без выкатки в бой?
Dmitry
К счастью или сожалению настройка окружения не в моих полномочиях. И туда не пускают - у нас эквайринг со всем вытекающим. По дубляжу джобы на админов таску заведу после того, как закрою текущий баг и прямо из джобы в лог выведу кол-во запущенных php процессов:)
Dmitry
а причем тут uid тогда
А хз, я почему-то решил, что это сокращение от unique key/index)
Vlad
Подскажите. Nodejs. Вытаскиваю напр. 100 документов, в каждом из них в одном из полей 4к ObjectId (рефернсы на другую колекцию), это потребляет кучу памяти. Более того это поле дублируется в каждом доке и можно было бы переиспользовать рефенсы, но нет каждый ObjectId - отдельный буфер. Если конвертнуть в строки - то памяти потребляться будет намного меньше. Можно как то вклиниться в десериализацию, чтобы переиспользвать рефернсы на одинаковые ObjectId? Можно ли возвращать ObjectId строкой для всего документа, а не только, где я прописал $toString?
Nick
А как мне это поможет?
это было из вопроса про uid, если это не уникальный идентификатор то это не в тему поулчается
Vlad
экономия на спичках. А зачем вытаскивать эти массивы с 4к объектов?
Так логика обновления работает, делаем дифф с прошлым значением
Nick
Так логика обновления работает, делаем дифф с прошлым значением
обычным апдейтом сразу в базу внести изменение не получается?
Vlad
Уже так все написано, переписывать пока не собираемся
Vlad
экономия на спичках. А зачем вытаскивать эти массивы с 4к объектов?
Не Экономия на спичках В прототипе переиспользовал референсы - потребление упало с 1200 до 200 мб
Nick
Не Экономия на спичках В прототипе переиспользовал референсы - потребление упало с 1200 до 200 мб
не понимаю термина "переиспользовал". Вот есть у вас массив из ObjectId. Вы просто заместо них используете строки?
Vlad
не понимаю термина "переиспользовал". Вот есть у вас массив из ObjectId. Вы просто заместо них используете строки?
В моем случае почти у всех доков дубликаты ид в большом поле, я просто юзал пул object id, если уже такой ключ был - беру объект с пула
Vlad
Примерно тоже самое было бы со строками, так как их сама бы нода переиспользовала со стека, а не хипа
Ящик водки
а причем тут uid тогда
я ему написал 3 варианта решения, очевидно, человек пришёл свою точку зрения отстаивать, а не читать ответы на вопросы и делать как полагается