
SilencerWeb
23.01.2018
11:38:45
а тут вопросы, связанные с mongoose задавать можно?

Canyon
23.01.2018
23:10:50
Всем привет
Подскажите утилитку для графического моделирования коллекций и связей по полям между ними. Желательно так что можно было показывать менеджерам и начальству :-)

Naniwa
24.01.2018
00:51:59
может это подойдет https://robomongo.org/

Artem
24.01.2018
06:37:09
Коллеги, а есть какой нить вменяемый гуй, кроме 3t studio, а то они с последним обновлением совсем скурвились.

Google

IGOR
24.01.2018
06:44:03

Artem
24.01.2018
06:47:38
Меня просто совсем выморозила блокировка списка сессий, и возможность пользоваться только тремя коннектами в фряшной версии. Я попробовал mongobuster но он мне не очень понравился, так как все таки web-овый клиент

Ilya
24.01.2018
09:50:46
Ребята, а если надо вставлять документы пачками, но в коллекции могут уже эти данные быть, и во вставляемых данных нет параметра _id из монги, но есть другая уникальная пара параметров.
То правильно ли я понимаю что правильнее сначала грохнуть существующие которые отфильтровать по этим уникальным свойствам - а потом производить вставку?

IGOR
24.01.2018
09:52:43

Ilya
24.01.2018
09:53:30
ну там может быть новые документы, а в старых могут быть изменения, и надо как бы синхронизировать монгу с этим

IGOR
24.01.2018
09:55:01

Ilya
24.01.2018
09:58:24
ну если для каждого документа далать отдельный запрос это долго, надо массовые операции, допустим грохнуть массово и массово вставить - так будет быстро

yopp
24.01.2018
09:59:26

IGOR
24.01.2018
10:00:08

Ilya
24.01.2018
10:00:54
ну а делать по каждому документу файнд и потом апсерт - это типа лучше?

Google

yopp
24.01.2018
10:03:15

Ilya
24.01.2018
10:03:37
должен остаться тот который в новом списке
монговский должен будет перезаписаться

yopp
24.01.2018
10:04:18
Т.е. конфликт автоматически разрешается в пользу новых данных?

Ilya
24.01.2018
10:04:25
ага
я больше склоняюсь к bulk_write в котором много запросов upsert

yopp
24.01.2018
10:04:49
Проблема с удалением перед вставкой — отсутсвие данных.
Документы в монге обновляются?
И о каком количестве мы говорим?

Ilya
24.01.2018
10:13:22
на данный момент доступ к документам в монге есть, но изменения которые в них внесены не критичны если будут перезаписаны.
количесвто несколько тысяч, меньше ста

IGOR
24.01.2018
10:51:28

yopp
24.01.2018
10:54:53
никак не может

Ilya
24.01.2018
10:56:11
ну поэтому я тут и спрашиваю)
в итоге то через Bulk Write можно сделать хотя бы по 100 update с установленным upser=true?

yopp
24.01.2018
10:56:24
Я бы не стал делать bulk write

IGOR
24.01.2018
10:56:39

Ilya
24.01.2018
10:56:47
о_О
что в нем плохого?

yopp
24.01.2018
10:56:59
Поступите проще: создайте uniqe compound индекс на поля которые уникальны

Ilya
24.01.2018
10:57:09
он и так создан

yopp
24.01.2018
10:57:17
и дальше просто сделайте пачку upsert, последовательно обрабатывая ошибки, если возникли

Google

Ilya
24.01.2018
10:57:34
блин ну это же неправильно

IGOR
24.01.2018
10:57:43

Ilya
24.01.2018
10:57:44
зачем столько времени тратить на сеть?

yopp
24.01.2018
10:57:44
с bulkwrite будет невозможно определить конечное состояние если случилась ошибка при вставке
ну пусть даже секунда

Ilya
24.01.2018
11:00:09
в общем как то получается что решение в лоб лучше всех остальных - странно

yopp
24.01.2018
11:00:18
Make it work, make it right, make it fast (если дожили)
что странного?

Ilya
24.01.2018
11:00:54
ну наверно в монго так принято - я просто еще не привык)

yopp
24.01.2018
11:01:09
Bulk операции в монге это исключительно экономия на wire transfer

IGOR
24.01.2018
11:01:27

Ilya
24.01.2018
11:01:49
да, норм все - это реально редкая операция будет

IGOR
24.01.2018
11:03:34

Max
24.01.2018
11:19:23
Bulk операции в монге это исключительно экономия на wire transfer
У нас тут не так давно на такой инсерт переключились, по 100 записей за раз на данный момент.
суммарная скорость вставки стала быстрее... может быть не на порядок, но раз в 5 точно.
проверяли по скорости рассасывания данных из очередей.
Все внутри локалки, на wire transfer не оч похоже.
Узким местом был (и есть) диск, на котором индексы.
так что в определенных кейсах это приносит хороший профит.


