Tablestore 用 LogHub Shipper (LogHub Shipper) は、ログサービスのデータをスクラブおよび変換し、Tablestore のデータテーブルに書き込みます。LogHub Shipper は、Docker イメージ方式を使用して Tablestore によって Alibaba Cloud Container Hub に公開され、Alibaba Cloud Container Service for Kubernetes (ACK) に基づく Elastic Compute Service (ECS) インスタンス上で実行されます。
はじめに
ログサービスはデータを JSON 形式で保存し、データの読み取りおよび書き込み操作の基本単位としてロググループを使用します。ロググループの詳細については、「用語」を参照してください。そのため、ログサービスでは、特定の条件に基づいてログをクエリおよび分析することはできません。たとえば、過去 12 時間のアプリのログデータをクエリおよび分析することはできません。
LogHub Shipper は、ログサービスのログデータを構造化データに変換し、リアルタイムで Tablestore のデータテーブルに書き込みます。これにより、リアルタイムで正確かつ高性能なオンラインサービスが提供されます。
データ例
たとえば、ログサービスには、次の形式のログデータが含まれています。
{"__time__":1453809242,"__topic__":"","__source__":"47.100.XX.XX","ip":"47.100.XX.XX","time":"26/Jan/2016:19:54:02 +0800","url":"POST /PutData?Category=YunOsAccountOpLog&AccessKeyId=U0U***45A&Date=Fri%2C%2028%20Jun%202013%2006%3A53%3A30%20GMT&Topic=raw&Signature=pD12XYLmGxKQ%2Bmkd6x7hAgQ7b1c%3D HTTP/1.1","status":"200","user-agent":"aliyun-sdk-java"}LogHub Shipper は、プライマリキー列が ip と time である Tablestore データテーブルに、次の形式でデータを書き込みます。
| ip | time | source | status | user-agent | url |
| 47.100.XX.XX | 26/Jan/2016:19:54:02 +0800 | 47.100.XX.XX | 200 | aliyun-sdk-java | POST /PutData… |
このようにして、Tablestore データテーブル内の特定の時点に基づいて、特定の IP アドレスの履歴データを効率的かつ正確に取得できます。
LogHub Shipper は、柔軟なデータマッピングルールを提供します。ログデータのフィールドとデータテーブルの属性列間のマッピングを設定し、データを効率的に変換できます。
用語
関連サービスの用語
LogHub Shipper を使用する前に、関連サービスの用語を理解する必要があります。次の表に、用語を示します。
| サービス | 用語 |
| ログサービス |
|
| Tablestore | |
| ECS | 従量課金制およびサブスクリプション |
| ACK | ノード、アプリケーション、サービス、およびコンテナ 単一の LogHub Shipper のコンテナ数を指定する場合、対応するログストアのシャード数以下の数を指定することをお勧めします。 |
| Resource Access Management (RAM) | RAM ユーザー LogHub Shipper の RAM ユーザーに、ログストアからのデータの読み取りと Tablestore へのデータの書き込みのみを許可することをお勧めします。 |
データテーブル
データテーブルには、スクラブおよび変換されたログデータが保存されます。
データテーブルを使用する場合は、次の点に注意してください。
- スクラブおよび変換されたログデータを保存するには、データテーブルを手動で作成する必要があります。LogHub Shipper はデータテーブルを自動的に作成しません。
- ログサービスと Tablestore が使用可能な場合、ログがログサービスに入る時刻とログが Tablestore に書き込まれる時刻の間のレイテンシは数百ミリ秒です。
- Tablestore が使用できない場合、LogHub Shipper は最大 500 ミリ秒待機してから再試行します。
- LogHub Shipper は、永続チェックポイントを定期的に記録します。
- アップグレードなどの問題により LogHub Shipper が使用できない場合、LogHub Shipper は復旧時に最後のチェックポイントからログの消費を続行します。
- 同じログストア内の異なるログがデータテーブルの異なる行に書き込まれるようにすることをお勧めします。これにより、LogHub Shipper がデータ消費を再試行した場合でも、データテーブルとログストア間で最終的な整合性が確保されます。
- LogHub Shipper は、Tablestore の UpdateRow 操作を使用してデータテーブルにデータを書き込みます。そのため、複数の LogHub Shipper が同じデータテーブルにデータを書き込むことができます。この場合、LogHub Shipper が異なる属性列にデータを書き込むようにすることをお勧めします。
ステータステーブル
LogHub Shipper は、Tablestore に作成したステータステーブルを使用して、関連情報を提供します。
ステータステーブルを使用する場合は、次の点に注意してください。
- 複数の LogHub Shipper が同じステータステーブルを共有できます。
- エラーが発生しない場合、各 LogHub Shipper コンテナは 5 分ごとにステータステーブルにレコードを追加します。
- エラーが発生したが Tablestore がまだ使用可能な場合、LogHub Shipper コンテナはすぐにステータステーブルにレコードを追加します。
- ステータステーブルには日レベルの有効期限 (TTL) を指定することをお勧めします。このようにして、ステータステーブルには最近のデータのみが保持されます。
ステータステーブルには、次の 4 つのプライマリキー列が含まれています。
- project_logstore: 文字列型。縦棒 (|) で区切られたログサービスのプロジェクトとログストア。
- shard: 整数型。ログサービスのシャード番号。
- target_table: 文字列型。スクラブおよび変換されたログデータを保存するデータテーブルの名前。
- timestamp: 整数型。LogHub Shipper コンテナがステータステーブルにレコードを追加する時刻。値は UNIX タイムスタンプです。単位: ミリ秒。
次の属性列には、データインポートのステータスが記録されます。ステータステーブルの行のすべての属性列はオプションであり、存在しない場合があります。
- shipper_id: 文字列型。LogHub Shipper コンテナの ID。これはコンテナホストの名前です。
- error_code: 文字列型。Tablestore で定義されているエラーコード。エラーが発生しない場合、この属性列は存在しません。詳細については、「エラーコード」を参照してください。
- error_message: 文字列型。Tablestore で返される具体的なエラーメッセージ。エラーが発生しない場合、この属性列は存在しません。
- failed_sample: 文字列型。エラーが報告されたログ。値は JSON 文字列です。
- __time__: 整数型。コンテナによるステータステーブルの最新の更新後、LogHub Shipper コンテナが Tablestore に書き込むログデータの __time__ フィールドの最大値。詳細については、「用語」を参照してください。
- row_count: 整数型。コンテナによるステータステーブルの最新の更新後、LogHub Shipper コンテナが Tablestore に書き込むログの数。
- cu_count: 整数型。コンテナによるステータステーブルの最新の更新後、LogHub Shipper コンテナが消費するキャパシティユニット (CU) の数。詳細については、「読み取り/書き込みスループット」を参照してください。
- skip_count: 整数型。コンテナによるステータステーブルの最新の更新後、LogHub Shipper コンテナがスクラブするログの数。
- skip_sample: 文字列型。コンテナによるステータステーブルの最新の更新後、LogHub Shipper コンテナが破棄するログの 1 つ。値は JSON 文字列です。コンテナのログには、破棄された各ログと、ログが破棄された理由が記録されます。
構成
LogHub Shipper を作成する場合は、コンテナに対して次の環境変数を指定する必要があります。
- access_key_id および access_key_secret: LogHub Shipper が使用する Alibaba Cloud アカウントの AccessKey ID および AccessKey シークレット。
- loghub: LogHub Shipper に必要なログサービスの構成。値は、次のパラメータで構成される JSON オブジェクトです。
- endpoint
- logstore
- consumer_group
- tablestore: LogHub Shipper に必要な Tablestore の構成。値は、次のパラメータで構成される JSON オブジェクトです。
- endpoint: Tablestore インスタンスが配置されているリージョンのエンドポイント。
- instance: Tablestore インスタンスの名前。
- target_table: データテーブルの名前。データテーブルは、指定されたインスタンス内にある必要があります。
- status_table: ステータステーブルの名前。ステータステーブルは、指定されたインスタンス内にある必要があります。
- exclusive_columns: 属性列のブラックリスト。値は、JSON 文字列で構成される JSON 配列です。
環境変数を指定した場合、LogHub Shipper は指定されたフィールドを属性列としてデータテーブルに書き込みません。たとえば、データテーブルにプライマリキー A が含まれ、exclusive_columns 環境変数が ["B", "C"] に設定されており、ログに A、B、および D の 3 つのフィールドが含まれているとします。その後、1 つの行がデータテーブルに書き込まれます。行には、プライマリキー A と属性列 D が含まれます。フィールド C はログに存在しません。そのため、LogHub Shipper は列 C をデータテーブルに書き込みません。フィールド B はログに存在しますが、列 B は除外列として指定されています。そのため、LogHub Shipper は列 B をデータテーブルに書き込みません。
- transform: 簡単な変換。値は JSON オブジェクトです。変数のキーは、データテーブルの列の名前です。列はプライマリキー列にすることができます。値は、LogHub Shipper が次のルールに基づいて定義する簡単な変換式です。
- ログフィールドは式です。
- 符号なし整数は式です。
- 二重引用符で囲まれた文字列は式です。文字列には、エスケープ文字
\"および\\\\を含めることができます。 ( func arg... )も式です。かっこ前後に 0 個以上のスペースまたはタブを挿入できます。func と func に続くパラメータの間、および異なるパラメータの間に、少なくとも 1 つのスペースが存在します。各パラメータは式である必要があります。システムは次の関数をサポートしています。->int: 文字列を整数に変換します。この関数には 2 つのパラメータが必要です。最初のパラメータは基数で、2 から 36 までの値を指定できます。2 番目のパラメータは、LogHub Shipper で変換する文字列です。2 番目のパラメータの文字は大文字と小文字が区別されず、10 から 35 までの 10 進数より大きい数を示します。->bool: 文字列をブール値に変換します。この関数には、LogHub Shipper で変換する文字列である 1 つのパラメータが必要です。"true"は true の値に対応し、"false"は false の値に対応します。他の文字列は無効とみなされます。crc32: 文字列の CRC32 を計算し、結果を整数値として返します。この関数には、計算する文字列である 1 つのパラメータが必要です。
ログがない場合、または変換中にエラーが発生した場合、キーに対応する列は欠落列とみなされます。エラーが発生した場合、コンテナのログにエラーの詳細が記録されます。
データスクラブは、プライマリキー列がない場合に LogHub Shipper が対応するログをスクラブするというルールのみを 따릅니다。