@MongoDBRussian

Страница 329 из 342
Zaur
12.10.2018
04:22:16
Народ, куда копать, как это делается? Операция обновления. Есть два условия. По первому условию из коллекции берём выборку документов. Теперь, если хотя бы один из документов не соответствует второму условию, отменяем весь процесс. Иначе, обновляем документы

Zaur
12.10.2018
05:43:44
А сделать выборку сразу по двум условиям?
Это не одно и тоже же. В моем случае первое условие для выборки, а второе для отмены ВСЕГО запроса

Yurii
12.10.2018
05:45:45
Google
Zaur
12.10.2018
05:46:57
Например пользователь сказал обновить какие-то данные. Но оказалось, что к какому-то из полей одного из документов у него нет доступа. Отменяется всё обновление

Yurii
12.10.2018
05:48:24
Например пользователь сказал обновить какие-то данные. Но оказалось, что к какому-то из полей одного из документов у него нет доступа. Отменяется всё обновление
Ну если у него нет прав на хоть один из документов, этот документ не должен прийти в выборке. Если он приходит в выборке - у тебя плохая архитектура

Ты решаешь не ту проблему. Проблема в том, чтобы в выборке не пришло ничего лишнего. По этому вернусь к первому совету. 2 условия в выборку для обновления

Zaur
12.10.2018
05:51:52
Представь ты пытаешься массово обновить описание статей в каком-то блоге. И вдруг по определенным условиям ты не можешь получить доступ именно к тому параметру статьи, куда ты пытаешься дорваться у ОДНОЙ из статей. Хотя ко всем остальным параметрам имеешь доступ

И если такое стало, нужно откатить изменения во всех уже изменённых

Yurii
12.10.2018
07:07:07
И если такое стало, нужно откатить изменения во всех уже изменённых
я б все-таки сделал так, что все ограничивалось одной выборкой. Но если ты так не можешь, тогда тебе надо думать в сторону временной коллекции, куда ты пишешь обновленные данные, и если все успешно то переносишь в основную, или выгрузить все в память, там сделать все изменения, а потом уже записывать. Но второй вариант плохой количеством ресурсов, особенно, если у тебя будет много данных

Zaur
12.10.2018
07:14:58
Начал транзакцию, проверил все данные, если есть ошибка, отмена транзакции. Если все норм, делаю update. Конец транзакции

Два запроса. Но из-за транзакции и блокировки, это слишком долго. Но у меня есть подозрения что в монге это можно одним запросом сделать. Вот в чём вопрос