yopp
24.01.2018
12:59:58
У нас тут не так давно на такой инсерт переключились, по 100 записей за раз на данный момент.
суммарная скорость вставки стала быстрее... может быть не на порядок, но раз в 5 точно.
проверяли по скорости рассасывания данных из очередей.
Все внутри локалки, на wire transfer не оч похоже.
Узким местом был (и есть) диск, на котором индексы.
Из-за того что в локальной сети задержки в основном обусловленны не физической передачей данных, а их обработкой в процессе передачи, вам только кажется что в локальной сети нет задержек. Но в локальной сети действуют те-же самые законы физики что и везде :)
Быстрее света информацию не передать. За 1 миллисекунду свет может преодолеть всего ~300км метров, а за 1 микросекунду соотвественно всего 300 метров, а за 1 наносекунду всего 30 сантиметров. Или ~4 нс на каждый метр. И это только время необходимое на физическую передачу сигнала в одну сторону.
Дальше у нас есть 7 слоёв OSI модели, каждый из которых вносит свои задержки. Например в L1 популярен Ethernet. В этом протоколе есть пауза между передачей пакетов. Длинна паузы 96 «битовых пульсов». «Битовый пульс» считается как (1 / скорость интерфейса). Т.е. для 10E это ~0.1мс, а для 1000E ~1нс.
Т.е. мы ещё даже не начинали считать сколько времени устройствам нужно на обработку и уже получили 5 нс задержки на каждый метр.
Вместе с задержкой на обработку, без специальных оптимизаций и использования специального оборудования, задержка в одну сторону будет измерятятся в сотнях микросекунд. Даже loopback интерфейс, который по сути не взаимодействует с сетевым оборудованием, даёт задержки в десятки микросекунд.
Теперь посчитаем очень упрощённо.
Так как монга предпологает последовательное исполнение команд, ей нужно отправить запрос и дождаться ответа от сервера. Чем меньше размер запроса и меньше работы делает монга, тем заметнее становятся задержки. Предположим что мы можем передать запрос, со всеми задержками, за 500мкс, а монга может выполнить 50 тыс условных документов в секунду, что даёт нам 2мкс на вставку вместе со всеми обрабтками
Последовательная вставка: 500мкс (запрос) + 2 (обработка) + 500мкс (ответ) = 1002мкс на документ. Или 998 документа в секунду.
Bulk вставка 1000 документов: 500мкс * 1000 (передача) + 2 мкс * 1000 (обработка) + 500мкс (ответ) = 502500 мкс. 503 мкс на документ или 1988 документа в секунду.
Что примерно в два раза быстрее. В реальности эффект может быть как больше, так и меньше. Это будет зависеть от того, где дальше расположенно следующее бутылочное горлышко.
Никаких других оптимизаций в Bulk, насколько мне известно, нет. Все остальные эффекты могут быть связаны с уменьшением интервала между запросами.


Max
24.01.2018
13:04:16
Из-за того что в локальной сети задержки в основном обусловленны не физической передачей данных, а их обработкой в процессе передачи, вам только кажется что в локальной сети нет задержек. Но в локальной сети действуют те-же самые законы физики что и везде :)
Быстрее света информацию не передать. За 1 миллисекунду свет может преодолеть всего ~300км метров, а за 1 микросекунду соотвественно всего 300 метров, а за 1 наносекунду всего 30 сантиметров. Или ~4 нс на каждый метр. И это только время необходимое на физическую передачу сигнала в одну сторону.
Дальше у нас есть 7 слоёв OSI модели, каждый из которых вносит свои задержки. Например в L1 популярен Ethernet. В этом протоколе есть пауза между передачей пакетов. Длинна паузы 96 «битовых пульсов». «Битовый пульс» считается как (1 / скорость интерфейса). Т.е. для 10E это ~0.1мс, а для 1000E ~1нс.
Т.е. мы ещё даже не начинали считать сколько времени устройствам нужно на обработку и уже получили 5 нс задержки на каждый метр.
Вместе с задержкой на обработку, без специальных оптимизаций и использования специального оборудования, задержка в одну сторону будет измерятятся в сотнях микросекунд. Даже loopback интерфейс, который по сути не взаимодействует с сетевым оборудованием, даёт задержки в десятки микросекунд.
Теперь посчитаем очень упрощённо.
Так как монга предпологает последовательное исполнение команд, ей нужно отправить запрос и дождаться ответа от сервера. Чем меньше размер запроса и меньше работы делает монга, тем заметнее становятся задержки. Предположим что мы можем передать запрос, со всеми задержками, за 500мкс, а монга может выполнить 50 тыс условных документов в секунду, что даёт нам 2мкс на вставку вместе со всеми обрабтками
Последовательная вставка: 500мкс (запрос) + 2 (обработка) + 500мкс (ответ) = 1002мкс на документ. Или 998 документа в секунду.
Bulk вставка 1000 документов: 500мкс * 1000 (передача) + 2 мкс * 1000 (обработка) + 500мкс (ответ) = 502500 мкс. 503 мкс на документ или 1988 документа в секунду.
Что примерно в два раза быстрее. В реальности эффект может быть как больше, так и меньше. Это будет зависеть от того, где дальше расположенно следующее бутылочное горлышко.
спасибо за ликбез, я в теме, но сам люблю так же рассказывать своим и пояснять, почему вставка данных из азии в штаты (речь не про этот кейс) не может быть быстрой, законы физики не отменить :)
Лично я (лично я) нашел объяснение ускорению балк инсёрта не из-за уменьшения кол-ва пакетов туда-сюда и суммарному времени раундтрипа пакетов, а из-за паттерна записи данных на диск.
то есть, если мне надо обновить 1 байт инфы, то файловая система все равно перезапишет блок информации на диске (512 байт)
Если балк инсёрт - то мы за одну запись на диск делаем вставку 100 документов.
Ну и так как у нас там диск дико нагружен - это даёт профит.
Повторю - тесты не ставил, глубоко не вникал.
проверили балки - в нашем случае сильно помогло.
Объяснение этому придумал вот такое.
кажется логичным.
а в остальном полностью согласен.
Спасибо ещё раз за уделённое время на столь обстоятельный ответ :)

