Как хорошо PostgreSQL работает с большим количеством баз данных?

попытка netsat-abn произвела большой вывод. Что точно я ищу и что я, как предполагается, делаю, после того как я нахожу его?

8
задан 26 April 2011 в 23:25
2 ответа

На нижнем уровне это в основном сводится к "Вам, может абсолютно сказать, что у Вас нет совместно используемых данных?" В отличие от mysql, база данных является абсолютной границей в postgresql. Вы не можете SELECT zip_code FROM common.city_zip WHERE city=... если Вы идете с отдельными базами данных (по крайней мере, не без dblink).

Если у Вас есть какие-либо совместно используемые данные вообще, "схема" postgresql подобна тому, что mysql называет "базой данных". Вы можете CREATE SCHEMA clienta; CREATE TABLE clienta.customer (...);. Вы создали бы схему для каждого клиента, что у пользователя клиента будет их схема сначала в их пути поиска, и разрешения были бы даны так, чтобы у пользователя Клиента A был доступ к clienta и public схемы (и их таблицы).

Ваша проблема будет этим на верхнем уровне # клиентов, каждая таблица хранится как файл, поэтому идете ли Вы с одной базой данных на клиент, одной схемой на клиент, или используете что-то как ${client}_customer для Ваших имен таблиц Вы, вероятно, столкнетесь с пределами filedescriptor с 10k клиентами, даже если у Вас только была одна таблица на клиент (плюс одно filedescriptor для каждого подключения). Конечно, можно скорректировать максимальное количество ядра дескрипторов файлов на лету с помощью sysctl, но предел для каждого процесса (ulimit) потребует перезапуска postgresql при установке его слишком низко в первый раз вокруг.

Альтернатива должна иметь "одну большую таблицу" с клиентским столбцом, который определяет, какой клиент, которому принадлежит строка (идеально, именем пользователя, если у Вас есть один пользователь на клиент, это делает материал ниже НАМНОГО более легкого). Не предоставляя доступа вообще к этой таблице клиентами, можно создать определенные для клиента представления (или использование session_user идентифицировать текущий клиент). Обновления не могут быть сделаны непосредственно посредством представления, все же. Необходимо было бы определить функции для вставления/обновления/удаления на таблице (один набор функций на клиент или иначе использование session_user) с использованием функций SECURITY DEFINER выполниться как специальный пользователь с разрешением вставить/обновить/удалить на таблицах (примечание: session_user используется потому что user и current_user основаны на текущем контексте, и в функции УСТРОЙСТВА ОПРЕДЕЛЕНИЯ БЕЗОПАСНОСТИ это всегда было бы пользователем, который определил функцию).

Мудрый производительностью, вне проблемы fd, я честно не знаю то, что произошло бы с 10 000 баз данных в postgresql, по сравнению с наличием одной большой таблицы с ценностью 10 000 клиентов данных в ней. Надлежащий индексный дизайн должен помешать большой таблице быть не спешащий запрос.

Я скажу, что пошел с отдельными базами данных для каждого клиента сюда (мы добавляем серверы для хранения системы применимой, смещая клиентские базы данных к новым серверам по мере необходимости, таким образом, мы никогда не будем добираться до 10k баз данных по одному серверу). Я должен был восстановить данные отдельных клиентов из резервных копий для отладки или из-за пользовательской ошибки регулярно, что-то, что было бы абсолютным кошмаром на "одной большой таблице" дизайн. Кроме того, если Вы намереваетесь продать настройку своего продукта Вашим клиентам, "одна большая таблица" дизайн могла бы закончить тем, что создавала помехи Вам до способности настроить модель данных.

8
ответ дан 2 December 2019 в 22:57

Без большего количества деталей о Вашем приложении трудно сказать, что Вы получите любую дополнительную безопасность от настроенного. Если каждый клиент соединяется с веб-приложением и существует общий пользователь от веб-приложения до базы данных, то Вы не изолировали свои данные способом, которые несколько отличаются от использования единственной монолитной базы данных. Доступ к Вашим данным через правильно параметризованные хранимые процедуры предоставит Вам уровень изоляции, которую Вы ищете без административной головной боли управления 10,000 + базы данных по любому количеству серверов.

Я лично увеличил подобный набор на сервере единой базы данных с помощью не чего иного как параметризовал хранимые процедуры, поражающие единую базу данных. Если можно гарантировать, что единственный доступ к базе данных через хранимые процедуры, нет никакой опасности смешения данных в результатах.

Если Вы действительно хотите продвинуться со своим дизайном, вот мои первоочередные задачи:

  1. исчерпывание открытых дескрипторов файлов (ulimit -n) на Вашем хосте ОС
  2. настройка 10,000 + базы данных для различных шаблонов запросов
  3. администрирование 10,000 + базы данных с различными проблемами безопасности (резервные копии и потенциальные восстановления, Вы действительно хотите восстановить 10,000 + база данных, если существует отказ сервера?)
  4. развертывание изменений через 10 000 + базы данных
3
ответ дан 2 December 2019 в 22:57

Теги

Похожие вопросы