@MongoDBRussian

Страница 239 из 342
yopp
10.05.2018
12:25:12
Если вы выбираете по пользователю. Если просто ордера по тикеру то два отдельных индекса: id и symbol

И по возможности не используйте просто id как имя ключа

Укажите что это за id

Anton
10.05.2018
12:26:50
Если вы выбираете по пользователю. Если просто ордера по тикеру то два отдельных индекса: id и symbol
в том и дело, что мне не нужно будет доставать только по тикеру) А всегда пользователь-тикер) Окей, с id понял, спасибо)

Google
Alexey
10.05.2018
12:46:56
Всем привет. Заметил странность...При добавлении нового шарда и окончании баллансировки, на старых занятое место не уменьшается, а просто перестает расти. Так и должно быть?

yopp
10.05.2018
12:49:59
В смысле не отдаёт освободившееся место назад фс

Можно в stats посмотреть сколько свободного места осталось внутри файла

Alexey
10.05.2018
12:51:01
а чего делать-то? resync?

yopp
10.05.2018
12:51:21
Зависит от желаемого результата

Новые данные будут использовать освободившееся место

Alexey
10.05.2018
12:52:23
если желаемый результат уменьшить сесто на дисках, поможет удаление и перезалив реплики?

yopp
10.05.2018
12:52:37
Да. Но зачем?

Alexey
10.05.2018
12:53:05
так место не резиновое...не очень понятно сколько реально данных и когда оно опять начнет расти

yopp
10.05.2018
12:53:24
Очень даже понятно

Монга вам в статистике коллекций всё показывает, включая свободное место внутри выделенного под wt хранилища

Если у вас нет задачи снять лишние диски, то вам ничего не надо делать.

Google
Alexey
10.05.2018
12:56:03
угу. ясно. Но если в теории, то ресинк реплики зальет данных именно столько сколько есть?

yopp
10.05.2018
12:56:36
Но я считаю это пустой тратой времени и денег

У вас есть в collStats все необходимое, включая свободное место в хранилище (см block-manager / file bytes available for reuse)

Alexey
10.05.2018
12:58:32
ок. понятно. А вот добавил я, скажем, новый шард. Туда отбалансировались коллекции, все поровну. Места значительно меньше чем, на старых. Я так понимаю, это и есть примерно реальное количество данных?

yopp
10.05.2018
12:59:16
Не понимаю вопроса

Что значит «реальное количество данных»?

Есть сами документы. Есть их размер в несжатом виде и в сжатом виде. Есть индексы и их размер. Есть размер файла в котором хранятся индексы и документы

Alexey
10.05.2018
13:02:44
ну есть два шарда. скажем, каждый по 2,5 тб. добавляется третий, начинается балансировка. Закончилась балансировка. чанки все поровну на третьем оказалось 1,5 тб. Хотя колво чанков одинаковое. Т. е. эти 1,5 тб - это и есть место равное объем - available for reuse ?

yopp
10.05.2018
13:03:36
И ещё раз спрошу: какой из размеров вы сейчас указываете?

Alexey
10.05.2018
13:04:02
размер файла

на фс

yopp
10.05.2018
13:05:06
Это плохой способ мерять размер данных

У вас внутри монги уже есть инструменты же

https://docs.mongodb.com/manual/reference/method/db.collection.getShardDistribution/

Вот например

Более того, чанки обычно разных размеров и равномерное распределение по числу чанков не гарантирует равномерного распределения по размеру

Alexey
10.05.2018
13:06:37
кароче, если заресинкать все реплики на всех шардах, то свободного места на станет примерно столько, сколько на самых свежих шардах. И да..данные не удаляются, только растут.

yopp
10.05.2018
13:07:10
Наверное вам нужно лучше сформулировать проблему, потому что я совсем не понимаю в чём она

Размер файлов вас не должен вообще беспокоить, кроме тревоги по недостаточному месту на блочном хранилище.

Google
yopp
10.05.2018
13:08:45
Монга сама неплохо справляется с управлением местом. Если вы ничего кроме монги не эксплуатируете на этом железе, то забудьте вообще про эту метрику.

Если там ещё что-то кроме монги, но это надо унести с этой железки

Остальное вам нужно смотреть внутри монги

