Перейти к основному содержимому
Версия: 2.0.x

Управление журналами аудита в Selena через AuditLoader

В этом разделе описывается, как управлять журналами аудита Selena в таблице с помощью плагина AuditLoader.

Selena хранит журналы аудита в локальном файле fe/log/fe.audit.log, а не во внутренней базе данных. Плагин AuditLoader позволяет управлять журналами аудита непосредственно в вашем cluster. После установки AuditLoader считывает журналы из файла и загружает их в Selena через HTTP PUT. Затем вы можете запрашивать журналы аудита в Selena с помощью SQL-выражений.

Создание таблицы для хранения журналов аудита

Создайте базу данных и таблицу в вашем cluster Selena для хранения журналов аудита. Подробные инструкции см. в разделах CREATE DATABASE и CREATE TABLE.

Поскольку поля журналов аудита различаются в разных версиях Selena, важно следовать приведённым ниже рекомендациям, чтобы избежать проблем совместимости при обновлении:

ВНИМАНИЕ

  • Все новые поля должны быть помечены как NULL.
  • Поля НЕ должны переименовываться, так как пользователи могут на них полагаться.
  • К типам полей должны применяться только обратно совместимые изменения, например, VARCHAR(32) -> VARCHAR(64), чтобы избежать ошибок при вставке.
  • Поля AuditEvent разрешаются только по имени. Порядок столбцов в таблице не имеет значения, и пользователь может изменить его в любое время.
  • Поля AuditEvent, которые не существуют в таблице, игнорируются, поэтому пользователи могут удалить столбцы, которые им не нужны.
CREATE DATABASE selena_audit_db__;

CREATE TABLE selena_audit_db__.selena_audit_tbl__ (
`queryId` VARCHAR(64) COMMENT "Уникальный идентификатор запроса",
`timestamp` DATETIME NOT NULL COMMENT "Время начала запроса",
`queryType` VARCHAR(12) COMMENT "Тип запроса (query, slow_query, connection)",
`clientIp` VARCHAR(32) COMMENT "IP-адрес клиента",
`user` VARCHAR(64) COMMENT "Имя пользователя запроса",
`authorizedUser` VARCHAR(64) COMMENT "Уникальный идентификатор пользователя, т.е. user_identity",
`resourceGroup` VARCHAR(64) COMMENT "Имя группы ресурсов",
`catalog` VARCHAR(32) COMMENT "Имя каталога",
`db` VARCHAR(96) COMMENT "База данных, в которой выполняется запрос",
`state` VARCHAR(8) COMMENT "Состояние запроса (EOF, ERR, OK)",
`errorCode` VARCHAR(512) COMMENT "Код ошибки",
`queryTime` BIGINT COMMENT "Время выполнения запроса (миллисекунды)",
`scanBytes` BIGINT COMMENT "Количество просканированных байт запроса",
`scanRows` BIGINT COMMENT "Количество просканированных строк запроса",
`returnRows` BIGINT COMMENT "Количество возвращённых строк запроса",
`cpuCostNs` BIGINT COMMENT "Время CPU, потреблённое запросом (наносекунды)",
`memCostBytes` BIGINT COMMENT "Память, потреблённая запросом (байты)",
`stmtId` INT COMMENT "Инкрементный идентификатор SQL-выражения",
`isQuery` TINYINT COMMENT "Является ли SQL запросом (1 или 0)",
`feIp` VARCHAR(128) COMMENT "IP-адрес FE, выполнившего выражение",
`stmt` VARCHAR(1048576) COMMENT "Оригинальное SQL-выражение",
`digest` VARCHAR(32) COMMENT "Отпечаток медленного SQL",
`planCpuCosts` DOUBLE COMMENT "Использование CPU при планировании запроса (наносекунды)",
`planMemCosts` DOUBLE COMMENT "Использование памяти при планировании запроса (байты)",
`pendingTimeMs` BIGINT COMMENT "Время ожидания запроса в очереди (миллисекунды)",
`candidateMVs` VARCHAR(65533) NULL COMMENT "Список кандидатов материализованных представлений",
`hitMvs` VARCHAR(65533) NULL COMMENT "Список совпавших материализованных представлений",
`warehouse` VARCHAR(32) NULL COMMENT "Имя хранилища"
) ENGINE = OLAP
DUPLICATE KEY (`queryId`, `timestamp`, `queryType`)
COMMENT "Таблица журналов аудита"
PARTITION BY date_trunc('day', `timestamp`)
PROPERTIES (
"replication_num" = "1",
"partition_live_number" = "30"
);

