Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332

Мультитенантное SaaS приложение

17.07.2022, 20:00. Показов 1315. Ответов 15

Студворк — интернет-сервис помощи студентам
Добрый день, коллеги.
Проектируем мультитенантное saas приложение. Предполагается в пределах 1000 клиентов.
Думаем как избавиться от client_id в каждом запросе.
Наследование для большого количества клиентов, видимо, не самый лучший вариант. Но есть еще RLS. Поэкспериментировал - работает, но на практике никогда не работал с RLS. Может ли кто поделиться опытом использования для SAAS?
Насколько это удобно на практике?
Как с производительностью?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.07.2022, 20:00
Ответы с готовыми решениями:

Выбираем SaaS систему
Так как мы с вами проживаем на территории РФ, то предлагаю выбор SaaS-системы производить из доступных российских систем. Для начала нужно...

Saas в Rails (работа с Bootstrap)
Начал изучать Rails. И столкнулся с такой ситуацией. Bootstrap напрямую по умолчанию использовать нельзя. Это надо устанавливать...

SaaS сервис по контекстной рекламе?
Всем привет! Мы - команда разработчиков, которая сейчас создает новый SaaS-сервис для специалистов по контекстной рекламе. Хотели бы...

15
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
19.07.2022, 11:10  [ТС]
Неужели никто с этим не работал?
0
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
22.07.2022, 00:58
Попробуйте приспособить CURRENT_USER и завернуть все в представления относительно CURRENT_USER. Может это спасет как-то.

Ну и еще комментарий. Если в каждом запросе требуется client_id, значит что-то у вас не совсем так в схеме базе данных (см. нормализацию), а значит вероятно требуется рефакторинг.
0
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
22.07.2022, 01:20  [ТС]
Спасибо за ответ.

Попробуйте приспособить CURRENT_USER и завернуть все в представления относительно CURRENT_USER. Может это спасет как-то.
Как реализовать я знаю. Представления не нужны. Интересует реальный опыт: в интернете есть статьи по теории, но дальше синтетических примеров информации не нашел. На сколько это удобно на практике? Сколько дополнительно ресурсов потребуется? На сколько это надежно разделяет данные. Вот это меня интересует.

Если в каждом запросе требуется client_id, значит что-то у вас не совсем так в схеме базе данных (см. нормализацию), а значит вероятно требуется рефакторинг.
Я написал что "проектируем" базу данных. То есть ее еще нет. Для мультитенантных приложений характерно что у каждого клиента свой набор данных, отсюда классический способ разделить эти данные: добавлять везде client_id. Но это не надежно и обременительно. Другой вариант - для каждого клиента наследовать свою схему, но с этим тоже связан ряд проблем (решаемых, конечно). Ну и наконец rls, который может взять на себя заботу по добавлению "where client_id=12345" ко всем запросам.
0
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
24.07.2022, 23:31
По вашему примеру одно из основных архитектурных решений приложения, на которую завязано RLS, это то, что у вас каждый пользователь приложения должен быть пользователем базы данных. А соответственно аутентификация и прочие системные вещи доступа нужно будет продумывать для использования RLS.

Учитывая, что так обычно не делают и пользователей приложения содержат в самом приложении - собственно Ваш случай с отдельным client_id и т.д., то тут возникает вопрос применимости / полезности RLS. Если у вас свои пользователи приложения, то уж лучше тогда и в приложении позаботиться о разграничении доступа к данным.
0
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
25.07.2022, 00:15
Я может быть один глупый вещь скажу.
Насколько данные пользователя должны быть изолированны? Один пользователь должен иметь возможность получить доступ к данным других?
Если такое не надо, то может, каждому клиенту своя база данных/кластер баз данных, попробуйте рассмотреть? Тогда можно продумать и о балансировке нагрузок(а-ля горизонтальное масштабирование). И изоляцию виртуалками или вообще на отдельные машины.
Для общей статистики/учёта пользователей и прав - отдельная узловая БД, в неё же можно отчёты запихнуть, материальные вьюхи.
Создаём юзера в узловой БД, генерим базу скриптом, прописываем доступ и уаля.

Добавлено через 9 минут
Прикладуха лезет на узловую БД, авторизуется там, получает либо через прокси-функции по айдишнику пользователя, либо как-то ещё доступ. Или не получает.
По айдишнику внутри вычисляется авторизационная инфа для базы конкретного пользователя(он её не получает, если узловая БД проксирующая).
Кстати, и пароль пользователя postgres-хозяина бд может быть индивидуальный в случае, если каждая БД развёрнута на индивидуальной виртуалке(кластер постгреса тоже индивидуальный для каждого клиента)
Или как вариант пользователь---хозяин базы не postgres, но только своей. Но тогда с правами доступа надо повнимательнее.
Короче, в любом случае вариантов куча.
0
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
29.07.2022, 23:19  [ТС]
Цитата Сообщение от grgdvo Посмотреть сообщение
каждый пользователь приложения должен быть пользователем базы данных
В этом нет необходимости: сначала происходит аутентификация клиента, при которой становится известен client_id. Далее в postgres устанавливается переменная окружения, содержащая этот client_id и в последствии RLS "цепляется" к этой переменной окружения.