Alexey
10.05.2018
13:10:25
ну проблема состоит в том, что я не вижу прогноза когда пора добавлять новый шард. т. е. я не очень понимаю когда опять файлы начнут расти, а место на фс умньшаться. Я понял, что можно ходить в stat коллекции и считать вручную, не самый быстрый и очевидный путь, как мне кажется, особенно если автоматизировать это в мониторинге

yopp
10.05.2018
13:11:14
Считать из stats самый правильный и очевидный путь

Alexey
10.05.2018
13:12:10
я понял. спасибо. еще вопрос при операции delete место wt обратно тоже не возвращает?

yopp
10.05.2018
13:12:56
Не думаю что wt вообще возвращает место.

Alexey
10.05.2018
13:13:19
ясно. понятно, спасибо

yopp
10.05.2018
13:13:28
Какой в этом смысл? Copy on write будет дальшеь использовтаь освобождённые страницы

Единственный резонный сценарий, когда вы удалили очень много данных из коллекции и их столько уже никогда не будет.

Возьмите https://github.com/db-ai/mongo_collection_exporter

Alexey
10.05.2018
13:16:09
ну было бы удобно...удалил часть данных - сразу видно на фс места меньше стало, никуда ходить не надо, ни в какие статистики, json парсить там, вот это все...

yopp
10.05.2018
13:17:21
Не вижу ничего удобного. Вы пытаетесь по размеру чёрного ящика сделать какие-то выводы о происходящем внутри.

Вам нужно observability внутри монги

Иначе у вас потечёт место, а вы даже не узнаете почему

Плюс в чём смысл отдать место, если оно практически сразу потребуется обратно

https://docs.mongodb.com/manual/faq/storage/#how-do-i-reclaim-disk-space-in-wiredtiger

Alexey
10.05.2018
13:23:14
тогда мне не очень понятно формула, по которой считается доступное место... available for reuse по каждой коллекции + что?

yopp
10.05.2018
13:29:13
Wt при создании коллекции просит фс выделить ему файл с каким-то размером. Это файл делится на страницы. Когда монга записывает данные, она использует пустую страницу и помечает её как занятую. Когда монга обновляет данные, она использует пустую страницу для сохранения изменённой копии, помечает ее как занятую. Старая страница с оригинальными данными помечается как освобожденная когда все «сессии» в WT использующие эту страницу будут завершены. Когда монга удаляет данные, она помечает страницу как свободную когда все «сессии» будут завершены. Занятое место внутри файла равно сумме размеров занятых страниц. Свободное место внутри файла равно сумме размеров свободных страниц. Когда в файле заканчиваются свободные страницы, WT просит фс увеличить размер файла.

Смотрите на хранилище как на heap with reference counting GC

Google
Alexey
10.05.2018
13:33:10
ага. Значит, при апдейте тоже самое происходит, что и при удалени. Записывается фактически новая страница...

yopp
10.05.2018
13:33:33
Это и есть Copy on Write.

Alexey
10.05.2018
13:35:26
ясно. спасибо. Значит, итого, реально свободное место равно семме пустых страниц во всех коллекциях + свободное место на ФС. Правильно я понимаю?

точнее не сумме, а свободного места на этих страницах

Alexey
10.05.2018
13:37:22
ок. пойду парсить джейсон

yopp
10.05.2018
13:38:18
Но учитывайте что свободное место внутри коллекции может быть использовано только этой коллекцией. Если reusable например суммарно 50Гб, это не значит что любая коллекция сможет эти 50Гб использовать.

Alexey
10.05.2018
13:39:10
ага. это понятно

Anton
10.05.2018
14:02:55
[{'accountId':'12345@var', 'symbol':'ABC', 'id':'hoba3', 'status': '123123' }, {'accountId':'12345@var', 'symbol':'AAPL', 'id':'hoba5', 'status': 'mixed' }, {'accountId':'12322245@var', 'symbol':'ABC', 'id':'hoba1', 'status': 'executed' }, {'accountId':'12345@var', 'symbol':'ABC', 'id':'hoba3', 'status': 'afwfesfsefsef' }, {'accountId':'12322245@var', 'symbol':'AAPL', 'id':'hoba2', 'status': 'kisooda' }, {'accountId':'12322245@var', 'symbol':'AAPL', 'id':'hoba4', 'status': 'car' }] Допустим у меня есть массив объектов, я ведь могу одним апдейтом монги их все обновить? Думал, что через $in прокатит, но нет Может кто подсказать(гуглил, ничего не нашел)

