Pavel
Ребята, подскажите какие варианты масштабирования есть? Проблема в том, что primary нагружает дисковую подсистему почти на 100% . Утилизация CPU так же не падает ниже 80%. Диски nvme raid 1, ядер 12. Приложение уже довольно большое и, судя по метрикам, основная нагрузка вызвана update-ами.
Pavel
На secondary, понятно,все штатно..
Сотрудник 236
спустя ~15минут вышла ошибка
А чё у тебя написано "Потеряно соединение к MySQL серверу"?
𓆩ᬁ҉𓆪 𝕬𝕸𝕴𝕽 𓆩ᬁ҉𓆪
Я создал mongoDB для своего бота. В этой базе данных есть 2 коллекции Первая коллекция — настройки робота, вторая коллекция — профиль каждого пользователя. Количество пользовательских профилей увеличилось, а скорость реакции робота замедлилась. Какие у вас есть предложения по этому вопросу? Я использую Motor для подключения к mongodb
Qwerty
Любой ответ приветствуется Спасибо
Трудно так сказать по имеющимся данным. Возможно выборку проводите по не индексированному полю, тогда попробовать добавить индекс. А возможно вообще в коде проблема :)
𓆩ᬁ҉𓆪 𝕬𝕸𝕴𝕽 𓆩ᬁ҉𓆪
Трудно так сказать по имеющимся данным. Возможно выборку проводите по не индексированному полю, тогда попробовать добавить индекс. А возможно вообще в коде проблема :)
if not await motor_asyncio.AsyncIOMotorClient()['otg']['profiles'].find_one({'chat_id': m.chat.id}): utc_time = datetime.now(tim('UTC')) gmt_time = utc_time.astimezone(tim('GMT')) await motor_asyncio.AsyncIOMotorClient()['otg']['profiles'].insert_one({'chat_id': m.chat.id, 'normal_accounts': [], 'report_accounts': [],'balance': 0.0,'join_date':str(gmt_time.strftime('%Y/%m/%d'))}) это для создания профиля для пользователя
Qwerty
и это пример получения данных профиля пользователя : user = await motor_asyncio.AsyncIOMotorClient()['otg']['profiles'].find_one({'chat_id': int(m.text)})
Попробуйте добавить индекс по полю char_id, если в вашей базе вменяемое количество пользователей, тогда это ускорит работу
𓆩ᬁ҉𓆪 𝕬𝕸𝕴𝕽 𓆩ᬁ҉𓆪
Является ли библиотека Motor хорошим вариантом для асинхронного подключения к Mongodb?
𓆩ᬁ҉𓆪 𝕬𝕸𝕴𝕽 𓆩ᬁ҉𓆪
Qwerty
pymongo
Pymongo sync же.
Qwerty
Я к тому, что при неимении альтернативы вопрос о хорошем варианте отпадает сам по себе, так как вариантов нет.
Гриша
всем привет! Ребят, такая ерунда: раньше, когда то в схеме было поле accounts.nameAccount и оно было уникальным. Теперь я его удалил из схемы. Проверил, везде в коде ничего туда не записывает, вообще никакого упоминания о нем. Но когда я пытаюсь созранить пользователя, то он пишет эту ошибку
Гриша
Гриша
Гриша
в чем может быть проблема? может я чего то не замечаю?
yopp
Ребята, подскажите какие варианты масштабирования есть? Проблема в том, что primary нагружает дисковую подсистему почти на 100% . Утилизация CPU так же не падает ниже 80%. Диски nvme raid 1, ядер 12. Приложение уже довольно большое и, судя по метрикам, основная нагрузка вызвана update-ами.
Здравствуйте! Проверьте в первую очередь что у вас индексы покрывают все запросы. Часто высокая нагрузка связана с тем, что есть какие-то небольшие, но горячие по нагрузке коллекции, без поддерживающих индексов. Это не особо заметно по времени запросов, но collscanы создают большую нагрзуку
Гриша
теперь другая проблема я решил перезапустить базу на серве и вот что мне выдает
laplandin
Ребят, кто-то пользует mongoose + typescript? Описали интерфейс документа, скормили в дженерик mongoose.Schem-ы В чём проблема: По апи из документа хочется отдать только публичную часть без _id, __v и прочей монговской лабуды и минус пару наших полей. Написали класс репозитория, и решили, что можно обойтись projection, чтобы отобрать только публичные поля при выгребании. Так вот в интерфейсе документа нет timestamp-ов, нет всех _-андерскор полей, которые тоже хочется скрыть. И лучше, чем объявить их в интерфейсе документа опциональными в голову ничего не приходит. Как это правильно делается?
Air
есть название товара категория подкатегория как по умному написать 1 универсальный запрос, а не делать 3 с условиями на уровне яп, если не заданы 1-2 поля из 3?
Alikhan
Всем привет👋🏻 После 7 дней создания документа, мне нужно изменить status с 1 на 0. Подскажите пожалуйста как это сделать?
Qwerty
nodejs, mongodb atlas
Попробуйте это . Не могу подсказать или это можно реализовать на уровне монги, думаю для этого обычно используют сторонние средства.
Alikhan
Всем привет👋🏻 После 7 дней создания документа, мне нужно изменить status с 1 на 0. Подскажите пожалуйста как это сделать?
В reddit один человек уже задавал этот вопрос. Люди ответили что "на данный момент такое невозможно в mongodb". Но данный пост был опубликован 3 года назад. Как сейчас обстоят дела? Как Вы разруливаете такие задачи?
Nick
Всем привет👋🏻 После 7 дней создания документа, мне нужно изменить status с 1 на 0. Подскажите пожалуйста как это сделать?
любой шедуллер для выполнения периодического запроса на апдейт. Но лучше конечно же просто оттталкиваться от таймштемпа, а не городит ьстатусы
Qwerty
В Python с помощью celery это реализую.
Qwerty
любой шедуллер для выполнения периодического запроса на апдейт. Но лучше конечно же просто оттталкиваться от таймштемпа, а не городит ьстатусы
Ну чистый крон сможет динамически настраивать время выполнения задания? Я так понимаю, что задача стоит сразу после создания документа создавать задание
Nick
Всем спасибо за внимание. Возьму postresql.
а что в ПГ будет такой функционал?)
Qwerty
зачем такие сложности, просто куждую минуту проставляем всем докам которые старше недели статус
Иногда и секунда имеет значения. Зависит от требований. Если надо сделать чтобы определенный объект был доступен ровно 10 минут, то прогонка каждую минуту может оказаться неэффективной. Либо же между заданиями промежутки времени больше минуты. Тогда также каждую минуту проверка может только нагрузить сервис. Потому от задания :)
Alikhan
а что в ПГ будет такой функционал?)
Коллега настаивает на postresql. Я за mongodb.
Qwerty
Коллега настаивает на postresql. Я за mongodb.
Так с Postgres у вас возникнет тот же вопрос.. а как реализовать это.
Нуриддин
Так с Postgres у вас возникнет тот же вопрос.. а как реализовать это.
В постгресе есть свои рабочии триггеры или задачи которые работают по времени. Вообщем есть встроенные решения которые проще реализовать внутри системы
Alikhan
Так с Postgres у вас возникнет тот же вопрос.. а как реализовать это.
Я задал тот же вопрос коллеге, говорит что сам разрулит. Мне кажется он хочет какой нибудь триггер или крон создать. Ладно, не буду вас озадачивать, я пойду. Большое спасибо всем👋🏻
Lukaš 🇨🇿
Это кстати дискуссионная фигня, класть в базу данных часть логики проекта
Lukaš 🇨🇿
Не говоря о том, что нагружать крон будет везде одинаково, хоть он внутри базы, хоть снаружи
Qwerty
Это кстати дискуссионная фигня, класть в базу данных часть логики проекта
Как по мне такие решения менее гибкие и масштабируемые.
Lukaš 🇨🇿
Видимо коллеге просто очень нравится постгрес
Нуриддин
Не говоря о том, что нагружать крон будет везде одинаково, хоть он внутри базы, хоть снаружи
Не сказал бы, есть решения, которые необходимо содержать в базе. Ведь это тоже как никак часть логики
Нуриддин
Как по мне такие решения менее гибкие и масштабируемые.
Постгрес сам по себе ограничен в расширении, но очень полезен в расчете или сложных задачах
Lukaš 🇨🇿
Не сказал бы, есть решения, которые необходимо содержать в базе. Ведь это тоже как никак часть логики
Тут конечно архитектору решать, я не спорю, но в целом если логика в проекте, нарушать эти границы одним единственным исключением неправильно
Lukaš 🇨🇿
Если все работало в монге и тут возник единственный случай с кроном, то это, на мой личный взгляд нарушение границ проекта
Нуриддин
Простите что так вырулил дискуссию, но ведь проект может иметь огромное количество ньюансов и моментов
Нуриддин
Как определить границы логики проекта
Нуриддин
Как определить границы логики проекта
Вот на какой вопрос, я бы хотел получить ответ
Lukaš 🇨🇿
Сейчас попробую ответить
Нуриддин
Lukaš 🇨🇿
Логика (алгоритмы, транзакции, события) не существуют сами по себе, а кому-то принадлежат, на разных уровнях могут принадлежать бизнес процессу, или какой-то сущности (если мы говорим про паттерны DDD). Например у меня есть сервис который отвечает за гео-данные, я рассчитываю, что вся, что взаимодействует с ними - будет в нем, сущности (адреса, улицы, дома) , различные саги, транзакции, все в проекте внутри его предметной области. Т.е этот код знает правила по которым меняется информация, эти правила жёстко заданы кодом. И тут вдруг появляется какая-то внешняя относительно этого кода процедура, которая сама себе что-то меняет никак не опираясь на те вещи, которые написаны в проекте, вот тут я могу считать это "протечкой". Но это не обязательно, ведь у меня есть и другой проект, в котором я решил сделать иначе и вынес вообще всю логику работы в данными в процедуры и бекенд занимается исключительно алгоритмами, интеграцией с внешними сервисами и ничего не знает о том, как и почему данные в базе ему готовятся именно так. Это в 2 крайних варианта с которыми у меня есть опыт
Нуриддин
Понятно
Lukaš 🇨🇿
Генерально, мысль в том, что я бы её менял базу из-за одного частного случая, а решал бы как в целом архитектурно будет устроена система, а то ведь в чем-то и постгрес не устроит
Нуриддин
То есть мы должны разграничивать сущности и уровни доступа для того чтобы логика работала независимо от готовых данных, а данные в свою очередь должны подходить для работы логики
Lukaš 🇨🇿
Ну строго говоря да, потому что у тебя может возникнуть например кеширующий сервер перед базой данных и меняя что-то триггером в базе - ты не поменяешь это в кеширующем сервисе
Нуриддин
Ну строго говоря да, потому что у тебя может возникнуть например кеширующий сервер перед базой данных и меняя что-то триггером в базе - ты не поменяешь это в кеширующем сервисе
Да эту боль я как-то испытал. Поэтому вывел уроком, что кешер должен быть заранее подготовлен к изменения реалиционной системы
Lukaš 🇨🇿
Ну вот, в этом ключе ребята до меня верно заметили, что крон уместно использовать снаружи
Lukaš 🇨🇿
Или придется делать триггер и по нему реагировать обновляя кеш
Lukaš 🇨🇿
Но тут уже возникает странный какой-то поток данных, в котором база берет на себя задачи бекенда, тригеря его на обновление по сути второй базы
Нуриддин
Тут кстати стоит заранее обговорить момент, а эти данные уже в СУБД или они записываются параллельно. В первом случае триггер вообще не нужен так как можно добавить ключ к выгрузке времени
Нуриддин
И задача облегчается к редакции кода и структуры данных
Lukaš 🇨🇿
Ну да, поэтому я и сказал, что задача архитектора тут определять, а не от вопроса "где крон поставить" базу выбирать
Lukaš 🇨🇿
Я лишь вспомнил с напрыга пару "но"