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

yopp
24.10.2017
08:44:31

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

yopp
24.10.2017
08:49:20

Google

Rustam
24.10.2017
08:50:47

yopp
24.10.2017
08:51:47
Дату используй и не парься.
Серверную
Гарантировать строгий порядок в такой среде можно, но это для чата будет убийственно дорого, так как нужна координация между всеми участниками.

Gleb
24.10.2017
08:54:15

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
ага, осознал
спасибо )

yopp
24.10.2017
10:52:16
Даже на несколько сотен

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

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 для базы при выполнеии запроса... хм.