selena_audit_tbl__ создаётся с динамическими партициями. По умолчанию первая динамическая партиция создаётся через 10 минут после создания таблицы. Затем журналы аудита можно загружать в таблицу. Вы можете проверить партиции в таблице с помощью следующего выражения:

SHOW PARTITIONS FROM selena_audit_db__.selena_audit_tbl__;

После создания партиции вы можете перейти к следующему шагу.

Загрузка и настройка AuditLoader

  1. Загрузите установочный пакет AuditLoader. Пакет совместим со всеми доступными версиями Selena.

  2. Распакуйте установочный пакет.

    unzip auditloader.zip

    Будут извлечены следующие файлы:

    • auditloader.jar: JAR-файл AuditLoader.
    • plugin.properties: файл свойств AuditLoader. Вам не нужно изменять этот файл.
    • plugin.conf: файл конфигурации AuditLoader. В большинстве случаев вам нужно изменить только поля user и password в файле.
  3. Измените plugin.conf для настройки AuditLoader. Вы должны настроить следующие элементы, чтобы AuditLoader работал правильно:

    • frontend_host_port: IP-адрес и HTTP-порт FE в формате <fe_ip>:<fe_http_port>. Рекомендуется установить значение по умолчанию 127.0.0.1:8030. Каждый FE в Selena управляет своим журналом аудита независимо, и после установки плагина каждый FE запускает свой фоновый поток для получения и сохранения журналов аудита и записи их через Stream Load. Параметр конфигурации frontend_host_port используется для предоставления IP и порта HTTP-протокола для фоновой задачи Stream Load плагина, и этот параметр не поддерживает несколько значений. IP-часть параметра может использовать IP любого FE в cluster, но это не рекомендуется, потому что если соответствующий FE выйдет из строя, задача записи журнала аудита в фоновом режиме других FE также завершится неудачей из-за сбоя связи. Рекомендуется установить значение по умолчанию 127.0.0.1:8030, чтобы каждый FE использовал свой собственный HTTP-порт для связи, тем самым избегая влияния на связь в случае исключения других FE (все задачи записи в конечном итоге будут перенаправлены на узел FE Leader для выполнения).
    • database: имя базы данных, которую вы создали для хранения журналов аудита.
    • table: имя таблицы, которую вы создали для хранения журналов аудита.
    • user: ваше имя пользователя cluster. Вы ДОЛЖНЫ иметь привилегию для загрузки данных (LOAD_PRIV) в таблицу.
    • password: ваш пароль пользователя.
    • secret_key: ключ (строка, не должна быть длиннее 16 байт), используемый для шифрования пароля. Если этот параметр не установлен, это означает, что пароль в plugin.conf не будет зашифрован, и вам нужно указать только открытый текст пароля в password. Если этот параметр указан, это означает, что пароль зашифрован этим ключом, и вам нужно указать зашифрованную строку в password. Зашифрованный пароль можно сгенерировать в Selena с помощью функции AES_ENCRYPT: SELECT TO_BASE64(AES_ENCRYPT('password','secret_key'));.
    • filter: условия фильтра для загрузки журнала аудита. Этот параметр основан на параметре WHERE в Stream Load, т.е. -H "where: <condition>", по умолчанию пустая строка. Пример: filter=isQuery=1 and clientIp like '127.0.0.1%' and user='root'.
  4. Снова заархивируйте файлы в пакет.

    zip -q -m -r auditloader.zip auditloader.jar plugin.conf plugin.properties
  5. Распространите пакет на все машины, на которых размещены узлы FE. Убедитесь, что все пакеты хранятся по идентичному пути. В противном случае установка завершится неудачей. Не забудьте скопировать абсолютный путь к пакету после распространения.