Добавлено через 4 минуты
Цитата Сообщение от oktogen Посмотреть сообщение
то может, каждому клиенту своя база данных/кластер баз данных
В самом первом посте я написал, что клиентов может быть тысяча. И могут быть регистрации "просто посмотреть", когда клиента можно удалить через несколько дней. Создавать каждый раз базу данных - очень накладно. Я уже не говорю о сложностях с миграциями. Есть решение получше: для каждого клиента выделять отдельную схему в одной базе данных. Для 1000 клиентов это работает. И 1000 пользователей в базе данных - это не проблема. Но есть проблемы с администрированием и бэкапами. Опять же миграции нужно накатывать на все схемы.
0
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
31.07.2022, 00:18
Цитата Сообщение от cia Посмотреть сообщение
Но есть проблемы с администрированием и бэкапами. Опять же миграции нужно накатывать на все схемы.
Вот именно поэтому и стоит одному пользователю выделять базу. И админить легко и бэкапить и обновления накатывать.
Это ОЧЕНЬ облегчает администрирование и сопровождение. И самое главное всё автоматизируется на лету.
Тысяча БД - не проблема. И 3 и 5 тысяч тоже.

Добавлено через 4 минуты
Просто посмотреть - не проблема - снёс базу и пользователя-хозяина. И всё.
И создать демку тоже - запустил скрипт создания пользователя и базы.
Сопровождаться легко будет. И самое главное - можно продумать политику бэкапов и их хранения.
Если размеры баз небольшие - порядка несколько гигабайт - то ваще пестня.
0
107 / 68 / 29
Регистрация: 22.04.2022
Сообщений: 233
31.07.2022, 07:11
Цитата Сообщение от oktogen Посмотреть сообщение
Вот именно поэтому и стоит одному пользователю выделять базу. И админить легко и бэкапить и обновления накатывать.
Это ОЧЕНЬ облегчает администрирование и сопровождение. И самое главное всё автоматизируется на лету.
Тысяча БД - не проблема. И 3 и 5 тысяч тоже.
+1

ЗЫ: RLS нужен, когда к одной записи в таблице нужен доступ разных пользователей с разными правами, чего в данном случае не предполагается...
0
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
10.08.2022, 12:19  [ТС]
Цитата Сообщение от oktogen Посмотреть сообщение
И админить легко и бэкапить и обновления накатывать.
Спасибо за рекомендации.
Но почему легко бэкапить и накатывать? Бэкапить нужно кучу баз данных - это не то чтобы большая проблема, но если разделять клиентов на уровне схем, то трудозатраты и проблемы такие же: постгрес позволяет бэкапить отдельные схемы одной базы данных, что плюс-минус равносильно бэкапу большого количества отдельных баз данных.
Тоже касается и миграций: при появлении новой миграции её нужно накатывать на каждую базу данных, что плюс-минус равносильно варианту с отдельными схемами для каждого клиента.
Но вариант со схемами я считаю более выгодным по сравнению с отдельными базами данных, так как каждая база данных накладывает дополнительные издержки на поддержание подключений и менее эффективную работу кеша (ввиду того что общего кеша не будет). Кроме того нужно отдельное хранилище для общих для всех данных (на самом деле для них и nosql вполне подходит).

(!) Важно заметить, что данные всех клиентов будут на одном сервере. Достижение такой нагрузки, что один сервер СУБД не справляется видится только в очень отдалённой перспективе. Но в любом случае при варианте со схемами вынести часть клиентов на отдельные сервера не представляется сложным.


Цитата Сообщение от fte65 Посмотреть сообщение
ЗЫ: RLS нужен, когда к одной записи в таблице нужен доступ разных пользователей с разными правами, чего в данном случае не предполагается...
Почему же? Именно такой сценарий и предполагается: в одной таблице содержатся данные для разных клиентов.

З.Ы. Я не пытаюсь доказать свою точку зрения, а пытаюсь понять чем отдельная БД на каждого клиента лучше RLS или отдельной схемы на каждого клиента. Убедите, пожалуйста, буду очень благодарен.
0
107 / 68 / 29
Регистрация: 22.04.2022
Сообщений: 233
11.08.2022, 08:26
Цитата Сообщение от cia Посмотреть сообщение
Почему же? Именно такой сценарий и предполагается: в одной таблице содержатся данные для разных клиентов.
Потому, что в первом топике
Цитата Сообщение от cia Посмотреть сообщение
Думаем как избавиться от client_id в каждом запросе.
отсюда вывод, что один клиент не видит данных другого...
Что касается RLS, вот пример простейшей политики
SQL
1
CREATE POLICY tbl_policy ON tbl USING (client_id = CURRENT_USER);
1. В каждой таблице должно быть поле client_id
2. При очень большом кол-ве записей в таблице нужен индекс по client_id, он поможет, но не надолго.
3. Cледующий этап оптимизации создание cоставного индекса (client_id,fieldN), конечно Вы скажете, что postgresql умеет Bitand
для индексов, но это далеко не всегда так, и возможно придётся client_id "протащить" через кучу индексов
4. А вообще нужен ли RLS?
SQL
1
CREATE VIEW vtbl AS SELECT * FROM tbl WHERE client_id = CURRENT_USER WITH CHECK OPTION
даёт тот же результат

