Andrew
Т.е. нагрузку на проц?
Andrew
А он как раз холодный
yopp
Нет, добавляет расходы на содержание
Andrew
Ааа, понял, ну да
yopp
Ваше рабочее время стоит дороже чем железо
Andrew
Согласен. Не знаю правда удастся ли в этом убедить заказчика))
yopp
Если у вас не хватает ресурсов, то сначала необходимо исчерпать разумные возможности вертикального масштабирования, и уже потом переходит к горизонтальному.
Добавление нового блочного устройства, перенос туда индексов это уже горизонтальное масштабирование.
Если не хватает памяти и есть пустые слоты, добавьте памяти. Она вообще копейки сейчас стоит и операция занимает очень мало времени.
Если памяти больше не добавить или вы все равно упираетесь в пропускную способность блочного устройстовв, то обновите блочные устройства.
Когда и в них упретесь, тогда можно начать их добавлять и разносить индексы.
Если у вас до террабайта данных, то nmve будет копеечным решением, которое даст космических прирост.
У PCIe гигантская ширина и очень низкое latency
Andrew
Понял, поизучаю вопрос
Andrew
Ну да, сейчас потратить времени и все рассчитать, чтобы в последующие годы не мучаться с костылямм
Andrew
Подход разумный
Nick
вопрос сбоку, а сейчас есть пробелмы с производительностью на проекте или это планирвоание на будущее?
yopp
(Прямые потери == потерянная выручка, стоимость разрешения отказов == потеряное рабочее время и сорванные сроки по задачам с которых были сняты люди)
yopp
Судя по анамнезу, уже есть проблемы
Andrew
Да, собственно уже утилизация под 100 процентов, иногда с небольшой задержкой данные падают
Andrew
Со вторым томом на другом проекте делал, когда тома бало изначально 2 разных, в помогло, собственно по старой памяти первое решение которое пришло в голову
Andrew
Собственно данных реально до терабайта, плюс хранить все за очень долгое время не надо, nmve разумно рассмотреть, хоть я в ценах жедезок и не шарю
yopp
Цены на твердотельную память летят вниз. Уже подобралось к 100$ за Тб.
Intel 660p под PCIe 3.0 в m2 2280 формфакторе на 2Tb стоит около 200$
Andrew
А что насчет сохранности данных?
Andrew
В том плане что raid изначально дает какую-то гарантию
yopp
Для монги рейд смысла не имеет
yopp
Репликация
Andrew
Понял, ну это разумно
yopp
Пока ваш рейд будет восстанавливаться после замены умершего диска, производительность рейда будет такой, что скорее всего монга будет лежать на боку
Andrew
Тоже верно
Andrew
Ладно, утро вечера мудренее, спасибо за советы!
Andrew
Завтра буду думать
Ярослав
А что не так? Напишите что хотите подучить и что вам не нравится
У меня есть объект "glove", в котором в свою очередь находятся другие переменые и мне надо чтобы у игрока менялось значение user.glove.glove с 0 на 1. Но я уже по всякому пытался эту штуку подвязать, везде пишет что-то на подобии
glove null
set null
Nick
Nick
Возможно перед этим нужно будет создать user.glove={} но это уже разбирайтесь с жс
Ярослав
Но у меня идет привязка к mongodb, а не на прямую к json файлу...
Denis
@dd_bb
Aleksandr
Привет, к кого была такая ошибка при подключении к MongoDB Atlas:
"querySrv EREFUSED _mongodb._tcp.cluster0-kdeiv.mongodb.net"
Вот мой код:
const mongoose = require('mongoose');
mongoose.connect('mongodb+srv://UserName:Password_@crf1-o7dqz.gcp.mongodb.net/test?retryWrites=true&w=majority',
{ useNewUrlParser: true })
.then(() => console.log('Database connected'))
.catch(e => console.log(e));
Причем такая ошибка выскакивает именно на винде. На линуксе всё коннектится.
yopp
yopp
В этом случае ищите причину почему не резолвится
yopp
Либо попробуйте старый connection string, в котором просто перечислены сервера
Askhat
Ребят, кто с mongoose работал, подскажите.
Работаю с датами. Например есть метод который ищет записи по диапазону:
createdAt: {
$gte: startDate,
$lte: endDate
}
Даты примерно выглядят вот так:
2019-07-01T00:00:00.000+03:00
Передаю я значит их туда выше и запрос выглядит потом примерно таким:
{
'$gte': new Date("Sun, 30 Jun 2019 21:00:00 GMT"),
'$lte': new Date("Wed, 31 Jul 2019 20:59:59 GMT")
}
Почему mongoose сам конвертирует в свой какой-то часовой пояс? Нельзя просто передать дату-строку в монго?
Если я изменю часовой пояс в той ISO строке выше, то дата будет совсем другая на выходе в поиске при формировании запроса. Или мне просто так кажется =/
Vadim
Andrew
Пару способов поиска по дате закину:
в UTC:
db.test.find({
'timestamp': {
$gte: ISODate('2019-06-25T10:00:00'),
$lte: ISODate('2019-06-25T11:00:00')
}
})
в Московском времени:
db.test.find({
'timestamp': {
$gte: ISODate('2019-06-25T10:00:00+0300'),
$lte: ISODate('2019-06-25T11:00:00+0300')
}
})
В локальном времени:
db.test.find({
'timestamp': {
$gte: new Date(2019, 5, 25, 10, 0, 0),
$lte: new Date(2019, 5, 25, 11, 0, 0)
}
})
За последние 300 сек:
db.test.find({
timestamp: {
$gte: new Date(new Date() - 1000 * 300)
}
})
Andrew
Можно еще время в POSIX переводить и сравнивать с new Date (posix_time)
Andrew
Удобно, когда надо по 5минутным интервалом что-то посчитать. Posix время это число, соответсвенно можно по циклу с инкриментом запрос делать и выводить например количество
Askhat
Пару способов поиска по дате закину:
в UTC:
db.test.find({
'timestamp': {
$gte: ISODate('2019-06-25T10:00:00'),
$lte: ISODate('2019-06-25T11:00:00')
}
})
в Московском времени:
db.test.find({
'timestamp': {
$gte: ISODate('2019-06-25T10:00:00+0300'),
$lte: ISODate('2019-06-25T11:00:00+0300')
}
})
В локальном времени:
db.test.find({
'timestamp': {
$gte: new Date(2019, 5, 25, 10, 0, 0),
$lte: new Date(2019, 5, 25, 11, 0, 0)
}
})
За последние 300 сек:
db.test.find({
timestamp: {
$gte: new Date(new Date() - 1000 * 300)
}
})
а как ISODate импортировать?
Andrew
Хороший вопрос, все что выше описал в консоли монги работает, но думаю в mongoose часть тоже будет работать
Andrew
По крайней мере способ с new Date
Andrew
Только отчет месяца в javascript с 0 идет
Andrew
Т.е. июль это 6ой месяц
Askhat
Пару способов поиска по дате закину:
в UTC:
db.test.find({
'timestamp': {
$gte: ISODate('2019-06-25T10:00:00'),
$lte: ISODate('2019-06-25T11:00:00')
}
})
в Московском времени:
db.test.find({
'timestamp': {
$gte: ISODate('2019-06-25T10:00:00+0300'),
$lte: ISODate('2019-06-25T11:00:00+0300')
}
})
В локальном времени:
db.test.find({
'timestamp': {
$gte: new Date(2019, 5, 25, 10, 0, 0),
$lte: new Date(2019, 5, 25, 11, 0, 0)
}
})
За последние 300 сек:
db.test.find({
timestamp: {
$gte: new Date(new Date() - 1000 * 300)
}
})
Я же правильно понимаю, указав справа часовой пояс, монго конвертнет время и будет искать по UTC?
Чтобы наверняка убедится
Andrew
Через new Date() насколько я помню ищет в локальном часовом поясе, и если надо в utc обычно используют что-то вроде new Date(startDate).setHour(new Date(startDate).getHour() - 3) или каким образом часы преобразуют в нужное.
Через ISODate() по умолчанию в UTC ищет
Andrew
Надо это все просто проверить в приложении и понять на месте
Anonymous
добрый вечер господа. такой вопрос меня мучит: а можно ли агрегатором $project переименовать одно поле, но при этом НЕ указывать все остальные поля? чтобы они остались как были
yopp
Slava
Привет всем
Slava
Может кто-нибудь знает. Проблема появилась: есть регистрация, после отправки формы на БД - она создается, но, когда второй человек регистрируется, предыдущие данные (данные первого человека) просто перезаписываются на новые. По-сути, никаких новых документов не создается. Что делать?
Anonymous
Ilya
Возник вопрос по поводу транзакций в монге. В определенный момент времени в рамках 1 сессии может осуществляться только 1 транзакция. Следовательно, если я хочу совершать несколько транзакций над разными данными одновременно, то мне нужно генерировать несколько сессий.
Рассмотрим такую ситуацию:
Допустим, у нас есть денежные счета отдельных пользователей и операции над этими счетами: "снять деньги со счета", "внести деньги на счет", "перевести деньги с одного счета на другой"
В случае с операциями "пополнить" и "снять" со счета все вроде бы понятно. Например, для того, чтобы снять деньги со счета "А" мы создаем сессию "А", чтобы пополнить счет "Б" создаем сессию "Б" и производим транзакции в рамках этих сессий. Конфликтов никаких не происходит, потому что мы работает с разными документами.
Я проецирую решение этой задачи на реальную реализацию на NodeJS, то есть я могу допустим создать ассоциативный массив, где ключем будет служить идентификатор счета "А" или "Б", а значением объект сессии MongoDB (mongoose)
Однако что делать, если я захочу снять деньги со счета "А" и перевести их на счет "Б"? Создавать сессию "АБ"? Как определять, для каких сущностей следует создавать сессию, чтобы не затрагивать одни и те же ресурсы в транзакциях, выполняющихся в разных сессиях?
Все это только мои личные теоретические соображения, если будут какие-то идеи на этот счет, буду рад их выслушать. Вообще меня в принципе интересует принципы осуществления транзакций в монге, если ты хочешь выполнять их одновременно, и они происходят над разными данными, и как это связать с сессией. Заранее спасибо!
yopp
Возник вопрос по поводу транзакций в монге. В определенный момент времени в рамках 1 сессии может осуществляться только 1 транзакция. Следовательно, если я хочу совершать несколько транзакций над разными данными одновременно, то мне нужно генерировать несколько сессий.
Рассмотрим такую ситуацию:
Допустим, у нас есть денежные счета отдельных пользователей и операции над этими счетами: "снять деньги со счета", "внести деньги на счет", "перевести деньги с одного счета на другой"
В случае с операциями "пополнить" и "снять" со счета все вроде бы понятно. Например, для того, чтобы снять деньги со счета "А" мы создаем сессию "А", чтобы пополнить счет "Б" создаем сессию "Б" и производим транзакции в рамках этих сессий. Конфликтов никаких не происходит, потому что мы работает с разными документами.
Я проецирую решение этой задачи на реальную реализацию на NodeJS, то есть я могу допустим создать ассоциативный массив, где ключем будет служить идентификатор счета "А" или "Б", а значением объект сессии MongoDB (mongoose)
Однако что делать, если я захочу снять деньги со счета "А" и перевести их на счет "Б"? Создавать сессию "АБ"? Как определять, для каких сущностей следует создавать сессию, чтобы не затрагивать одни и те же ресурсы в транзакциях, выполняющихся в разных сессиях?
Все это только мои личные теоретические соображения, если будут какие-то идеи на этот счет, буду рад их выслушать. Вообще меня в принципе интересует принципы осуществления транзакций в монге, если ты хочешь выполнять их одновременно, и они происходят над разными данными, и как это связать с сессией. Заранее спасибо!
Если у вас операция над одним документом или на множеством документов, но они между собой не связаны, то вам не нужны транзакции. Т.е. несвязанное изменение баланса в двух документах не требует транзакции, так как вы можете обойтись атомарным операторами. Так как ошибка при выполнении одной операции логически не затронет остальные.
Если у вас операции над несколькими документами и эти операции взаимосвязанные, тогда вам необходимо выполнять эти операции в рамках одной транзакции. Тогда у вас будет гарантия что либо все операции выполнятся, либо в случае ошибки ни какие не выполнятся.
Т.е. вы открываете транзакцию, создаёте документ с проводкой, делаете списание со счета А и зачисление на счёт Б, комитите транзакцию.
Vladislav
Ребят, не как не могу разобраться. Как мне добавить в коллекцию, массив, в этот массив затем постоянно добавлять объекты с значениями
Nick
$push
Nick
Или addToSet
Vladislav
Vladislav
Сейчас это так сделано
Vladislav
Но почему то создаются два объекта
Nick
У вас монгус, в монгусе не нужно занимаиься ручными операциями с базой. Вытащили док, измениои, сохранили
Denis
Вытащили и пока изменяли, документ уже изменился в другом месте, и мы перезаписываем неактуальными данными и перезатираем
Denis
+ синхронные операции в жс по трансормации документа, против асинхронного вызова к базе
Vladislav
Alexey
Кто-нибудь знает почему при первичной синхронизации реплики возникает большая нагрузка на исходный диск на запись? Реплика hidden, диски raid10 nvme. Нагрузка на сеть ничтожная, в районе 50-100 мегабит. На диск по iotop тоже ничего. При этом праймари на пустом месте начинает тормозить...
Alexey
причём даже текущая клонируемая коллекция вообще левая
Ivan
iotop говорит, что монга?
Alexey
говорит что монга, но копейки, 5-10 мегабайт в секунду
Ivan
Может что-то в write await висит
Alexey
Ivan
Монга читает скорее всего много
Alexey
вот такие спайки в ожиданиях
Alexey
уже второй раз пытаемся засинхронить, в прошлый на 90% отказалась и отвалилась по тайм-ауту
Alexey
через сутки :((
Alexey
отключили всю генерацию статистики, чтоб снять нагрузку, толку ноль
Alexey
причем, когда делаем mongodump никаких проблем совсем