20.7. Роли в распределённой системе #

20.7.1. Управление пользователями и ролями #

Пользователи и роли в кластере Postgres Pro Shardman могут быть обычными локальными пользователями и ролями PostgreSQL и управляемыми пользователями и ролями, которые вводятся и управляются Postgres Pro Shardman. Управлять ими можно отдельно на каждом сервере или на уровне кластера.

В Postgres Pro Shardman также используются понятия управляемых пользователей и управляемых ролей. Только управляемые пользователи (или роли) могут создавать другие объекты Postgres Pro Shardman (например, сегментированные или реплицированные таблицы) и владеть ими на уровне кластера. Действие управляемых ролей распространяется на весь распределённый кластер. Однако, несмотря на то, что роль является управляемой, предоставленные ей права могут быть ограничены определённым объектом.

Операции управляемых пользователей всегда выполняются одновременно на всех группах репликации. Например, когда управляемая роль включается в какую-то другую роль или удаляется, эта операция выполнится для всех групп репликации.

Можно создать управляемого пользователя, используя оператор CREATE USER ... GLOBAL, например:

CREATE USER someuser ENCRYPTED PASSWORD 'somepass' GLOBAL;

При создании управляемого пользователя Postgres Pro Shardman автоматически создаёт сопоставление пользователя во всех группах репликации и предоставляет этому пользователю доступ ко всем сторонним серверам, входящим в существующие группы репликации. Поэтому при создании управляемого пользователя нужно либо задать незашифрованный пароль, чтобы его можно было сохранить в пользовательском сопоставлении, либо вообще не задавать пароль. Управляемые роли и пользователи, для которых не задан пароль, не могут получить доступ к сторонним серверам. Однако управляемой роли можно выдать нужный набор разрешений, чтобы затем предоставлять их пользователям, включая их в эту роль. Кроме того, можно задать пароль для управляемого пользователя позже.

Управляемых пользователей может создавать только пользователь с разрешением CREATEROLE на всех узлах кластера.

Операторы ALTER и DROP для управляемых пользователей транслируются всем группам репликации. Когда роль предоставляется управляемому пользователю, эта операция также транслируется. Переименование управляемого пользователя не поддерживается, поскольку это делает недействительными пароли md5/scram-sha-256, хранящиеся в сопоставлениях пользователей.

Список управляемых пользователей хранится в таблице shardman.users.

Роль, заданная в PgSuUsername (обычно postgres), также создаётся как управляемая во время инициализации кластера. Однако роль, заданная в PgReplUsername, создаётся как локальная в каждой группе репликации.

20.7.2. Управление разрешениями для сегментированных таблиц #

В Postgres Pro Shardman сегментированная таблица — это по сути секционированная таблица, где секции представляют собой либо локальные сегменты, либо сторонние таблицы, ссылающиеся на сегменты в других группах репликации.

Разрешения, установленные для сегментированной таблицы, транслируются для всех групп репликации и всех секций таблицы.

Когда в кластер добавляется новая группа репликации, shardmanctl копирует схему из случайной существующей группы репликации в новую. Он также создаёт сторонний сервер для новой группы репликации во всех существующих группах репликации и пересоздаёт сторонние серверы в новых группах репликации. Разрешения для созданных сторонних серверов и сопоставления пользователей копируются со случайного стороннего сервера в существующей группе репликации. В новой группе репликации для каждой секции сегментированной таблицы shardmanctl создаёт стороннюю таблицу, ссылающуюся на существующий сегмент, и заменяет секцию этой сторонней таблицей. Позже некоторые из этих сторонних таблиц могут быть заменены на реальные таблицы. Это происходит на этапе перебалансировки команды shardmanctl nodes add, если перебалансировка включена. Данные для этих секций переносятся с существующих узлов с использованием логической репликации. Когда shardmanctl создаёт таблицы (или сторонние таблицы), он копирует разрешения из родительской таблицы. В родительской таблице уже должны быть правильные разрешения, поскольку они были скопированы из существующей группы репликации.