Содержание
Кластер БД postgresql
1.1. Описание
- Patroni: Patroni — это инструмент для управления высокодоступным кластером PostgreSQL. Он обеспечивает автоматизированное управление основным/резервным сервером, мониторинг состояния серверов, выбора основного сервера (leader), решения конфликтов и так далее. Patroni помогает обеспечить высокую доступность и отказоустойчивость для кластера PostgreSQL.
- etcd: etcd — это распределенное хранилище ключей-значений, используемое Patroni для хранения конфигурации и состояния кластера. Он обеспечивает централизованное хранение данных, нужных для согласованности и синхронизации между серверами кластера PostgreSQL. etcd также используется для обнаружения и выбора основного сервера. Для работы кластера необходимо , чтобы как минимум два хоста etcd были доступны
1.2. Установка кластера postgresql
1.2.1. Настройка хостов
Мы будем использовать три хоста (минимальный набор для организации кластера) для кластера postgresql и один хост для haproxy:
- psql1: 192.168.27.239 ( etcd + patroni + postgresql )
- psql2: 192.168.27.219 ( etcd + patroni + postgresql )
- psql3: 192.168.27.108 ( etcd + patroni + postgresql )
- haproxy: 192.168.27.83 (haproxy)
Примечание: При включенной службе firewalld необходимо добавить в исключения порты 2380, 2379, 5432, 8008 и выполнить настройку для pgsql.
1.2.1.1. Переименуйте все хосты кластера postgresql и добавьте в файл hosts (в нашем случаи мы будем использовать имя psql)
1.2.1.1.1. На первом хосте
192.168.27.239: hostnamectl set-hostname psql1 systemctl restart systemd-hostnamed
1.2.1.1.2. На втором хосте
192.168.27.219: hostnamectl set-hostname psql2 systemctl restart systemd-hostnamed
1.2.1.1.3. На третьем хосте
192.168.27.108: hostnamectl set-hostname psql3 systemctl restart systemd-hostnamed
1.2.1.2 Добавьте данные о хостах в файл /etc/hosts на ВСЕХ хостах
192.168.27.239 psql1 192.168.27.219 psql2 192.168.27.108 psql3
1.2.2. Установка ETCD ( на хостах psql1, psql2, psql3 )
1.2.2.1 Обновляем систему, устанавливаем etcd, останавливаем сервис etcd
dnf update -y yum install etcd -y systemctl stop etcd
1.2.2.2. Создаем конфигурацию /etc/etcd/etcd.conf:
1.2.2.2.1. На первом хосте 192.168.27.239 psql1:
ETCD_NAME="psql1" ETCD_DATA_DIR="/var/lib/etcd/" ETCD_HEARTBEAT="1000" ETCD_ELECTION_TIMEOUT="5000" ETCD_LISTEN_PEER_URLS="http://192.168.27.239:2380" ETCD_LISTEN_CLIENT_URLS="http://192.168.27.239:2379,http://localhost:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.27.239:2380" ETCD_INITIAL_CLUSTER="psql1=http://192.168.27.239:2380,psql2=http://192.168.27.219:2380,psql3=http://192.168.27.108:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.27.239:2379" ETCD_ENABLE_V2="true"
1.2.2.2.2. На втором хосте 192.168.27.219 psql2:
ETCD_NAME="psql2" ETCD_DATA_DIR="/var/lib/etcd/" ETCD_HEARTBEAT="1000" ETCD_ELECTION_TIMEOUT="5000" ETCD_LISTEN_PEER_URLS="http://192.168.27.219:2380" ETCD_LISTEN_CLIENT_URLS="http://192.168.27.219:2379,http://localhost:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.27.219:2380" ETCD_INITIAL_CLUSTER="psql1=http://192.168.27.239:2380,psql2=http://192.168.27.219:2380,psql3=http://192.168.27.108:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.27.219:2379" ETCD_ENABLE_V2="true
1.2.2.2.3. На третьем хосте 192.168.27.108 psql3:
ETCD_NAME="psql3" ETCD_DATA_DIR="/var/lib/etcd/" ETCD_HEARTBEAT="1000" ETCD_ELECTION_TIMEOUT="5000" ETCD_LISTEN_PEER_URLS="http://192.168.27.108:2380" ETCD_LISTEN_CLIENT_URLS="http://192.168.27.108:2379,http://localhost:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.27.108:2380" ETCD_INITIAL_CLUSTER="psql1=http://192.168.27.239:2380,psql2=http://192.168.27.219:2380,psql3=http://192.168.27.108:2380" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_CLUSTER_TOKEN="etcd-postgres-cluster" ETCD_ADVERTISE_CLIENT_URLS="http://192.168.27.108:2379" ETCD_ENABLE_V2="true"
- ETCD_NAME — имя хоста на котором производится настройка
- ETCD_LISTEN_CLIENT_URLS — url для прослушивания клиентских запросов. ( можно указать 0.0.0.0:2379 в этом случаи хост будет слушать все )
- ETCD_ADVERTISE_CLIENT_URLS — url для клиентских запросов ( указываем ip хоста, на котором производится настройка )
- ETCD_INITIAL_ADVERTISE_PEER_URLS — url для запросов от других узлов etcd ( указываем ip хоста, на котором производится настройка )
- ETCD_INITIAL_CLUSTER_TOKEN — токен для идентификации кластера ( должен совпадать на каждом хоста postgresql )
- ETCD_INITIAL_CLUSTER — все узлы и их url ( конструкция выглядит следующим образом «host_name_1=http://ip_iddress:2380,host_name_2=http://ip_iddress:2380,host_name_3=http://ip_iddress:2380» )
- ETCD_INITIAL_CLUSTER_STATE — начальное состояние кластера
- ETCD_DATA_DIR — директорию, где хранятся данные ETCD
- ETCD_ELECTION_TIMEOUT — таймаут выборов в миллисекундах
- ETCD_HEARTBEAT — интервал между отправкой heatbeat сигналов в миллисекундах
1.2.2.3. Перезапустите службы и проверьте работу etcd
systemctl daemon-reload systemctl enable etcd systemctl start etcd
В случае если были ошибки в конфигурациях и служба корректно не запускалась, потребуется удалить каталог и перезапустить службы на всех нодах:
rm -rf /var/lib/etcd/* - каталог назначения данных systemctl restart etcd
Для проверки работы:
etcdctl member list etcdctl endpoint status --write-out=table --endpoints=psql1:2379,psql2:2379,psql3:2379
1.2.3. Установка PostgreSQL ( на хостах psql1,psql2,psql3 )
1.2.3.1. Установите БД на всех нодах
dnf install postgresql16 postgresql16-server postgresql16-contrib -y
Проверьте что БД не запущена на всех нодах
systemctl stop postgresql-16.service
1.2.3.1.1. на первой ноде psql1
/usr/pgsql-16/bin/postgresql-16-setup initdb - инициализация БД systemctl start postgresql-16.service - запуск службы sudo -i -u postgres psql - вход в БД
CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'replicator'; - создание пользователя replicator и установка пароля ALTER USER postgres PASSWORD 'postgres'; - изменение пользователя postgres и установка нового пароля CREATE USER cddisk WITH password 'cddisk'; - создание пользователя cddisk и установка пароля для приложения Корпоративный сервер CREATE DATABASE cddisk OWNER cddisk; - создание базы данных cddisk для приложения Корпоративный сервер GRANT ALL privileges ON DATABASE cddisk TO cddisk; - предоставление прав к БД CREATE USER ds WITH password 'ds'; создание пользователя ds и установка пароля для приложения Сервер документов CREATE DATABASE ds OWNER ds; - создание базы данных ds для приложения Сервер документов GRANT ALL privileges ON DATABASE ds TO ds; - предоставление прав к БД
Рекомендуется изменить пользователей и пароли для безопасности
1.2.3.1.2. на других нодах проверить что БД не запущена
systemctl status postgresql-16.service
1.2.4. Установка Patroni( на хостах psql1, psql2, psql3 )
1.2.4.1. Установите зависимости и patroni на всех нодах
dnf install python3 python3-pip python3-psycopg2 patroni -y dnf install python3-devel-3.8.2-15.el7.x86_64 (или более новее) dnf install libpq-devel-15.0-2.el7.x86_64 (или более новее) pip3 install wheel pip3 install patroni[etcd]
Дополнительно:
в файле ~/.bashrc
и добавьте
export PATRONICTL_CONFIG_FILE=/etc/patroni/patroni.yml
1.2.4.3. Создайте конфигурацию patroni
Примечание: В зависимости от версии postgresql значения data_dir и bin_dir могут быть другими.
Поэтому значения будут выглядеть следующим образом на момент сборки стенда:
data_dir: /var/lib/pgsql/16/data bin_dir: /usr/pgsql-16/bin
1.2.4.3.1. На первом хосте 192.168.27.239 postgresql1 /etc/patroni/patroni.yml:
Обратить внимание на форматирование и настройки postgresql и приведет полный файл yml, в качестве примера:
name: psql1 scope: pg-cluster watchdog: mode: off restapi: listen: 192.168.27.239:8008 connect_address: "192.168.27.239:8008" etcd: hosts: 192.168.27.239:2379,192.168.27.219:2379,192.168.27.108:2379 bootstrap: dcs: ttl: 30 loop_wait: 10 maximum_lag_on_failover: 1048576 postgresql: use_pg_rewind: true use_slots: true parameters: max_connections: 2000 superuser_reserved_connections: 5 max_locks_per_transaction: 64 max_prepared_transactions: 0 huge_pages: try shared_buffers: 512MB work_mem: 128MB maintenance_work_mem: 256MB effective_cache_size: 2GB checkpoint_timeout: 15min checkpoint_completion_target: 0.9 wal_compression: on min_wal_size: 2GB max_wal_size: 4GB wal_buffers: 32MB default_statistics_target: 1000 seq_page_cost: 1 random_page_cost: 4 effective_io_concurrency: 2 synchronous_commit: on autovacuum: on autovacuum_max_workers: 5 autovacuum_vacuum_scale_factor: 0.01 autovacuum_analyze_scale_factor: 0.02 autovacuum_vacuum_cost_limit: 200 autovacuum_vacuum_cost_delay: 20 autovacuum_naptime: 1s max_files_per_process: 4096 archive_mode: on archive_timeout: 1800s archive_command: cd . wal_level: replica wal_keep_segments: 130 max_wal_senders: 10 max_replication_slots: 10 hot_standby: on hot_standby_feedback: True wal_log_hints: on shared_preload_libraries: pg_stat_statements,auto_explain pg_stat_statements.max: 10000 pg_stat_statements.track: all pg_stat_statements.save: off auto_explain.log_min_duration: 10s auto_explain.log_analyze: true auto_explain.log_buffers: true auto_explain.log_timing: false auto_explain.log_triggers: true auto_explain.log_verbose: true auto_explain.log_nested_statements: true track_io_timing: on log_lock_waits: on log_temp_files: 3 track_activities: on track_counts: on track_functions: all log_checkpoints: on logging_collector: on log_truncate_on_rotation: on log_rotation_age: 1d log_rotation_size: 0 log_line_prefix: '%t [%p-%l] %r %q%u@%d ' log_filename: 'postgresql-%a.log' log_directory: /var/lib/pgsql/16/data/log initdb: - encoding: UTF8 - data-checksums pg_hba: - local all postgres peer - host replication replicator 192.168.27.239/32 md5 - host replication replicator 192.168.27.219/32 md5 - host replication replicator 192.168.27.108/32 md5 - host replication replicator 127.0.0.1/32 md5 - host all all 0.0.0.0/0 md5 postgresql: pgpass: /var/lib/pgsql/16/.pgpass listen: 192.168.27.239:5432 connect_address: "192.168.27.239:5432" data_dir: /var/lib/pgsql/16/data/ bin_dir: /usr/pgsql-16/bin/ config_dir: /var/lib/pgsql/16/data pg_hba: - local all postgres peer - host replication replicator 192.168.27.239/32 md5 - host replication replicator 192.168.27.219/32 md5 - host replication replicator 192.168.27.108/32 md5 - host replication replicator 127.0.0.1/32 trust - host all all 0.0.0.0/0 md5 replication: username: replicator password: replicator superuser: username: postgres password: postgres remove_data_directory_on_rewind_failure: false remove_data_directory_on_diverged_timelines: false create_replica_methods: - basebackup basebackup: max-rate: '100M' checkpoint: 'fast' watchdog: mode: off # Allowed values: off, automatic, required device: /dev/watchdog safety_margin: 5 tags: nofailover: false noloadbalance: false clonefrom: false nosync: false
В конфигурации параметры БД возможно изучить на сайте postgresql
1.2.4.3.2. На втором хосте 192.168.27.219 psql2 /etc/patroni/patroni.yml
Так же укажите файл patroni.yml, изменив на ip адреса машины 192.168.27.219:8008
в параметрах
restapi: listen: 192.168.27.239:8008 connect_address: «192.168.27.239:8008»
postgresql: pgpass: /var/lib/pgsql/16/.pgpass listen: 192.168.27.239:5432 connect_address: «192.168.27.239:5432»
1.2.4.3.3. На втором хосте 192.168.27.108 psql3 etc/patroni/patroni.yml
Так же указать файл patroni.yml, изменив на ip адреса машины аналогично прошлому пункту 192.168.27.108:8008
1.2.4.3.4. Выполните команды на всех нодах
sudo chown postgres:postgres -R /etc/patroni sudo chmod 700 /etc/patroni
1.2.4.4. Краткое описание /etc/patroni/patroni.yml:
Это конфигурационный файл для Patroni, инструмента управления высокодоступным кластером PostgreSQL.
scope: Название кластера («pg_cluster»)
name: Имя текущего узла («postgresql1 или postgreslq2»).
restapi: Настройки для REST API Patroni.
- listen: IP и порт для прослушивания REST API («0.0.0.0:8008»).
- connect_address: IP и порт, по которым будут подключаться клиенты к REST API (192.168.27.239:8008).
etcd: Настройки для подключения к ETCD, распределенному хранилищу состояния.
- hosts: Список хостов ETCD для подключения (192.168.27.239:2379,192.168.27.219:2379,192.168.27.108:2379).
bootstrap: Настройки для начальной настройки кластера.
- dcs: Настройки распределенной системы координирования (DCS).
- ttl: Время жизни записи в DCS в секундах («30»).
- loop_wait: Интервал опроса DCS в секундах («10»).
- retry_timeout: Тайм-аут для повторных попыток взятия лока в DCS в секундах («10»).
- maximum_lag_on_failover: Максимально допустимая задержка репликации перед переключением мастера в байтах («1048576»).
- postgresql: Настройки для PostgreSQL.
- use_pg_rewind: Использовать ли pg_rewind для восстановления («true»).
- use_slots: Включить ли использование слотов репликации («true»).
- parameters: Дополнительные параметры PostgreSQL, указанные в формате «ключ: значение».
- initdb: Настройки для команды initdb.
- pg_hba: Разрешения доступа к PostgreSQL.
- users: Пользователи PostgreSQL.
- admin: Имя пользователя («admin») и его настройки, включая пароль и опции.
postgresql: Настройки для PostgreSQL.
- listen: IP и порт для прослушивания PostgreSQL (0.0.0.0:5432 — для всех адресов без исключения).
- connect_address: IP и порт, по которым будут подключаться клиенты к PostgreSQL (192.168.27.239:5432).
- data_dir: Директория, где хранятся данные PostgreSQL («/var/lib/pgsql/16/data/»).
- config_dir: Директория настроек существующей базы («/var/lib/pgsql/16/data»)
- bin_dir: Директория, где находятся исполняемые файлы PostgreSQL («/usr/lib/postgresql/16/bin»).
- pgpass: Путь к файлу pgpass для автоматической аутентификации в PostgreSQL.
- authentication: Настройки аутентификации PostgreSQL.
- replication: Пользователь для репликации («replicator») и его пароль.
- superuser: Суперпользователь («postgres») и его пароль.
- parameters: Дополнительные параметры PostgreSQL, указанные в формате «ключ: значение».
tags: Дополнительные теги для управления поведением Patroni.
- nofailover: Запретить автоматический переход к другому мастеру при сбое («false»).
- noloadbalance: Запретить автоматическую балансировку нагрузки («false»).
- clonefrom: Запретить клонирование другой реплики («false»).
- nosync: Отключить синхронизацию реплик («false»).
1.2.4.5. Настройка сервиса patroni для всех нод
в файл ~/.bashrc добавьте
export PATRONICTL_CONFIG_FILE=/etc/patroni/patroni.yml
1.2.4.6. Перезапустите сервис patroni и проверьте состояние кластера:
systemctl daemon-reload systemctl enable patroni --now systemctl status patroni patronictl list
1.2.4.7. Полезные команды при настройке
в случае если не указывался из пункта 2.4.5, то потребуется указания ключа -с
patronictl -c /etc/patroni/patroni.yml edit-config - изменение принятой конфигурации patroni.yml (может потребовать при проверке правильности принимаемых параметров patroni) patronictl -c /etc/patroni/patroni.yml restart pg-cluster psql1 patronictl -c /etc/patroni/patroni.yml restart pg-cluster psql2 patronictl -c /etc/patroni/patroni.yml restart pg-cluster psql3 patroni --validate-config /etc/patroni/patroni.yml проверка конфигурации на ошибки
Система сама выберет лидера(master) и реплики (slave).
Если выключить машину Лидер то этот статус автоматически назначается на любой доступный хост.
2. Rabbitmq кластер
2.1. Установка ПО RabbitMQ
Примечание: При включенной службе firewalld необходимо добавить порты 15672, 25672, 4369 и выполнить настройку для amqp.
2.1.1. Установка ПО RabbitMQ для всех нод
dnf install rabbitmq-server -y systemctl enable --now rabbitmq-server
2.2. Настройка хостов с ПО RabbitMQ
Примечание: При отсутствии возможности добавить записи на DNS сервере, необходимо сделать записи в файле /etc/hosts на ВСЕХ нодах в кластере и хосте с HAProxy.
/etc/hosts 127.0.0.1 localhost rabmq1 192.168.27.238 rabmq1.localdomain 192.168.27.118 rabmq2.localdomain 192.168.27.31 rabmq3.localdomain 192.168.27.83 haproxy
Переименуйте все ноды
hostnamectl set-hostname rabmq1.localdomain hostnamectl set-hostname rabmq2.localdomain hostnamectl set-hostname rabmq3.localdomain
2.2.1. Настройка ноды rabmq1
# Создаем файл mcedit /etc/rabbitmq/rabbitmq-env.conf # Добавляем переменные окружения RABBITMQ_NODENAME=rabbit@rabmq1.localdomain RABBITMQ_USE_LONGNAME=true
2.2.2. Настройка нод rabmq2 и rabmq3
# Создаем файл mcedit /etc/rabbitmq/rabbitmq-env.conf # Добавляем переменные окружения RABBITMQ_NODENAME=rabbit@rabmq2.localdomain RABBITMQ_USE_LONGNAME=true
и
# Создаем файл mcedit /etc/rabbitmq/rabbitmq-env.conf # Добавляем переменные окружения RABBITMQ_NODENAME=rabbit@rabmq3.localdomain RABBITMQ_USE_LONGNAME=true
2.2.3. Скопируйте сookie с Primary на Secondary ноды
- Любым удобным для Вас способом, копируем c заменой сookie /var/lib/rabbitmq/.erlang.cookie с rabmq1 ноды на ВСЕ остальные ноды в кластере.
назначьте права на сookie на нодах:
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie chmod 400 /var/lib/rabbitmq/.erlang.cookie
Перезапустите службу на всех нодах кластера
systemctl restart rabbitmq-server
2.2.4. Добавление нод rabmq2 и rabmq3 к кластеру
# Остановите приложение на нодах rabmq2 и rabmq3 для добавления к кластеру: rabbitmqctl stop_app # Потребуется сброс rabbitmq на нодах rabmq2 и rabmq3 rabbitmqctl reset # Добавьте ноды к кластеру, выполните на rabmq2 и rabmq3 rabbitmqctl join_cluster rabbit@rabmq1.localdomain # Запустите приложение на нодах rabmq2 и rabmq3: rabbitmqctl start_app # Проверьте статус кластера на всех нодах: rabbitmqctl cluster_status
2.3. Настройка кластера RabbitMQ
2.3.1 Включите плагин Management Plugin на всех нодах кластера
rabbitmq-plugins enable \ rabbitmq_management
2.3.2. Создайте виртуальный хост для haproxy и пользователя для подключения к Серверу документов и Корпоративному серверу
На ноде rabmq1 создайте vhost haproxy и пользователя r7office с доступом к vhost:
rabbitmqctl add_vhost haproxy
Создайте пользователя r7office с паролем r7office и выдайте ему права
rabbitmqctl add_user r7office r7office
Примечание:
На версии КС 4400 нет возможности использовать отличный от корня «/». Предоставьте права r7-office для Корпоративного сервера:
rabbitmqctl set_permissions -p / r7office «.*» «.*» «.*»
При необходимости выдайте права администратора если будет использоваться пользователь для подключения с помощью Management Plugin
rabbitmqctl set_user_tags r7office administrator
Выдайте права пользователю r7office на vhost haproxy (кластер сервера документов)
rabbitmqctl set_permissions -p haproxy r7office «.*» «.*» «.*»
# Настраиваем зеркальную очередь с префиксом amq (при сбое сервера A эти блоки очереди выходят на сервер B)
rabbitmqctl set_policy haproxy ‘^(?!amq\.).*’ ‘{«ha-mode»: «all»}’
2.4. Проверяем работу кластера
Поочередно останавливаем службу rabbitmq-server.service на нодах кластера
systemctl stop rabbitmq-server.service
- Проверяем состояние ноды с помощью плагина Management Plugin http://192.168.27.238:15672/
3. Кластер Redis
Примечание: При отсутствии возможности добавить записи на DNS сервере, необходимо сделать записи в файле /etc/hosts на ВСЕХ нодах в кластере и хосте с HAProxy.
/etc/hosts 127.0.0.1 localhost redis1 192.168.27.238 redis1.localdomain redis1 192.168.27.118 redis2.localdomain redis2 192.168.27.31 redis3.localdomain redis3 192.168.27.83 haproxy
При включенной службе firewalld необходимо добавить порты 6379, 26379, 4369 и выполнить настройку для redis.
Переименуйте все ноды:
hostnamectl set-hostname redis1.localdomain hostnamectl set-hostname redis2.localdomain hostnamectl set-hostname redis3.localdomain
3.1. Установка Redis и Sentinal
dnf install redis -y на все ноды
3.2. Настройка
Внесите правки в файл /etc/redis/redis.conf
maxclients 20000 - максимальное количество клиентов maxmemory-policy allkeys-lfu - политика вытеснения ключей save "" - политика создания снапшотов - отключение appendonly no - отключение сохранения базы данных Redis в файл masterauth "SecretPassword" - укажите пароль к Мастеру Укажите представление ноды в кластере: на ноде redis1: replica-announce-ip redis1.localdomain на ноде redis2: replica-announce-ip redis2.localdomain на ноде redis3: replica-announce-ip redis3.localdomain requirepass "SecretPassword" - пароль к Мастеру На нодах redis2 и redis3 укажите: replicaof redis1.localdomain 6379
Внесите правки в файл /etc/redis/sentinel.conf
на ноде redis 1 sentinel announce-ip redis1.localdomain на ноде redis 2 sentinel announce-ip redis2.localdomain на ноде redis 3 sentinel announce-ip redis-3.localdomain на всех нодах sentinel monitor mymaster redis1.localdomain 6379 2 sentinel auth-pass mymaster SecretPassword sentinel down-after-milliseconds mymaster 3000 sentinel failover-timeout mymaster 6000 sentinel resolve-hostnames yes sentinel announce-hostnames yes
3.4. Запустите сервисы и проверьте работу
sudo systemctl restart redis sudo systemctl enable redis redis-cli -p 26379 info sentinel - инфо о работе sentinel redis-cli -p 26379 sentinel ckquorum mymaster - инфо о кворуме redis-cli -a SecretPassword info replication | grep role - проверка роли