Yurii
12.10.2018
07:19:19
Maxim
12.10.2018
07:25:48
Привет! кто-то сталкивался с тем что монга медленно выполняет запросы? либо же драйвер к ней ( node.js, mongoose). При чём по началу всё хорошо - скорость меньше 100 милисекунд, но через день-два скорость падает до 30 секунд. 1) Сервер и монга на aws-е в одном регионе. 2) Данных мало, меньше 10 Мб в сумме. 3) perfomans advisor на монге говорит что всё ок 4) На сервер тоже всё ок - ошибок нету, ресмурсов железки достаточно 5) Конфиг конекшена: { reconnectTries: 30, reconnectInterval: 500, poolSize: Number(process.env.DB_POOLSIZE) || 10, // process.env.DB_POOLSIZE = 20 socketTimeoutMS: 30000, keepAlive: true, useNewUrlParser: true, } 5) раньше грешил на то что я делаю подписку на ченж стрим в монге: const db = mongoose.connection; db.once('open', () => { console.log('db.once(open)') io.on('connection', (socket) => { log.info('Socket connected.'); const changeStream = db.collection('rides').watch(); changeStream.on('create', async () => socket.emit('drivers-map', await queryRidesCoordinates())); changeStream.on('change', async () => socket.emit('drivers-map', await queryRidesCoordinates())); }); }); но кажись проблема не в этом Может есть у кого идеи в чём может быть проблема?

Google
Yurii
12.10.2018
07:49:23
Привет! кто-то сталкивался с тем что монга медленно выполняет запросы? либо же драйвер к ней ( node.js, mongoose). При чём по началу всё хорошо - скорость меньше 100 милисекунд, но через день-два скорость падает до 30 секунд. 1) Сервер и монга на aws-е в одном регионе. 2) Данных мало, меньше 10 Мб в сумме. 3) perfomans advisor на монге говорит что всё ок 4) На сервер тоже всё ок - ошибок нету, ресмурсов железки достаточно 5) Конфиг конекшена: { reconnectTries: 30, reconnectInterval: 500, poolSize: Number(process.env.DB_POOLSIZE) || 10, // process.env.DB_POOLSIZE = 20 socketTimeoutMS: 30000, keepAlive: true, useNewUrlParser: true, } 5) раньше грешил на то что я делаю подписку на ченж стрим в монге: const db = mongoose.connection; db.once('open', () => { console.log('db.once(open)') io.on('connection', (socket) => { log.info('Socket connected.'); const changeStream = db.collection('rides').watch(); changeStream.on('create', async () => socket.emit('drivers-map', await queryRidesCoordinates())); changeStream.on('change', async () => socket.emit('drivers-map', await queryRidesCoordinates())); }); }); но кажись проблема не в этом Может есть у кого идеи в чём может быть проблема?
неправильные индексы, много навешал на модель монгуса... когда ты делаешь выборки, в местах, где не надо менять данные ты делаешь .lean() ?

Maxim
12.10.2018
07:51:03
неправильные индексы, много навешал на модель монгуса... когда ты делаешь выборки, в местах, где не надо менять данные ты делаешь .lean() ?
нет, лин не делаю. там в коллекциях до ста рекордов не больше, индексов пока не создавал - пока не видно наверняка на что они нужны. да и я делаю .select() - по идее это должно обрезать лишние поля документов на уровне БД-шки

да и опять таки - как этим обьяснить что перфоманс теряется со временем?

я уже ума не приложу в чём трабла. поставил сервак пока на ребут каждые два часа (там даунтайм 5 секунд), незаметно, хотя это лютый костыль

Yurii
12.10.2018
07:52:56
да и опять таки - как этим обьяснить что перфоманс теряется со временем?
ну из-за того, что нет индексов, скорее всего, монга пробует закешировать твои выборки, забывает память и своп, вот и получаешь проседание. Да, select - обрезает на момента базы, это правильно. Добавь ещё всюду lean, где нет изменений.

Yurii
12.10.2018
07:55:24
а что к стати lean даёт?
отвязывает твои данные из базы от монгуса, получаешь чистые обьекты. У нас выборка на 3.5к записей шла около 3 секунд, нативным драйвером - 0.7, а монгусом с lean() - 0.8

Maxim
12.10.2018
07:55:45
отвязывает - это как?

Yurii
12.10.2018
07:56:04
отвязывает - это как?
не можешь вызвать на объекте .save(), например

Maxim
12.10.2018
07:56:11
да и я пока юзаю много где монгузовский populate. ... хз как оно на нём работает

Yurii
12.10.2018
07:56:49
да и я пока юзаю много где монгузовский populate. ... хз как оно на нём работает
популейт работает быстрее, чем $lookup, так что не парся

Maxim
12.10.2018
07:57:55
популейт работает быстрее, чем $lookup, так что не парся
а мне говорили что наоборот - что агрегейшен фреймворк работает шустрее - так как на уровне БД-шки

ну из-за того, что нет индексов, скорее всего, монга пробует закешировать твои выборки, забывает память и своп, вот и получаешь проседание. Да, select - обрезает на момента базы, это правильно. Добавь ещё всюду lean, где нет изменений.
а про индексы - по какому принципу их сейчас добавлять если я не знаю где в итоге они реально будут нужны.? я планировал запилить стресс-тесты, но пока рано

Yurii
12.10.2018
07:59:37
а мне говорили что наоборот - что агрегейшен фреймворк работает шустрее - так как на уровне БД-шки
да, сам агрегейш фреймворк работает быстрее, но populate агрегированных данных - лучше $lookup

да, сам агрегейш фреймворк работает быстрее, но populate агрегированных данных - лучше $lookup
с этим у нас тоже был перформенс ишью, выборка длилась около 5 секунд, а когда убрали лукап внутри монги и делали популей уже полученой выборки (50 итемов), то с популейтом скорость стала 0.6 секунды

Maxim
12.10.2018
08:02:37
"но populate агрегированных данных - лучше $lookup" - странно, почему так то?

я вообще хотел запилить аггрегированые вюшки в потрохах которых буде лукап

что бы не делать туёву кучу популейтов

Google
Maxim
12.10.2018
08:03:58
я вкурсе уже)

Alexander
12.10.2018
08:04:00
А lookup исполняет монга

