|
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
|
|
Мультитенантное SaaS приложение17.07.2022, 20:00. Показов 1315. Ответов 15
Добрый день, коллеги.
Проектируем мультитенантное saas приложение. Предполагается в пределах 1000 клиентов. Думаем как избавиться от client_id в каждом запросе. Наследование для большого количества клиентов, видимо, не самый лучший вариант. Но есть еще RLS. Поэкспериментировал - работает, но на практике никогда не работал с RLS. Может ли кто поделиться опытом использования для SAAS? Насколько это удобно на практике? Как с производительностью?
0
|
|
| 17.07.2022, 20:00 | |
|
Ответы с готовыми решениями:
15
Выбираем SaaS систему Saas в Rails (работа с Bootstrap) SaaS сервис по контекстной рекламе? |
|
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 [ТС] | |||
|
Спасибо за ответ.
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 [ТС] | |||
|
Добавлено через 4 минуты
0
|
|||
|
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
|
||
| 31.07.2022, 00:18 | ||
|
Это ОЧЕНЬ облегчает администрирование и сопровождение. И самое главное всё автоматизируется на лету. Тысяча БД - не проблема. И 3 и 5 тысяч тоже. Добавлено через 4 минуты Просто посмотреть - не проблема - снёс базу и пользователя-хозяина. И всё. И создать демку тоже - запустил скрипт создания пользователя и базы. Сопровождаться легко будет. И самое главное - можно продумать политику бэкапов и их хранения. Если размеры баз небольшие - порядка несколько гигабайт - то ваще пестня.
0
|
||
|
107 / 68 / 29
Регистрация: 22.04.2022
Сообщений: 233
|
||
| 31.07.2022, 07:11 | ||
|
ЗЫ: RLS нужен, когда к одной записи в таблице нужен доступ разных пользователей с разными правами, чего в данном случае не предполагается...
0
|
||
|
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
|
|||
| 10.08.2022, 12:19 [ТС] | |||
|
Но почему легко бэкапить и накатывать? Бэкапить нужно кучу баз данных - это не то чтобы большая проблема, но если разделять клиентов на уровне схем, то трудозатраты и проблемы такие же: постгрес позволяет бэкапить отдельные схемы одной базы данных, что плюс-минус равносильно бэкапу большого количества отдельных баз данных. Тоже касается и миграций: при появлении новой миграции её нужно накатывать на каждую базу данных, что плюс-минус равносильно варианту с отдельными схемами для каждого клиента. Но вариант со схемами я считаю более выгодным по сравнению с отдельными базами данных, так как каждая база данных накладывает дополнительные издержки на поддержание подключений и менее эффективную работу кеша (ввиду того что общего кеша не будет). Кроме того нужно отдельное хранилище для общих для всех данных (на самом деле для них и nosql вполне подходит). (!) Важно заметить, что данные всех клиентов будут на одном сервере. Достижение такой нагрузки, что один сервер СУБД не справляется видится только в очень отдалённой перспективе. Но в любом случае при варианте со схемами вынести часть клиентов на отдельные сервера не представляется сложным. З.Ы. Я не пытаюсь доказать свою точку зрения, а пытаюсь понять чем отдельная БД на каждого клиента лучше RLS или отдельной схемы на каждого клиента. Убедите, пожалуйста, буду очень благодарен.
0
|
|||
|
107 / 68 / 29
Регистрация: 22.04.2022
Сообщений: 233
|
|||||||||||||
| 11.08.2022, 08:26 | |||||||||||||
|
Что касается RLS, вот пример простейшей политики
2. При очень большом кол-ве записей в таблице нужен индекс по client_id, он поможет, но не надолго. 3. Cледующий этап оптимизации создание cоставного индекса (client_id,fieldN), конечно Вы скажете, что postgresql умеет Bitand для индексов, но это далеко не всегда так, и возможно придётся client_id "протащить" через кучу индексов 4. А вообще нужен ли RLS?
Ещё раз, 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 | |||
|
1
|
|||
|
100 / 70 / 26
Регистрация: 19.12.2014
Сообщений: 332
|
||||||||
| 11.08.2022, 14:13 [ТС] | ||||||||
|
[del]
Добавлено через 9 минут Ну и ещё одна проблема с отдельными базами данных - это сложность построения отчётов. Это далеко не главное, но несомненно понадобится какая-то статистическая информация по всем клиентам. Тут либо техническую базу данных формировать либо из каждой базы выгружать требуемую информацию и потом её суммировать. Конечно и это решаемо, но с одной базой явно проще.
0
|
||||||||
|
55 / 50 / 5
Регистрация: 30.06.2022
Сообщений: 251
|
||
| 11.08.2022, 18:01 | ||
|
Там же можно хранить инфу по базам и коннектам. У нас больше 10 тысяч объектов(сооружений) и расчётов по ним, и примерно 100 архивных баз на нескольких машинах. Добавлено через 2 минуты База правда очень небольшая, около 2 терабайт
0
|
||
| 11.08.2022, 18:01 | |
|
Помогаю со студенческими работами здесь
16
Аналог MS Office Project на SaaS Плюсы и минусы SaaS систем Как захостить Saas платформу с гитхаба? Вакансия: Технический Директор SaaS продукта Вакансия: Технический Директор SaaS продукта Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка 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.
Задача: при создании документов установить период списания автоматически. . .
|