ログストレージと分析
この文書では、コア観測コンポーネントの1つであるLogsのストレージと分析手法を紹介します。完全な観測ソリューションの概要については、Overviewを参照してください。
ステップ1: リソース見積もり
クラスターをデプロイする前に、サーバーに必要なハードウェアリソースを見積もる必要があります。以下のステップに従ってください:
- 以下の計算式を使用してデータ書き込みのリソースを見積もります:
-
平均書き込みスループット = 日次データ増分 / 86400 s -
ピーク書き込みスループット = 平均書き込みスループット \* ピーク書き込みスループットと平均書き込みスループットの比率 -
ピーク書き込みスループットに必要なCPUコア数 = ピーク書き込みスループット / シングルコアCPUの書き込みスループット
-
計算式を使用してデータストレージのリソースを見積もります:
ストレージ容量 = 日次データ増分 / データ圧縮率 * データコピー数 * データストレージ期間。 -
データクエリのリソースを見積もります。データクエリのリソースはクエリ量と複雑さに依存します。初期段階ではデータクエリ用にCPUリソースの50%を確保し、実際のテスト結果に応じて調整することを推奨します。
-
計算結果を以下のように統合します:
-
ステップ1とステップ3で計算されたCPUコア数をBEサーバーのCPUコア数で割ることで、必要なBEサーバー数を得ることができます。
-
BEサーバー数とステップ2の計算結果に基づいて、各BEサーバーに必要なストレージ容量を見積もります。
-
各BEサーバーに必要なストレージ容量を4~12個のデータディスクに配分することで、単一データディスクに必要なストレージ容量を得ることができます。
-
例として、日次データ増分が100 TB、データ圧縮率が5、データコピー数が2、ホットデータのストレージ期間が3日、コールドデータのストレージ期間が30日、ピーク書き込みスループットと平均書き込みスループットの比率が200%、シングルコアCUPの書き込みスループットが10 MB/s、データクエリ用にCPUリソースの50%を確保する場合、以下のように見積もることができます:
compute-storage-integrated mode
- FEサーバー3台が必要で、各サーバーに16コアCPU、64 GBメモリ、1 100 GB SSDディスクを構成。
- BEサーバー30台が必要で、各サーバーに32コアCPU、256 GBメモリ、8個の625 GB SSDディスクを構成。
- S3オブジェクトストレージ容量540 TB
compute-storage-decoupled mode
- FEサーバー3台が必要で、各サーバーに16コアCPU、64 GBメモリ、1 100 GB SSDディスクを構成。
- BEサーバー15台が必要で、各サーバーに32コアCPU、256 GBメモリ、8個の680 GB SSDディスクを構成。
- S3オブジェクトストレージ容量600 TB
ストレージとコンピュートの分離モードを使用することで、書き込み操作とホットデータストレージには1つのレプリカのみが必要となり、コストを大幅に削減できます。
上記例の指標の値とその計算方法について学ぶには、以下の表を参照してください。
| 指標 (単位) | compute-storage-decoupled | compute-storage-integrated | 説明 |
|---|---|---|---|
| 日次データ増分 (TB) | 100 | 100 | 実際のニーズに応じて値を指定してください。 |
| データ圧縮率 | 5 | 5 | 実際のニーズに応じて値を指定してください。通常3~10の間です。データにはインデックスデータが含まれることに注意してください。 |
| データコピー数 | 1 | 2 | 実際のニーズに応じて値を指定してください。1、2、または3にできます。デフォルト値は1です。 |
| ホットデータのストレージ期間 (日) | 3 | 3 | 実際のニーズに応じて値を指定してください。 |
| コールドデータのストレージ期間 (日) | 30 | 27 | 実際のニーズに応じて値を指定してください。 |
| データストレージ期間 | 30 | 30 | 計算式: ホットデータのストレージ期間 + コールドデータのストレージ期間 |
| ホットデータの推定ストレージ容量 (TB) | 60 | 120 | 計算式: 日次データ増分 / データ圧縮率 * データコピー数 * ホットデータのストレージ期間 |
| コールドデータの推定ストレージ容量 (TB) | 600 | 540 | 計算式: 日次データ増分 / データ圧縮率 * データコピー数 * コールドデータのストレージ期間 |
| ピーク書き込みスループットと平均書き込みスループットの比率 | 200% | 200% | 実際のニーズに応じて値を指定してください。デフォルト値は200%です。 |
| BEサーバーのCPUコア数 | 32 | 32 | 実際のニーズに応じて値を指定してください。デフォルト値は32です。 |
| 平均書き込みスループット (MB/s) | 1214 | 2427 | 計算式: 日次データ増分 / 86400 s |
| ピーク書き込みスループット (MB/s) | 2427 | 4855 | 計算式: 平均書き込みスループット * ピーク書き込みスループットと平均書き込みスループットの比率 |
| ピーク書き込みスループットに必要なCPUコア数 | 242.7 | 485.5 | 計算式: ピーク書き込みスループット / シングルコアCPUの書き込みスループット |
| データクエリ用に確保するCPUリソースの割合 | 50% | 50% | 実際のニーズに応じて値を指定してください。デフォルト値は50%です。 |
| 推定BEサーバー数 | 15.2 | 30.3 | 計算式: ピーク書き込みスループットに必要なCPUコア数 / BEサーバーのCPUコア数 /(1 - データクエリ用に確保するCPUリソースの割合) |
| 四捨五入後のBEサーバー数 | 15 | 30 | 計算式: MAX (データコピー数, 推定BEサーバー数) |
| 各BEサーバーの推定データストレージ容量 (TB) | 5.33 | 5.33 | 計算式: ホットデータの推定ストレージ容量 / 推定BEサーバー数 /(1 - 30%)。ここで30%は予約ストレージ容量の割合を表します。I/O能力を向上させるため、各BEサーバーに4~12個のデータディスクをマウントすることを推奨します。 |
ステップ2: クラスターのデプロイ
リソースを見積もった後、クラスターをデプロイする必要があります。物理環境と仮想環境の両方で手動デプロイすることを推奨します。手動デプロイについては、Manual Deploymentを参照してください。
ステップ3: FEとBEの構成を最適化
クラスターのデプロイが完了した後、ログストレージと分析のシナリオにより適合させるために、フロントエンドとバックエンドの構成パラメータをそれぞれ最適化する必要があります。
FE構成の最適化
FEの構成フィールドはfe/conf/fe.confにあります。FE構成を最適化するには、以下の表を参照してください。
| 最適化対象の構成フィールド | 説明 |
|---|---|
max_running_txn_num_per_db = 10000 | 高同期インポートトランザクションに対応するためにパラメータ値を増加させます。 |
streaming_label_keep_max_second = 3600 label_keep_max_second = 7200 | 高メモリ使用量を伴う高頻度インポートトランザクションを処理するために保持時間を増加させます。 |
enable_round_robin_create_tablet = true | Tabletを作成する際に、均等に分散するためのRound Robin戦略を使用します。 |
tablet_rebalancer_type = partition | Tabletのバランシング時に、各パーティション内で均等に分散する戦略を使用します。 |
autobucket_min_buckets = 10 | ログ量が増加した際にバケット不足を回避するため、自動バケットの最小バケット数を1から10に増加させます。 |
max_backend_heartbeat_failure_tolerance_count = 10 | ログシナリオでは、BEサーバーが高負荷により短期的なタイムアウトが発生する可能性があるため、許容回数を1から10に増加させます。 |
詳細については、FE Configurationを参照してください。
BE構成の最適化
BEの構成フィールドはbe/conf/be.confにあります。BE構成を最適化するには、以下の表を参照してください。
| モジュール | 最適化対象の構成フィールド | 説明 |
|---|---|---|
| ストレージ | storage_root_path = /path/to/dir1;/path/to/dir2;...;/path/to/dir12 | ディスクディレクトリ上のホットデータのストレージパスを構成します。 |
| - | enable_file_cache = true | ファイルキャッシュを有効にします。 |
| - | file_cache_path = [{"path": "/mnt/datadisk0/file_cache", "total_size":53687091200, "query_limit": "10737418240"},{"path": "/mnt/datadisk1/file_cache", "total_size":53687091200,"query_limit": "10737418240"}] | コールドデータのキャッシュパスと関連設定を以下の具体的な構成で設定します:path: キャッシュパスtotal_size: キャッシュパスの総サイズ(バイト単位)。53687091200バイトは50 GBに相当query_limit: 1回のクエリでキャッシュパスから照会できるデータの最大量(バイト単位)。10737418240バイトは10 GBに相当 |
| 書き込み | write_buffer_size = 1073741824 | 小さなファイルとランダムI/O操作を削減し、パフォーマンスを向上させるために、書き込みバッファのファイルサイズを増加させます。 |
| - | max_tablet_version_num = 20000 | テーブル作成時のtime_series compaction戦略と連携して、より多くのバージョンが一時的にマージされずに残ることを許可します |
| Compaction | max_cumu_compaction_threads = 8 | CPUコア数 / 4に設定。CPUリソースの1/4を書き込み、1/4をバックグラウンドcompaction、2/1をクエリとその他の操作に使用することを示します。 |
| - | inverted_index_compaction_enable = true | compaction中のCPU消費を削減するため、転置インデックスcompactionを有効にします。 |
| - | enable_segcompaction = false enable_ordered_data_compaction = false | ログシナリオでは不要な2つのcompaction機能を無効にします。 |
| - | enable_compaction_priority_scheduling = false | 低優先度compactionは単一ディスクで2タスクに制限されており、compactionの速度に影響を与える可能性があります。 |
| - | total_permits_for_compaction_score = 200000 | このパラメータはメモリ制御に使用されます。メモリ時系列戦略では、パラメータ自体がメモリを制御できます。 |
| キャッシュ | disable_storage_page_cache = true inverted_index_searcher_cache_limit = 30% | ログデータの大量さと限定的なキャッシュ効果のため、データキャッシュからインデックスキャッシュに切り替えます。 |
| - | inverted_index_cache_stale_sweep_time_sec = 3600 index_cache_entry_stay_time_after_lookup_s = 3600 | インデックスキャッシュをメモリ内に最大1時間維持します。 |
| - | enable_inverted_index_cache_on_cooldown = trueenable_write_index_searcher_cache = false | インデックスアップロード中にコールドデータストレージの自動キャッシュを有効にします。 |
| - | tablet_schema_cache_recycle_interval = 3600 segment_cache_capacity = 20000 | 他のキャッシュによるメモリ使用量を削減します。 |
| - | inverted_index_ram_dir_enable = true | 一時的なインデックスファイルへの書き込みによるIOオーバーヘッドを削減します。 |
| スレッド | pipeline_executor_size = 24 doris_scanner_thread_pool_thread_num = 48 | 32コアCPU用のコンピューティングスレッドとI/Oスレッドをコア数に比例して構成します。 |
| - | scan_thread_nice_value = 5 | 書き込みパフォーマンスと適時性を確保するために、クエリI/Oスレッドの優先度を下げます。 |
| その他 | string_type_length_soft_limit_bytes = 10485760 | 文字列型データの長さ制限を10 MBに増加させます。 |
| - | trash_file_expire_time_sec = 300 path_gc_check_interval_second = 900 path_scan_interval_second = 900 | ゴミファイルのリサイクルを加速します。 |
詳細については、BE Configurationを参照してください。
ステップ4: テーブルの作成
ログデータの書き込みとクエリの両方の特徴的な特性により、パフォーマンスを向上させるためにターゲットを絞った設定でテーブルを構成することを推奨します。
データパーティショニングとバケッティングの構成
-
データパーティショニングについて:
-
日次で自動管理される動的パーティション (
"dynamic_partition.enable" = "true")を伴うレンジパーティショニング (PARTITION BY RANGE(ts))を有効にします。 -
最新のNログエントリの高速取得のため、DATETIME型のフィールドをソートキー (
DUPLICATE KEY(ts))として使用します。
-
-
データバケッティングについて:
-
バケット数をクラスター内の総ディスク数の約3倍に構成し、各バケットが圧縮後約5GBのデータを含むようにします。
-
単一tabletインポートと組み合わせてバッチ書き込み効率を最適化するため、Random戦略 (
DISTRIBUTED BY RANDOM BUCKETS 60)を使用します。
-
詳細については、Data Partitioningを参照してください。
圧縮パラメータの構成
データ圧縮効率を向上させるため、zstd圧縮アルゴリズム ("compression" = "zstd")を使用します。
compactionパラメータの構成
compactionフィールドを以下のように構成します:
- 高スループットログ書き込みに重要な書き込み増幅を削減するため、time_series戦略 (
"compaction_policy" = "time_series")を使用します。
インデックスパラメータの構成
インデックスフィールドを以下のように構成します:
-
頻繁にクエリされるフィールドのインデックスを作成します (
USING INVERTED)。 -
全文検索が必要なフィールドについては、ほとんどの要件を満たすparserフィールドをunicodeとして指定します。フレーズクエリのサポートが必要な場合は、support_phraseフィールドをtrueに設定し、不要な場合はfalseに設定してストレージ容量を削減します。
ストレージパラメータの構成
ストレージポリシーを以下のように構成します:
-
ホットデータのストレージについて、クラウドストレージを使用する場合はデータコピー数を1に構成し、物理ディスクを使用する場合はデータコピー数を少なくとも2に構成します (
"replication_num" = "2")。 -
log_s3のストレージ場所を構成し (
CREATE RESOURCE "log_s3")、log_policy_3dayポリシーを設定します (CREATE STORAGE POLICY log_policy_3day)。データは3日後に冷却され、log_s3の指定されたストレージ場所に移動されます。以下のSQLを参照してください。
CREATE DATABASE log_db;
USE log_db;
-- unneccessary for the compute-storage-decoupled mode
CREATE RESOURCE "log_s3"
PROPERTIES
(
"type" = "s3",
"s3.endpoint" = "your_endpoint_url",
"s3.region" = "your_region",
"s3.bucket" = "your_bucket",
"s3.root.path" = "your_path",
"s3.access_key" = "your_ak",
"s3.secret_key" = "your_sk"
);
-- unneccessary for the compute-storage-decoupled mode
CREATE STORAGE POLICY log_policy_3day
PROPERTIES(
"storage_resource" = "log_s3",
"cooldown_ttl" = "259200"
);
CREATE TABLE log_table
(
`ts` DATETIME,
`host` TEXT,
`path` TEXT,
`message` TEXT,
INDEX idx_host (`host`) USING INVERTED,
INDEX idx_path (`path`) USING INVERTED,
INDEX idx_message (`message`) USING INVERTED PROPERTIES("parser" = "unicode", "support_phrase" = "true")
)
ENGINE = OLAP
DUPLICATE KEY(`ts`)
PARTITION BY RANGE(`ts`) ()
DISTRIBUTED BY RANDOM BUCKETS 60
PROPERTIES (
"compression" = "zstd",
"compaction_policy" = "time_series",
"dynamic_partition.enable" = "true",
"dynamic_partition.create_history_partition" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-30",
"dynamic_partition.end" = "1",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "60",
"dynamic_partition.replication_num" = "2", -- unneccessary for the compute-storage-decoupled mode
"replication_num" = "2", -- unneccessary for the compute-storage-decoupled mode
"storage_policy" = "log_policy_3day" -- unneccessary for the compute-storage-decoupled mode
);
ステップ 5: ログの収集
テーブル作成完了後、ログ収集を進めることができます。
Apache Doris は、オープンで多様な Stream HTTP API を提供しており、これを通じて Logstash、Filebeat、Kafka などの人気のあるログコレクターと接続して、ログ収集作業を実行できます。このセクションでは、Stream HTTP API を使用してこれらのログコレクターを統合する方法について説明します。
Logstash の統合
以下の手順に従ってください:
-
Logstash Doris Output plugin をダウンロードしてインストールします。以下の2つの方法のいずれかを選択できます:
-
ダウンロードはこちらからダウンロードしてインストールします。
-
ソースコードからコンパイルし、以下のコマンドを実行してインストールします:
-
./bin/logstash-plugin install logstash-output-doris-1.2.0.gem
- Logstashを設定します。以下のフィールドを指定してください:
logstash.yml: Logstashバッチ処理のログサイズとタイミングを設定し、データ書き込みパフォーマンスを向上させるために使用されます。
pipeline.batch.size: 1000000
pipeline.batch.delay: 10000
logstash_demo.conf: 収集するログの具体的な入力パスとApache Dorisへの出力設定を構成するために使用されます。
input {
file {
path => "/path/to/your/log"
}
}
output {
doris {
http_hosts => [ "<http://fehost1:http_port>", "<http://fehost2:http_port>", "<http://fehost3:http_port">]
user => "your_username"
password => "your_password"
db => "your_db"
table => "your_table"
# doris stream load http headers
headers => {
"format" => "json"
"read_json_by_line" => "true"
"load_to_single_tablet" => "true"
}
# field mapping: doris fileld name => logstash field name
# %{} to get a logstash field, [] for nested field such as [host][name] for host.name
mapping => {
"ts" => "%{@timestamp}"
"host" => "%{[host][name]}"
"path" => "%{[log][file][path]}"
"message" => "%{message}"
}
log_request => true
log_speed_interval => 10
}
}
```
3. 以下のコマンドに従ってLogstashを実行し、ログを収集してApache Dorisに出力します。
```shell
./bin/logstash -f logstash_demo.conf
Logstash Doris Output pluginの詳細については、Logstash Doris Output Pluginを参照してください。
Filebeatの統合
以下の手順に従ってください:
-
Apache Dorisへの出力をサポートするFilebeatバイナリファイルを取得します。クリックしてダウンロードするか、Apache Dorisソースコードからコンパイルできます。
-
Filebeatを設定します。収集するログの特定の入力パスとApache Dorisへの出力設定を構成するために使用されるfilebeat_demo.ymlフィールドを指定します。
# input
filebeat.inputs:
- type: log
enabled: true
paths:
- /path/to/your/log
multiline:
type: pattern
pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'
negate: true
match: after
skip_newline: true
processors:
- script:
lang: javascript
source: >
function process(event) {
var msg = event.Get("message");
msg = msg.replace(/\t/g, " ");
event.Put("message", msg);
}
- dissect:
# 2024-06-08 18:26:25,481 INFO (report-thread|199) [ReportHandler.cpuReport():617] begin to handle
tokenizer: "%{day} %{time} %{log_level} (%{thread}) [%{position}] %{content}"
target_prefix: ""
ignore_failure: true
overwrite_keys: true
# queue and batch
queue.mem:
events: 1000000
flush.min_events: 100000
flush.timeout: 10s
# output
output.doris:
fenodes: [ "http://fehost1:http_port", "http://fehost2:http_port", "http://fehost3:http_port" ]
user: "your_username"
password: "your_password"
database: "your_db"
table: "your_table"
# output string format
codec_format_string: '{"ts": "%{[day]} %{[time]}", "host": "%{[agent][hostname]}", "path": "%{[log][file][path]}", "message": "%{[message]}"}'
headers:
format: "json"
read_json_by_line: "true"
load_to_single_tablet: "true"
-
以下のコマンドに従ってFilebeatを実行し、ログを収集してApache Dorisに出力します。
chmod +x filebeat-doris-2.1.1
./filebeat-doris-2.1.1 -c filebeat_demo.yml
Filebeatに関する詳細情報については、Beats Doris Output Pluginを参照してください。
Kafkaの統合
JSON形式のログをKafkaのメッセージキューに書き込み、Kafka Routine Loadを作成し、Apache DorisがKafkaから能動的にデータを取得できるようにします。
以下の例を参照してください。property.*はLibrdkafkaクライアント関連の設定を表しており、実際のKafkaクラスタの状況に応じて調整する必要があります。
CREATE ROUTINE LOAD load_log_kafka ON log_db.log_table
COLUMNS(ts, clientip, request, status, size)
PROPERTIES (
"max_batch_interval" = "60",
"max_batch_rows" = "20000000",
"max_batch_size" = "1073741824",
"load_to_single_tablet" = "true",
"format" = "json"
)
FROM KAFKA (
"kafka_broker_list" = "host:port",
"kafka_topic" = "log__topic_",
"property.group.id" = "your_group_id",
"property.security.protocol"="SASL_PLAINTEXT",
"property.sasl.mechanism"="GSSAPI",
"property.sasl.kerberos.service.name"="kafka",
"property.sasl.kerberos.keytab"="/path/to/xxx.keytab",
"property.sasl.kerberos.principal"="<xxx@yyy.com>"
);
<br />SHOW ROUTINE LOAD;
Kafkaの詳細については、Routine Loadを参照してください。
カスタマイズされたプログラムを使用してログを収集する
一般的なログコレクターとの統合に加えて、Stream Load HTTP APIを使用してログデータをApache Dorisにインポートするカスタムプログラムを作成することもできます。以下のコードを参照してください:
curl
--location-trusted
-u username:password
-H "format:json"
-H "read_json_by_line:true"
-H "load_to_single_tablet:true"
-H "timeout:600"
-T logfile.json
http://fe_host:fe_http_port/api/log_db/log_table/_stream_load
カスタムプログラムを使用する際は、以下の重要なポイントに注意してください:
-
HTTP認証にはBasic Authを使用し、
echo -n 'username:password' | base64コマンドを使用して計算します。 -
HTTPヘッダー
format:jsonを設定して、データフォーマットをJSONとして指定します。 -
HTTPヘッダー
read_json_by_line:trueを設定して、1行に1つのJSONを指定します。 -
HTTPヘッダー
load_to_single_tablet:trueを設定して、小さなファイルのインポートを減らすために一度に1つのバケットにデータをインポートします。 -
クライアント側では100MBから1GBの間のサイズのバッチを書き込むことを推奨します。Apache Dorisバージョン2.1以降では、Group Commit機能を通じてクライアント側でバッチサイズを減らす必要があります。
ステップ6: ログのクエリと分析
ログのクエリ
Apache Dorisは標準SQLをサポートしているため、MySQLクライアントまたはJDBCを通じてクラスターに接続し、ログクエリのためのSQLを実行できます。
mysql -h fe_host -P fe_mysql_port -u your_username -Dyour_db_name
参考用の5つの一般的なSQLクエリコマンドは以下の通りです:
- 最新の10件のログエントリを表示
SELECT * FROM your_table_name ORDER BY ts DESC LIMIT 10;
- ホストが8.8.8.8の最新10件のログエントリを照会する
SELECT * FROM your_table_name WHERE host = '8.8.8.8' ORDER BY ts DESC LIMIT 10;
- リクエストフィールドにerrorまたは404が含まれる最新の10件のログエントリを取得します。以下のコマンドでは、MATCH_ANYはApache Dorisがフィールド内の任意のキーワードをマッチングするために使用する全文検索SQL構文です。
SELECT * FROM your_table_name WHERE message **MATCH_ANY** 'error 404'
ORDER BY ts DESC LIMIT 10;
- request フィールドに image と faq を含む最新の 10 件のログエントリを取得します。以下のコマンドでは、MATCH_ALL は Apache Doris でフィールド内のすべてのキーワードをマッチングするために使用される全文検索 SQL 構文です。
SELECT * FROM your_table_name WHERE message **MATCH_ALL** 'image faq'
ORDER BY ts DESC LIMIT 10;
- リクエストフィールドにimageとfaqを含む最新の10件のエントリを取得します。以下のコマンドでは、MATCH_PHRASEはApache Dorisで使用される全文検索SQL構文で、フィールド内のすべてのキーワードにマッチし、一貫した順序を要求します。以下の例では、a image faq bはマッチしますが、a faq image bはimageとfaqの順序が構文とマッチしないためマッチしません。
SELECT * FROM your_table_name WHERE message **MATCH_PHRASE** 'image faq'
ORDER BY ts DESC LIMIT 10;
ログの視覚的分析
一部のサードパーティベンダーは、Apache Dorisをベースとした視覚的ログ分析開発プラットフォームを提供しており、Kibana Discoverに類似したログ検索・分析インターフェースが含まれています。これらのプラットフォームは、直感的でユーザーフレンドリーな探索的ログ分析インタラクションを提供します。

-
全文検索とSQLモードのサポート
-
タイムボックスとヒストグラムによるクエリログ時間枠の選択サポート
-
詳細なログ情報の表示、JSONまたはテーブルに展開可能
-
ログデータコンテキストでのフィルター条件の追加・削除のインタラクティブクリック
-
異常の発見とさらなる分析のためのドリルダウンのための検索結果における上位フィールド値の表示
詳細については、dev@doris.apache.orgまでお問い合わせください。