Ещё раз, RLS нужен когда необходимо организовать более сложную логику доступа к одной записи в таблице, например: клиент "user1" видит все записи клиента "user2" и может редактировать только записи с rec_id in (1,2,10,20), а удалять с rec_id in (5,10,15), клиент "user3" видит записи с rec_id in (30,35,38) клиента "user2", но не может их редактировать, ну т.п.
1
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
11.08.2022, 10:58  [ТС]
fte65, спасибо за ответ. Ваше мнение понятно и полезно.
А что скажете про вариант с отдельными схемами на каждого клиента?
0
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
11.08.2022, 11:26
Обновление превратятся в адЪ. Так вы можете соединиться к базе, прокатить скрипт обновления отсоединиться, а со схемами вам придётся писать как минимум цикл, который будет пробегать по всем схемам. Возможно, блоча работающих пользователей. Когда базы независимы, то можно планировать как угодно и код не будет привязываться ко схемам.

Добавлено через 9 минут
20 с лишним мегабайт на пустую базу не стоят затраченных усилий.
20-30 гигабайт это не тот объём, когда я бы заморачивался экономией на спичках.
0
107 / 68 / 29
Регистрация: 22.04.2022
Сообщений: 233
11.08.2022, 11:28
Цитата Сообщение от cia Посмотреть сообщение
А что скажете про вариант с отдельными схемами на каждого клиента?
ИМХО в Вашем случае как раз вариант с отдельными схемами наиболее подходящий, ограничение не более 1000 клиентов, не так сильно раздует системные таблицы. Да, придётся поколдовать с автоматизацией архивирования схем пользователей, но не думаю, что это архи-сложная задача, в остальном одни плюсы, тем более параметр path_search изначально так настроен
Цитата Сообщение от oktogen Посмотреть сообщение
Обновление превратятся в адЪ. Так вы можете соединиться к базе, прокатить скрипт обновления отсоединиться
А вот этого не надо, накатить скрипт обновления даже на одной "боевой" базе это далеко не тривиальная задача и никак не может быть преимуществом по сравнению, с вариантом использования схем для каждого пользователя.
1
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
11.08.2022, 14:13  [ТС]
Цитата Сообщение от oktogen Посмотреть сообщение
со схемами вам придётся писать как минимум цикл, который будет пробегать по всем схемам
Разве не придётся делать тоже самое, чтобы пробегать по всем базам данных?

[del]
 Комментарий модератора 
Нарушение правил форума п. 4.6


Добавлено через 9 минут
Ну и ещё одна проблема с отдельными базами данных - это сложность построения отчётов. Это далеко не главное, но несомненно понадобится какая-то статистическая информация по всем клиентам. Тут либо техническую базу данных формировать либо из каждой базы выгружать требуемую информацию и потом её суммировать. Конечно и это решаемо, но с одной базой явно проще.
0
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
11.08.2022, 18:01
Цитата Сообщение от cia Посмотреть сообщение
Ну и ещё одна проблема с отдельными базами данных - это сложность построения отчётов. Это далеко не главное, но несомненно понадобится какая-то статистическая информация по всем клиентам. Тут либо техническую базу данных формировать либо из каждой базы выгружать требуемую информацию и потом её суммировать. Конечно и это решаемо, но с одной базой явно проще.
Для учёта пользователей, отчётов и статистики делается отдельная база, условно центральная.
Там же можно хранить инфу по базам и коннектам.
У нас больше 10 тысяч объектов(сооружений) и расчётов по ним, и примерно 100 архивных баз на нескольких машинах.

Добавлено через 2 минуты
База правда очень небольшая, около 2 терабайт
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.08.2022, 18:01
Помогаю со студенческими работами здесь

Аналог MS Office Project на SaaS
Доброго дня. Вы можете подсказать бесплатный или не дорогой вариант. В программе нужен расчёт стоимости затраченного времени на проект

Плюсы и минусы SaaS систем
Я слышал немного информации о таких системах, но не знаю, насколько они лучше или хуже других. Например, тех же 1С или SAP. Если может...

Как захостить Saas платформу с гитхаба?
Добрый день, Прошу прощения если не в тот раздел запостил вопрос. Есть Saas платформа на (Jupyter Notebook 96.8% и Python 3.2%)...

Вакансия: Технический Директор SaaS продукта
Bell Integrator - это крупная IT компания аутсорсинговая. Мы разрабатываем сложные и инновационные решения для нужд IT и бизнеса наших...

Вакансия: Технический Директор SaaS продукта
Bell Integrator - это крупная IT компания аутсорсинговая. Мы разрабатываем сложные и инновационные решения для нужд IT и бизнеса наших...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru