@MongoDBRussian

Страница 137 из 342
Rustam
24.10.2017
07:33:42
Всем привет. А какой true way реализовать timeline (получение данных с какого-то момента) в монге? Что я пробовал: 1. Optimistic Loop (надежно, но медленно при многопоточной записи). 2. Коллекция счетчиков (быстрее, но возможен рассинхрон при многопоточной записи). 3. Поле с CurrentDate (быстро, но возможен рассинхрон при многопоточной записи). Есть варианты получше? Надежно и быстро? ObjectId не подходит потому что нужно иногда Updat'ить данные и соответственно обновлять точку синхронизации

Aleksandr
24.10.2017
08:45:10
Сейчас до компа дойду

Google
Rustam
24.10.2017
08:50:47
Для времянных рядов лучше всегда использовать время. Почему может возникнуть «рассинхрон» и какой физический смысл данных?
Тесты показывают, что при использовании CurrentDate легко следующий элемент в многопоточной среде имеет значение меньше чем предыдущий (даже если это timestamp). Данные - это сообщения в чате. Смысл в дочитывании новых сообщений. Чат с высокой нагрузкой.

yopp
24.10.2017
08:51:47
Дату используй и не парься.

Серверную

Гарантировать строгий порядок в такой среде можно, но это для чата будет убийственно дорого, так как нужна координация между всеми участниками.

Gleb
24.10.2017
08:54:15
Глеб, Монго это не реляционная ДБ со всеми вытекающими. Некоторую подобную функциональность (крайне неэффективную vs реляционные дб) можно посмотреть здесь: https://stackoverflow.com/questions/2350495/how-do-i-perform-the-sql-join-equivalent-in-mongodb
Мгм, спасибо. Попробую) На самом то деле есть как раз таки aggregation, который кое-что по связям умеет делать. Плюс вещи типа $lookup. В NoSQL нет JOIN, на замену им MapReduce операции. Вопрос в том, что $in от нескольких десятков ключей - тоже такая себе идея, так что выбираем одно из двух зол.

yopp
24.10.2017
08:59:16
Потом чяты с высокой нагрузкой это всё ещё достаточно низкая частота событий, ну может быть пара сообщений в секунду.

Aleksandr
24.10.2017
09:04:30
Пример запроса покажи?
db.orders.find({"created": { $gte: ISODate("2017-10-17T05:53:13Z") }, "channel": "smth", $or: [ { "status_external.smth" : 1, "notified.$id" : ObjectId("id") }, { "owner.$id" : ObjectId("id") }, { "performer.$id" : ObjectId("id") } ], "status_external.smth": { $nin: [8,7,9,10] } }).hint({"created": -1, "channel": 1, "status_external.smth": 1})

пока ускорил пересобрав индекс с использованием partial и ttl

yopp
24.10.2017
09:08:41
Взять и по уменьшению селективности сделать компаунд индекс

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

Нужно уменьшить выборку.

Плюс у тебя там статус два раза

Aleksandr
24.10.2017
09:10:03
выборка продиктована бизнесом (не знаю на какой фиг так) пока вижу только частичный + ттл

Google
yopp
24.10.2017
09:10:43
Выборку в смысле число ключей которые монга выбирает просканировать

Попробуй компануд индекс

Aleksandr
24.10.2017
09:12:17
так у меня комаунд

в хинте как раз поля компаунд индекса

yopp
24.10.2017
09:12:32
Какое из них?

Aleksandr
24.10.2017
09:12:36
все три

yopp
24.10.2017
09:12:43
А как индекс выглядит?

Aleksandr
24.10.2017
09:12:46
именно в такой последовательности и сортировке

{"created": -1, "channel": 1, "status_external.smth": 1} прямо вот так

yopp
24.10.2017
09:13:58
А сколько записей в коллекции?

Aleksandr
24.10.2017
09:14:26
миллионов 20 (возможно больше, уже не могу посмотреть)

yopp
24.10.2017
09:14:44
Channel насколько уникальные значения содержит?

Aleksandr
24.10.2017
09:15:06
4 вида значений

yopp
24.10.2017
09:15:15
А статусов сколько?

Aleksandr
24.10.2017
09:15:28
10+ значений

yopp
24.10.2017
09:16:31
А в час сколько примерно записей помещается?

Aleksandr
24.10.2017
09:17:03
? примерно 2-3 тыс.

yopp
24.10.2017
09:18:50
Меньше записи в секунду. Дату префиксом лучше не использовать.

Дату отдельным индексом, в компаунде оставить статус и канал.

Aleksandr
24.10.2017
09:20:54
и без хинта?

Google
yopp
24.10.2017
09:21:41
Планировщик сам должен справиться

Хинты в основном нужны когда планировщик выбирает не тот индекс из доступный.

Тебе надо уменьшить totalKeysExamined на один два порядка.

Aleksandr
24.10.2017
09:23:22
ага, знаний пока не хватает по этому вопросу ) спасибо, попробовать смогу уже только завтра

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

