メインコンテンツまでスキップ

Manage audit logs within StarRocks via Audit Loader

Audit Loaderを使用してStarRocks内での監査ログを管理する

このトピックでは、Audit Loaderプラグインを使用してStarRocks内のテーブル内で監査ログを管理する方法について説明します。

StarRocksは内部データベースではなく、ローカルファイルのfe/log/fe.audit.logに監査ログを保存します。Audit Loaderプラグインを使用すると、クラスタ内で直接監査ログを管理できます。Audit Loaderはログをファイルから読み込み、HTTP PUTを介してStarRocksにロードします。

監査ログを格納するためのテーブルを作成する

StarRocksクラスタで、監査ログを格納するためのデータベースとテーブルを作成します。詳細な手順については、CREATE DATABASECREATE TABLEを参照してください。

監査ログのフィールドは、StarRocksのバージョンによって異なるため、StarRocksに互換性のあるテーブルを作成するために、次の例のいずれかを選択する必要があります。

注意

以下の例でテーブルのスキーマを変更しないでください。スキーマを変更すると、ログのロードに失敗します。

  • StarRocks v2.4、v2.5、v3.0、v3.1、およびそれ以降のマイナーバージョンの場合:
CREATE DATABASE starrocks_audit_db__;

CREATE TABLE starrocks_audit_db__.starrocks_audit_tbl__ (
`queryId` VARCHAR(48) COMMENT "固有のクエリID",
`timestamp` DATETIME NOT NULL COMMENT "クエリの開始時間",
`queryType` VARCHAR(12) COMMENT "クエリのタイプ(クエリ、遅いクエリ)",
`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(96) COMMENT "エラーコード",
`queryTime` BIGINT COMMENT "クエリのレイテンシ(ミリ秒単位)",
`scanBytes` BIGINT COMMENT "スキャンされたデータのサイズ(バイト)",
`scanRows` BIGINT COMMENT "スキャンされたデータの行数",
`returnRows` BIGINT COMMENT "結果の行数",
`cpuCostNs` BIGINT COMMENT "クエリのCPUリソースの消費時間(ナノ秒単位)",
`memCostBytes` BIGINT COMMENT "クエリのメモリコスト(バイト)",
`stmtId` INT COMMENT "SQLステートメントのID(インクリメンタル)",
`isQuery` TINYINT COMMENT "SQLがクエリであるかどうか(0および1)",
`feIp` VARCHAR(32) COMMENT "SQLを実行するFEのIPアドレス",
`stmt` STRING COMMENT "SQLステートメント",
`digest` VARCHAR(32) COMMENT "SQLのフィンガープリント",
`planCpuCosts` DOUBLE COMMENT "計画時のCPUリソースの消費時間(ナノ秒単位)",
`planMemCosts` DOUBLE COMMENT "計画時のメモリコスト(バイト)"
) ENGINE = OLAP
DUPLICATE KEY (`queryId`, `timestamp`, `queryType`)
COMMENT "監査ログテーブル"
PARTITION BY RANGE (`timestamp`) ()
DISTRIBUTED BY HASH (`queryId`) BUCKETS 3
PROPERTIES (
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "3",
"dynamic_partition.enable" = "true",
"replication_num" = "3"
);
  • StarRocks v2.3.0とそれ以降のマイナーバージョンの場合:
CREATE DATABASE starrocks_audit_db__;
CREATE TABLE starrocks_audit_db__.starrocks_audit_tbl__ (
`queryId` VARCHAR(48) COMMENT "固有のクエリID",
`timestamp` DATETIME NOT NULL COMMENT "クエリの開始時間",
`clientIp` VARCHAR(32) COMMENT "クライアントのIPアドレス",
`user` VARCHAR(64) COMMENT "クエリを開始したユーザー",
`resourceGroup` VARCHAR(64) COMMENT "リソースグループ名",
`db` VARCHAR(96) COMMENT "クエリがスキャンするデータベース",
`state` VARCHAR(8) COMMENT "クエリの状態(EOF、ERR、OK)",
`errorCode` VARCHAR(96) COMMENT "エラーコード",
`queryTime` BIGINT COMMENT "クエリのレイテンシ(ミリ秒単位)",
`scanBytes` BIGINT COMMENT "スキャンされたデータのサイズ(バイト)",
`scanRows` BIGINT COMMENT "スキャンされたデータの行数",
`returnRows` BIGINT COMMENT "結果の行数",
`cpuCostNs` BIGINT COMMENT "クエリのCPUリソースの消費時間(ナノ秒単位)",
`memCostBytes` BIGINT COMMENT "クエリのメモリコスト(バイト)",
`stmtId` INT COMMENT "SQLステートメントのID(インクリメンタル)",
`isQuery` TINYINT COMMENT "SQLがクエリであるかどうか(0および1)",
`feIp` VARCHAR(32) COMMENT "SQLを実行するFEのIPアドレス",
`stmt` STRING COMMENT "SQLステートメント",
`digest` VARCHAR(32) COMMENT "SQLのフィンガープリント",
`planCpuCosts` DOUBLE COMMENT "計画時のCPUリソースの消費時間(ナノ秒単位)",
`planMemCosts` DOUBLE COMMENT "計画時のメモリコスト(バイト)"
) ENGINE = OLAP
DUPLICATE KEY (`queryId`, `timestamp`, `clientIp`)
COMMENT "監査ログテーブル"
PARTITION BY RANGE (`timestamp`) ()
DISTRIBUTED BY HASH (`queryId`) BUCKETS 3
PROPERTIES (
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.enable" = "true",
"replication_num" = "3"
);
  • StarRocks v2.2.1とそれ以降のマイナーバージョンの場合:
CREATE DATABASE starrocks_audit_db__;
CREATE TABLE starrocks_audit_db__.starrocks_audit_tbl__
(
query_id VARCHAR(48) COMMENT "固有のクエリID",
time DATETIME NOT NULL COMMENT "クエリの開始時間",
client_ip VARCHAR(32) COMMENT "クライアントのIPアドレス",
user VARCHAR(64) COMMENT "クエリを開始したユーザー",
db VARCHAR(96) COMMENT "クエリがスキャンするデータベース",
state VARCHAR(8) COMMENT "クエリの状態(EOF、ERR、OK)",
query_time BIGINT COMMENT "クエリのレイテンシ(ミリ秒単位)",
scan_bytes BIGINT COMMENT "スキャンされたデータのサイズ(バイト)",
scan_rows BIGINT COMMENT "スキャンされたデータの行数",
return_rows BIGINT COMMENT "結果の行数",
cpu_cost_ns BIGINT COMMENT "クエリのCPUリソースの消費時間(ナノ秒単位)",
mem_cost_bytes BIGINT COMMENT "クエリのメモリコスト(バイト)",
stmt_id INT COMMENT "SQLステートメントのID(インクリメンタル)",
is_query TINYINT COMMENT "SQLがクエリであるかどうか(0および1)",
frontend_ip VARCHAR(32) COMMENT "SQLを実行するFEのIPアドレス",
stmt STRING COMMENT "SQLステートメント",
digest VARCHAR(32) COMMENT "SQLのフィンガープリント"
) engine=OLAP
duplicate key(query_id, time, client_ip)
partition by range(time) ()
distributed by hash(query_id) BUCKETS 3
properties(
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.enable" = "true",
"replication_num" = "3"
);
  • StarRocks v2.2.0、v2.1.0とそれ以降のマイナーバージョンの場合:
CREATE DATABASE starrocks_audit_db__;
CREATE TABLE starrocks_audit_db__.starrocks_audit_tbl__
(
query_id VARCHAR(48) COMMENT "固有のクエリID",
time DATETIME NOT NULL COMMENT "クエリの開始時間",
client_ip VARCHAR(32) COMMENT "クライアントのIPアドレス",
user VARCHAR(64) COMMENT "クエリを開始したユーザー",
db VARCHAR(96) COMMENT "クエリがスキャンするデータベース",
state VARCHAR(8) COMMENT "クエリの状態(EOF、ERR、OK)",
query_time BIGINT COMMENT "クエリのレイテンシ(ミリ秒単位)",
scan_bytes BIGINT COMMENT "スキャンされたデータのサイズ(バイト)",
scan_rows BIGINT COMMENT "スキャンされたデータの行数",
return_rows BIGINT COMMENT "結果の行数",
stmt_id INT COMMENT "SQLステートメントのID(インクリメンタル)",
is_query TINYINT COMMENT "SQLがクエリであるかどうか(0および1)",
frontend_ip VARCHAR(32) COMMENT "SQLを実行するFEのIPアドレス",
stmt STRING COMMENT "SQLステートメント",
digest VARCHAR(32) COMMENT "SQLのフィンガープリント"
) engine=OLAP
DUPLICATE KEY(query_id, time, client_ip)
PARTITION BY RANGE(time) ()
DISTRIBUTED BY HASH(query_id) BUCKETS 3
PROPERTIES(
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.enable" = "true",
"replication_num" = "3"
);
  • StarRocks v2.0.0およびそれ以降のマイナーバージョン、StarRocks v1.19.0およびそれ以降のマイナーバージョンの場合:
CREATE DATABASE starrocks_audit_db__;
CREATE TABLE starrocks_audit_db__.starrocks_audit_tbl__
(
query_id VARCHAR(48) COMMENT "固有のクエリID",
time DATETIME NOT NULL COMMENT "クエリの開始時間",
client_ip VARCHAR(32) COMMENT "クライアントのIPアドレス",
user VARCHAR(64) COMMENT "クエリを開始したユーザー",
db VARCHAR(96) COMMENT "クエリがスキャンするデータベース",
state VARCHAR(8) COMMENT "クエリの状態(EOFE、RR、OK)",
query_time BIGINT COMMENT "クエリのレイテンシ(ミリ秒単位)",
scan_bytes BIGINT COMMENT "スキャンされたデータのサイズ(バイト)",
scan_rows BIGINT COMMENT "スキャンされたデータの行数",
return_rows BIGINT COMMENT "結果の行数",
stmt_id INT COMMENT "SQLステートメントのID(インクリメンタル)",
is_query TINYINT COMMENT "SQLがクエリであるかどうか(0および1)",
frontend_ip VARCHAR(32) COMMENT "SQLを実行するFEのIPアドレス",
stmt STRING COMMENT "SQLステートメント"
) engine=OLAP
DUPLICATE KEY(query_id, time, client_ip)
PARTITION BY RANGE(time) ()
DISTRIBUTED BY HASH(query_id) BUCKETS 3
PROPERTIES(
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.enable" = "true",
"replication_num" = "3"
);

starrocks_audit_tbl__は、動的パーティションを使用して作成されます。デフォルトでは、テーブルが作成されてから10分後に最初の動的パーティションが作成されます。その後、監査ログをテーブルにロードできます。次のステートメントを使用して、テーブルでパーティションを確認できます。

SHOW PARTITIONS FROM starrocks_audit_db__.starrocks_audit_tbl__;

パーティションが作成されたら、次のステップに進むことができます。

Audit Loaderのダウンロードと設定

  1. Audit Loaderインストールパッケージをダウンロードします。パッケージには、異なるStarRocksバージョン用の複数のディレクトリが含まれています。StarRocksと互換性のあるパッケージと対応するディレクトリに移動し、パッケージをインストールします。

    • 2.4: StarRocks v2.4.0およびそれ以降のマイナーバージョン
    • 2.3: StarRocks v2.3.0およびそれ以降のマイナーバージョン
    • 2.2.1+: StarRocks v2.2.1およびそれ以降のマイナーバージョン
    • 2.1-2.2.0: StarRocks v2.2.0、StarRocks v2.1.0およびそれ以降のマイナーバージョン
    • 1.18.2-2.0: StarRocks v2.0.0およびそれ以降のマイナーバージョン、StarRocks v1.19.0およびそれ以降のマイナーバージョン
  2. インストールパッケージを解凍します。

    unzip auditloader.zip

    次のファイルが展開されます。

    • auditloader.jar: Audit LoaderのJARファイルです。
    • plugin.properties: Audit Loaderのプロパティファイルです。
    • plugin.conf: Audit Loaderの設定ファイルです。
  3. plugin.confを編集してAudit Loaderを設定します。以下の項目を設定する必要があります。

    • frontend_host_port: FEのIPアドレスとHTTPポートを <fe_ip>:<fe_http_port> の形式で設定します。デフォルト値は127.0.0.1:8030です。
    • database: 監査ログを格納するために作成したデータベースの名前です。
    • table: 監査ログを格納するために作成したテーブルの名前です。
    • user: クラスタのユーザー名です。テーブルにデータをロードする権限(LOAD_PRIV)を持っている必要があります。
    • password: ユーザーのパスワードです。
  4. ファイルをパッケージに戻します。

    zip -q -m -r auditloader.zip auditloader.jar plugin.conf plugin.properties
  5. パッケージをFEノードをホストしているすべてのマシンに配布します。パッケージが同一のパスに保存されていることを確認してください。そうでない場合、インストールに失敗します。パッケージを配布した後、パッケージの絶対パスをコピーしてください。

Audit Loaderのインストール

Audit Loaderをインストールするには、以下のステートメントを絶対パスと共に実行します。絶対パスには、コピーしたパッケージのパスを指定します。

INSTALL PLUGIN FROM "<absolute_path_to_package>";

詳細な手順については、INSTALL PLUGINを参照してください。

インストールの検証と監査ログのクエリ

  1. SHOW PLUGINSを使用して、インストールが成功したかどうかを確認できます。次の例では、プラグインAuditLoaderstatusINSTALLEDとなっており、インストールが成功していることを意味しています。

    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.starrocks.qe.AuditLogBuilder
    SoName: NULL
    Sources: Builtin
    Status: INSTALLED
    Properties: {}
    *************************** 2. row ***************************
    Name: AuditLoader
    Type: AUDIT
    Description: load audit log to olap load, and user can view the statistic of queries
    Version: 1.0.1
    JavaVersion: 1.8.0
    ClassName: com.starrocks.plugin.audit.AuditLoaderPlugin
    SoName: NULL
    Sources: /x/xx/xxx/xxxxx/auditloader.zip
    Status: INSTALLED
    Properties: {}
    2 rows in set (0.01 sec)
  2. ランダムなSQLを実行して監査ログを生成し、Audit Loaderが監査ログをStarRocksにロードするために60秒(またはAudit Loaderの設定で指定した時間)待機します。

  3. テーブルをクエリして監査ログを確認します。

    SELECT * FROM starrocks_audit_db__.starrocks_audit_tbl__;

    次の例では、監査ログがテーブルに正常にロードされたことを示しています。

    mysql> SELECT * FROM starrocks_audit_db__.starrocks_audit_tbl__\G
    *************************** 1. row ***************************
    queryId: 082ddf02-6492-11ed-a071-6ae6b1db20eb
    timestamp: 2022-11-15 11:03:08
    clientIp: xxx.xx.xxx.xx:33544
    user: root
    resourceGroup: default_wg
    db:
    state: EOF
    errorCode:
    queryTime: 8
    scanBytes: 0
    scanRows: 0
    returnRows: 0
    cpuCostNs: 62380
    memCostBytes: 14504
    stmtId: 33
    isQuery: 1
    feIp: xxx.xx.xxx.xx
    stmt: SELECT * FROM starrocks_audit_db__.starrocks_audit_tbl__
    digest:
    planCpuCosts: 21
    planMemCosts: 0
    1 row in set (0.01 sec)

トラブルシューティング

動的パーティションが作成され、プラグインがインストールされた後でも、テーブルに監査ログがロードされない場合は、plugin.confが正しく設定されているかどうかを確認できます。変更するには、まずプラグインをアンインストールする必要があります。

UNINSTALL PLUGIN AuditLoader;

すべての設定が正しく設定されたら、Audit Loaderを再度インストールするために上記の手順に従ってください。