Anton
10.05.2018
14:11:23
https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/
но ведь это не совсем то Тут когда ты в коллекции хочешь у многих записей поменять какое-то поле, а не когда у тебя нв вход в бд идет массив объектов и на основании их айдишников нужно поставить опредленные поля у объектов уже находящихся в базе на основании поля которое находится в передаваемом объекте Видимо я неправильно пояснил задачу

Yaroslav
10.05.2018
14:12:41
> Тут когда ты в коллекции хочешь у многих записей поменять какое-то поле, а не когда у тебя нв вход в бд идет массив объектов и на основании их айдишников нужно поставить опредленные поля у объектов уже находящихся в базе на основании поля которое находится в передаваемом объекте ??

Anton
10.05.2018
14:16:16
> Тут когда ты в коллекции хочешь у многих записей поменять какое-то поле, а не когда у тебя нв вход в бд идет массив объектов и на основании их айдишников нужно поставить опредленные поля у объектов уже находящихся в базе на основании поля которое находится в передаваемом объекте ??
Есть массив объектов, пример я кинул выше, которые я хочу обновить в базе, а точнее поле у свойства status. Могу ли я за один раз(а не 20 и тд раз, если у меня 20 объектов) обновить нужные мне записи на основании id и status, которые я передаю в монгу грубо говоря с одним объектом за раз это выглядит так mongo.db.collection("emails").update({'accountId': data.accountId, 'symbol': data.symbol,'orders.id': data.id},{$set:{"orders.$.state": "true"}})

Но делать кучу запросов в базу в течении пары секунл- это юзлесс

Anton
10.05.2018
14:22:31
ну вот походу так нельзя и надо делать чутка по-другому

yopp
10.05.2018
14:23:20
Но делать кучу запросов в базу в течении пары секунл- это юзлесс
Порекомендую ещё раз: не пытайтесь оптимизировать с самого начала.

Оптимизировать надо когда у вас уже есть настоящие бутылочные горлышки

Stepan
10.05.2018
14:31:22
Но если с самого начала можно спланировать так, чтоб горлышок было поменьше, то почему нет?

Google
yopp
10.05.2018
14:34:21
Предварительная оптимизация — деньги на ветер

Timur
10.05.2018
14:35:38
Это прям Цель Голдратт и теория ограничений)

yopp
10.05.2018
14:37:32
Проектов которые можно эффективно оптимизировать с самого начала практически не существует. Выгоднее вложить силы в инструменты, которые позволят видеть бутылочные горлышки и быстро выкатывать изменения.

Алишер
10.05.2018
14:37:36
Подскажите, когда Mongos перегружаю , какие нибудь опасности?

yopp
10.05.2018
14:37:57
Алишер
10.05.2018
14:38:41
а может быть такое что, что от клиента пришли данные, но монгос не успел их отдать шарде?

yopp
10.05.2018
14:41:07
а может быть такое что, что от клиента пришли данные, но монгос не успел их отдать шарде?
Да, конечно. Но если вам это важно, клиенты должны использовать соотвествующий writeConcern https://docs.mongodb.com/manual/reference/write-concern/

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

Алишер
10.05.2018
14:43:31
да, именно. почитаю, спасибоЯ!

yopp
10.05.2018
14:45:24
Сколько лет уже висит: https://jira.mongodb.org/browse/SERVER-4274

Алишер
10.05.2018
14:46:15
неужели так сложно

yopp
10.05.2018
14:48:50
https://docs.mongodb.com/manual/reference/method/db.shutdownServer/ Пишут что clean and graceful но я бы проверил на тестовом стенде

Alexandr
10.05.2018
16:13:42
Товарищи, посоветуйте как решить задачу. Я получаю по API кучу товаров из магазина. Записываю их как документы в коллекцию. Периодически я хочу обновлять этот список, получая данные с магазина. Как это лучше всего сделать?

(товары могут добавиться, удалиться, а так же может измениться информация о них)

Ivan
10.05.2018
16:15:06
Джоб сделайте, который будет периодически обновлять

Alexandr
10.05.2018
16:15:56
В том то и вопрос - как сопоставить ту коллекцию, что у нас в базе с той инфой, что у нас пришла.

yopp
10.05.2018
16:17:46
Это задача синхронизации данных. Тут нет каких-то универсальных рецептов

Alexandr
10.05.2018
16:18:17
?

yopp
10.05.2018
16:18:21
Вы можете делать или полную замену или вычислять дельты

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