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

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

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

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

CREATE USER someuser ENCRYPTED PASSWORD 'somepass' IN ROLE global;

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

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

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

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

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

Роль global зарезервирована и не может напрямую использоваться в кластере Shardman. Обратите внимание, что «global» является не фактически заданной ролью, а просто зарезервированным словом.

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

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

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

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