ПРИМЕЧАНИЕ

Вы также можете распространить auditloader.zip на HTTP-сервис, доступный всем FE (например, httpd или nginx), и установить его через сеть. Обратите внимание, что в обоих случаях auditloader.zip должен сохраняться в пути после выполнения установки, и исходные файлы не должны удаляться после установки.

Установка AuditLoader

Выполните следующее выражение вместе с путём, который вы скопировали, чтобы установить AuditLoader в качестве плагина в Selena:

INSTALL PLUGIN FROM "<absolute_path_to_package>";

Пример установки из локального пакета:

INSTALL PLUGIN FROM "<absolute_path_to_package>";

Если вы хотите установить плагин через сетевой путь, вам нужно указать md5 пакета в свойствах выражения INSTALL.

Пример:

INSTALL PLUGIN FROM "http://xx.xx.xxx.xxx/extra/auditloader.zip" PROPERTIES("md5sum" = "3975F7B880C9490FE95F42E2B2A28E2D");

Подробные инструкции см. в разделе INSTALL PLUGIN.

Проверка установки и запрос журналов аудита

  1. Вы можете проверить, была ли установка успешной, с помощью SHOW PLUGINS.

    В следующем примере Status плагина AuditLoader равен INSTALLED, что означает успешную установку.

    mysql> SHOW PLUGINS\G
    *************************** 1. row ***************************
    Name: __builtin_AuditLogBuilder
    Type: AUDIT
    Description: builtin audit logger
    Version: 0.12.0
    JavaVersion: 1.8.31
    ClassName: com.selena.qe.AuditLogBuilder
    SoName: NULL
    Sources: Builtin
    Status: INSTALLED
    Properties: {}
    *************************** 2. row ***************************
    Name: AuditLoader
    Type: AUDIT
    Description: Available for versions 3.3.11+. Load audit log to selena, and user can view the statistic of queries
    Version: 5.0.0
    JavaVersion: 11
    ClassName: com.selena.plugin.audit.AuditLoaderPlugin
    SoName: NULL
    Sources: /x/xx/xxx/xxxxx/auditloader.zip
    Status: INSTALLED
    Properties: {}
    2 rows in set (0.01 sec)
  2. Выполните несколько случайных SQL для генерации журналов аудита и подождите 60 секунд (или время, которое вы указали в элементе max_batch_interval_sec при настройке AuditLoader), чтобы AuditLoader загрузил журналы аудита в Selena.

  3. Проверьте журналы аудита, запросив таблицу.

    SELECT * FROM selena_audit_db__.selena_audit_tbl__;

    Следующий пример показывает, когда журналы аудита успешно загружены в таблицу:

    mysql> SELECT * FROM selena_audit_db__.selena_audit_tbl__\G
    *************************** 1. row ***************************
    queryId: 01975a33-4129-7520-97a2-05e641cec6c9
    timestamp: 2025-06-10 14:16:37
    queryType: query
    clientIp: xxx.xx.xxx.xx:65283
    user: root
    authorizedUser: 'root'@'%'
    resourceGroup: default_wg
    catalog: default_catalog
    db:
    state: EOF
    errorCode:
    queryTime: 3
    scanBytes: 0
    scanRows: 0
    returnRows: 1
    cpuCostNs: 33711
    memCostBytes: 4200
    stmtId: 102
    isQuery: 1
    feIp: xxx.xx.xxx.xx
    stmt: SELECT * FROM selena_audit_db__.selena_audit_tbl__
    digest:
    planCpuCosts: 908
    planMemCosts: 0
    pendingTimeMs: -1
    candidateMvs: null
    hitMVs: null
    …………

Устранение неполадок

Если журналы аудита не загружаются в таблицу после создания динамической партиции и установки плагина, вы можете проверить, правильно ли настроен plugin.conf. Чтобы изменить его, вы должны сначала удалить плагин:

UNINSTALL PLUGIN AuditLoader;

Журналы AuditLoader выводятся в fe.log, вы можете найти их, выполнив поиск по ключевому слову audit в fe.log. После того как все настройки будут установлены правильно, вы можете следовать описанным выше шагам, чтобы снова установить AuditLoader.