yopp
24.10.2017
09:23:48
Лучше на два. Тысяча ключей на сотню документов — нормальный баланс

Aleksandr
24.10.2017
09:24:23
ну пока это было достигнуто путем partial + ttl просто за счет того, что в индексе меньше данных

yopp
24.10.2017
09:26:40
Это тоже вариант, но попробуй сначала индексы в другом порядке расставить.

С другой стороны если ttl и partial подходят к задаче то и отлично.

Aleksandr
24.10.2017
09:29:48
а компаунд индексы получается как работают? сперва отбираются все данные по первому полю в индексе, а потом поиск сужается посредством последующих полей? я почему-то был уверен что сразу применяется

хотя да, именно так... и это в принципе логично (сейчас пересмотрел блок в монго универе)

yopp
24.10.2017
09:36:02
Т.е. компаунд по дате в твоём случае делает тебе на первом уровне матрешек по числу уникальных дат

Aleksandr
24.10.2017
09:37:05
ну теперь хоть понятно почему не стоит использовать дату в префиксе )

yopp
24.10.2017
09:37:06
Что делает остальные уровни бесполезными

Aleksandr
24.10.2017
09:41:49
ага, осознал спасибо )

Tenni
25.10.2017
00:37:34
@dd_bb https://docs.mongodb.com/manual/release-notes/3.4-changelog/#id1 чутка рано, но на днях выйдет 3.4.10

Алексей
25.10.2017
13:24:43
господа в db.currentOp() вижу поля desc и clientMetadata можно их как то заюзать ?

Google
Алексей
25.10.2017
13:24:51
например для указания откуда запрос пришел

или как это сделать веселее ? mongoengine==0.13.0

yopp
25.10.2017
13:33:02
Первое вроде как в запросе настраивается, через $comment: https://docs.mongodb.com/manual/reference/operator/query/comment/

Второе фича клиента. Зависит целиком от драйвера

Алексей
25.10.2017
13:35:35
да я нашел

+ adult = (User.objects.filter(age__gte=18) + .comment('looking for an adult') + .first())

пример из примера

yopp
25.10.2017
13:39:00
Ага. https://docs.mongodb.com/v3.2/reference/method/cursor.comment/

Если драйвер не умеет прямо, можешь попробовать старый addOption, может сработать.

Dmitry
26.10.2017
13:34:30
Ребят, привет Такой вопрос: роллбэк на реплике сейчас занимает 16+гб. Есть вариант его аккуратно почистить ?

yopp
26.10.2017
13:36:18
посмотри что там в ролббэке, и если эти данные не нужны, то просто удали

Dmitry
26.10.2017
13:38:42
Спасибо)

yopp
26.10.2017
13:47:14
но вообще лучше разобраться откуда столько роллбэка

это не очень хорошо

Dmitry
26.10.2017
17:13:44
Понял, спасибо)

Старый
26.10.2017
20:00:09
онлайн есть кто?

yopp
26.10.2017
20:05:05
Больше шансов получить ответ если сразу задать вопрос.

Старый
26.10.2017
20:05:33
WiredTiger в монге сильно отличается от аэроспайковского и кассандры

вот предположим есть кластер, 256 гб оперативы его общее кол-во, размер базы 3+ тб, запросы разные, например вывести список товаров прошедших через юзера в компании за пол года, или вообще весь, а так же целиком у компании

где до 30 юзеров

Google
Старый
26.10.2017
20:08:14
сколько такие запросы потребуют iops при выполнении в сравнении с выше перечисленными бд

yopp
26.10.2017
20:09:01
:)))))))))

Случайное число от 0 до «сколько вытянет сторадж»

Старый
26.10.2017
20:10:35
Случайное число от 0 до «сколько вытянет сторадж»
вот тут то и оно, что базе одновременно ещё есть хранимые xml до разбора приложением

yopp
26.10.2017
20:10:54
Но в целом, в худшем случае, по числу страниц которые необходимо просмотреть для поиска по индексу и потом ещё по числу страниц для чтения документов.

Алексей
26.10.2017
20:12:47
и еще учесть фрагментацию файловой системы, и тип схд

и длинну кабелей до схд. и качество лунного света.

yopp
26.10.2017
20:13:27
Нормальные стораджи блоком пишут

Старый
26.10.2017
20:13:28
и еще учесть фрагментацию файловой системы, и тип схд
вот потому и думаю, как рассказать одному из партнёров, что их наёбывает подрядная организация

yopp
26.10.2017
20:13:42
Так что фрагментация не должна ролять

Старый
26.10.2017
20:13:49
будут netapp+iscsi как мне известно

yopp
26.10.2017
20:14:05
Потому что не будет последовательного чтения в худшем случае

Старый
26.10.2017
20:14:25
его и не будет

так и так

Алексей
26.10.2017
20:14:36
оценка iops для базы при выполнеии запроса... хм.

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