У меня все на lookup, по мне так удобнее

Maxim
12.10.2018
08:05:00
Yurii , спасибо, буду ковырять)

Yurii
12.10.2018
08:16:44
тип лукап работает на всех данных коллекций?
работает на всех, но когда ты делаешь популейт - он делает один запрос в базу - find({_id: {$in: [ids]}}) а lookup на каждый документ делал дополнительный запрос (до 4 версии точно, сейчас не изучал). Тем самым популейт разруливает тем, что потом в памяти связывает полученные объекты

Konstantin
12.10.2018
13:56:44
Всем привет! Есть вопросы про шардинг. Имеется система учета статистики посещения сайтов и ее БД. Ожидается очень активный рост количества сайтов в системе, отсюда встал вопрос масштабирования заранее. Важное условие: все запросы к БД всегда выполняются по одному сайту. В данный момент id сайта имеет тип int, растет инкрементально. Насколько я понимаю, логично сделать shard key из id сайта или на его основе. Вопросы: 1. инкрементально растущий int в качестве shard key - допустимо или плохо? в принципе, есть возможность замапить его на guid например. 2. при добавлении нового шарда нагрузка отбалансируется автоматически? и к чему стремится баланс: к разделению диапазона shard key на равные диапазоны? или учитывается нагрузка на каждый шард и распределяется равномерно она? можно ли как-то влиять на процесс распределения (например указывать диапазон значений shard key для шарда)? Заранее извиняюсь, вопросы возможно очень нубские, поэтому буду рад даже если просто ткнете в ссылки/книги.

Nick
12.10.2018
14:20:30
Всем привет! Есть вопросы про шардинг. Имеется система учета статистики посещения сайтов и ее БД. Ожидается очень активный рост количества сайтов в системе, отсюда встал вопрос масштабирования заранее. Важное условие: все запросы к БД всегда выполняются по одному сайту. В данный момент id сайта имеет тип int, растет инкрементально. Насколько я понимаю, логично сделать shard key из id сайта или на его основе. Вопросы: 1. инкрементально растущий int в качестве shard key - допустимо или плохо? в принципе, есть возможность замапить его на guid например. 2. при добавлении нового шарда нагрузка отбалансируется автоматически? и к чему стремится баланс: к разделению диапазона shard key на равные диапазоны? или учитывается нагрузка на каждый шард и распределяется равномерно она? можно ли как-то влиять на процесс распределения (например указывать диапазон значений shard key для шарда)? Заранее извиняюсь, вопросы возможно очень нубские, поэтому буду рад даже если просто ткнете в ссылки/книги.
1. инкремент - оченб плохо, про это написано в доке по выборку ключа, если не будет вариантов, то монга поддерживает автохеширваоние без изменения самого типа ключа https://docs.mongodb.com/manual/core/sharding-shard-key/#monotonically-changing-shard-keys https://docs.mongodb.com/manual/core/hashed-sharding/ 2. да начнет балансирвоаться само, если собственно включен балансинг - его можно выключать как весь, так и для отдельных коллекций. баланс стремится только к равному количеству чанков, т.е. предполагается, что у вас все равномерно распределено по диапазонам и нет перкосов - это достаточн осерьезная пробелма если у вас данные очень неравномерны по наргрузке и может сложиться ситуация что все горячие данные на одном шарде. монга будет бить на чанки когда они достигнут одного из двух событий - размер выше порога либо количество доков выше опредленного порога. Но тут нужно понимать, что если чунк уже содержит один ключ и его нельяз разделить, то данный чанк будет помечен фагом jumbo и перестанет кудалибо перемещаться. Влиять на распределние можно - есть понятие зон https://docs.mongodb.com/manual/core/zone-sharding/, да и вообще можно ручками/скриптами перекидывать чанки между шардами - ест ьспец команды