Google

yopp
24.01.2018
13:06:41
Это совершенно никак не отличается от 100 запросов подряд, кроме тайминга


Max
24.01.2018
13:07:27
но у монги есть же время, по которому оно делает флаш на диск.
в доке прям описывают
и если мы в это время подготавливаем большее количество документов, то нагрузка на диск должна быть ниже
» кроме тайминга
Именно

yopp
24.01.2018
13:12:19
Что такое «нагрузка на диск»?
И почему она должна стать ниже? :)

Max
24.01.2018
13:15:36
количество обращений к underlying disk, по сути - сколько раз надо перезаписать блок файловой системы для сохранения инфы.
записать 100 раз по одному байту будет медленнее, чем записать 100 байт за 1 раз
по сути сейчас коряво описываю момент записи в память с последующим flush на диск.
и на моей нагрузке это заметно.
Но, повторю, я легко могу ошибаться и профит достигнут совершенно за счёт других вещей.
но я тогда не знаю за счет каких.

yopp
24.01.2018
14:26:16
Если бы всё так просто было

Yuriy
24.01.2018
14:26:26
Привет друзья! А какой самый лучший (не сильно нагружающий сервак и быстрый) способ получить список имен всех филдов коллекции?

yopp
24.01.2018
14:27:10
Между программой и непосредственно дисковым хранилищем сейчас расположено с несколько десятоков слоёв абстракции, но что ещё важнее, ещё и куча кешей. В связи с чем нет прямой корреляции между запросом программы и реальной дисковой операцией.
Сравнение про 100 раз совсем не применимо к этому случаю

Max
24.01.2018
14:28:53

yopp
24.01.2018
14:28:56
Оно вообще мало применимо к реальной жизни.

Max
24.01.2018
14:29:51
у меня не 100 раз, а гдето 5
когда тестировали балк на тестовом стенде - получили порядка 20% профита, но на тестовом стенде данных совсем мало.
а вот на проде выстрелило

yopp
24.01.2018
14:30:28
Я про «100 раз по 1 байту быстрее 1 раза по 100».
Монга не оперирует байтами.
Монга оперирует более выскоуровнеными структурами. Хранилища оперируют в основном страницами, которые имеют более-менее прямое отображение на страницы памяти.
Тот-же wiredtiger это copy-on-write хранилище. А это значит что любая запись делается копированием текущей страницы, обновлением данных и потом изменением указателей со старой страницы, на новую.

Nick
24.01.2018
14:40:25

Google

yopp
24.01.2018
14:41:20
а больше нет никаких вариантов :)
ну только если все документы перебрать
даже в компассе все эти смешные графики построены на семплах

Yuriy
24.01.2018
14:42:37
Да, сейчас мы делаем map-reduce по всей коллекции, клиенты говорят что у них крашится сервак :-) Надо реально подхачить тут это дело. В 90% случаев всех все устроит.

Nick
24.01.2018
14:43:46
можно докучи прикрутить способ подгрузки схемы из какогонить mongoose

Yuriy
24.01.2018
14:44:04
А чо они так умеют?)

Nick
24.01.2018
14:44:09
но это уже вручную юзером должно указываться

Yuriy
24.01.2018
14:44:14
Ааа

yopp
24.01.2018
14:44:16
совсем

Yuriy
24.01.2018
14:44:24
Не, не прокатит

yopp
24.01.2018
14:44:27
прокатит

Yuriy
24.01.2018
14:44:54
прокатит
А, я про то что схем у нас нет :-) а с выборкой нескольких доков ваще норм должно все быть :-)

yopp
24.01.2018
14:45:19
Вы не тем занимаетесь