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 создаёт таблицы (или сторонние таблицы), он копирует разрешения из родительской таблицы. В родительской таблице уже должны быть правильные разрешения, поскольку они были скопированы из существующей группы репликации.