Konstantin
12.10.2018
14:29:52
1. инкремент - оченб плохо, про это написано в доке по выборку ключа, если не будет вариантов, то монга поддерживает автохеширваоние без изменения самого типа ключа https://docs.mongodb.com/manual/core/sharding-shard-key/#monotonically-changing-shard-keys https://docs.mongodb.com/manual/core/hashed-sharding/ 2. да начнет балансирвоаться само, если собственно включен балансинг - его можно выключать как весь, так и для отдельных коллекций. баланс стремится только к равному количеству чанков, т.е. предполагается, что у вас все равномерно распределено по диапазонам и нет перкосов - это достаточн осерьезная пробелма если у вас данные очень неравномерны по наргрузке и может сложиться ситуация что все горячие данные на одном шарде. монга будет бить на чанки когда они достигнут одного из двух событий - размер выше порога либо количество доков выше опредленного порога. Но тут нужно понимать, что если чунк уже содержит один ключ и его нельяз разделить, то данный чанк будет помечен фагом jumbo и перестанет кудалибо перемещаться. Влиять на распределние можно - есть понятие зон https://docs.mongodb.com/manual/core/zone-sharding/, да и вообще можно ручками/скриптами перекидывать чанки между шардами - ест ьспец команды
благодарю! ясность появилась, пойду вдумчиво читать ссылки

ghst
12.10.2018
14:36:14
Здравствуйте, как решить проблему с тем что медленный count в монгодб (4.0) если у меня больше 1 мл записей ? пример: db.records.count({“indexed_key”:“string_value”}) на 10 млй записей от 3 до 9секунд

у меня около 1млй записей за час, может ли быть так что изза высокой нагрузки на запись, коунт работает медленно ? может изза постоянной перестройки индексов ?

Andrew
12.10.2018
14:44:06
На сервере посмотри iostat -kx 3

ghst
12.10.2018
14:44:29
у меня все работает в докер контейнерах если что

Andrew
12.10.2018
14:44:31
Процент утилизации диска если близко ко 100, то серв не справляется

Ну контейнер все равно к диску закреплен, можно на сервере, где докер посмотреть диски

Процессор

А count по всей коллекции?

Google
Andrew
12.10.2018
14:45:25
Или с запросом

А сорян

Вижу

Индекс же есть?

ghst
12.10.2018
14:46:09
вот если что експлайн запроса https://pastebin.com/x9sCPbgK

да, индекс есть

Andrew
12.10.2018
14:46:41
Еще одна штука, которая очень помогает ускориться если диск не справляется кидать индексы и файлы на разные тома

В конфиг файле указывается что индексы в отдельную папку, а в этой папке символическая ссылка на другой диск

Мне лично такой подход помог разгрузить сервер даже с большей нагрузкой

ghst
12.10.2018
14:47:56
так, сейчас скажу что дает iostat -kx 3

Andrew
12.10.2018
14:48:09
В общем чтобы понять нужно знать какая утилизация диска, сколько процессор жрет

Nick
12.10.2018
14:48:55
это что за зверь?

ghst
12.10.2018
14:49:11
Еше один нюанс, сторадж монги находится на NFS сервере, который в одной виртуальной сетке но на отдельном сервере

"version" : "4.1.3",
https://hub.docker.com/r/bitnami/mongodb/

Nick
12.10.2018
14:50:43
а постабильнее не хотите?

ghst
12.10.2018
14:51:06
? могу откатить на более стабильную)

Nick
12.10.2018
14:52:42
прост 4.1 девелоперская ветка

ghst
12.10.2018
14:54:04
смотрю что на диск запись 165мб/с

а сколько норма для ссд диска тогда ?

Google
Nick
12.10.2018
14:55:46
какие нормы? ищите что заявлено производителем и равно ли оно в точности тому что у вас по нагрузке, а так же окружению, свежести дисков и партии

тогда может какуюто норму и поулчите, а так исключительно нагрузочное тестирвоание под ваш ворклоад на вашем железе с вашими операционками и дровами

ghst
12.10.2018
14:57:24
к сожалению я использую digitalocean, сетап такой, что на нодах работают монго и они пишут в отдельный сервер по NFS, сеть между ними виртуальная, я проверю сейчас нагрузки на нфс сервере и на самих нодах

Nick
12.10.2018
14:57:49
NFS - самое поганое что может быть для БД

ghst
12.10.2018
15:00:15
спасибо, я попробую вариант с хранением на самой ноде протестировать

Nick
12.10.2018
15:01:42
спасибо, я попробую вариант с хранением на самой ноде протестировать
если вы хотя бы индексы перенесете на локальынй диск то получите дикий буст по запросам, которые покрываются индексами

ghst
12.10.2018
15:02:51
это я могу попробовать, где стоит смотреть в конфиге о пути хранения индексов ?

Nick
12.10.2018
15:13:25
тут не помогу, знаю что это можно сделать, но сам не делал

Страница 329 из 342