このトピックでは、外部ストアを作成して Simple Log Service (SLS) と MySQL データベースを関連付ける方法について説明します。
前提条件
-
Simple Log Service でデータを収集済みであること。詳細については、「データ収集」をご参照ください。
-
Log Service CLI をインストールし、エンドポイントと AccessKey ペアを設定済みであること。
-
ApsaraDB RDS for MySQL データベース、AnalyticDB for MySQL データベース、または Alibaba Cloud Elastic Compute Service (ECS) インスタンス上の自己管理型 MySQL データベースにデータを保存済みであること。
-
MySQL データベースが Alibaba Cloud Virtual Private Cloud (VPC) 内にあること。ApsaraDB RDS for MySQL インスタンス、AnalyticDB for MySQL インスタンス、または ECS インスタンスは、SLS プロジェクトと同じリージョンにある必要があります。
重要パブリック IP アドレスを使用して MySQL データベースに直接接続することはできません。
背景情報
SLS の外部ストア機能を使用すると、SLS を ApsaraDB RDS for MySQL データベース、AnalyticDB for MySQL データベース、または ECS インスタンス上の自己管理型 MySQL データベースに関連付けることができます。また、クエリと分析の結果を MySQL データベースに書き込んで、さらに処理することもできます。
操作手順
1. ホワイトリストの設定
ApsaraDB RDS for MySQL
CIDR ブロック 100.104.0.0/16、11.194.0.0/16、および 11.201.0.0/16 をホワイトリストに追加します。詳細については、「IP アドレスホワイトリストの設定」をご参照ください。
ECS 上の自己管理型 MySQL
セキュリティグループルールを追加して、CIDR ブロック 100.104.0.0/16、11.194.0.0/16、および 11.201.0.0/16 からのアクセスを許可します。詳細については、「セキュリティグループルールの追加」をご参照ください。
AnalyticDB for MySQL
CIDR ブロック 100.104.0.0/16、11.194.0.0/16、および 11.201.0.0/16 をホワイトリストに追加します。詳細については、「ホワイトリストの設定」をご参照ください。
2. 外部ストアの作成
-
CLI がインストールされているサーバーにログインします。コマンドラインで
touchコマンドを実行して、設定ファイル /home/shell/config.json を作成します。次のスクリプトを config.json ファイルに追加します。region、vpc-id、host、port、username、password、db、およびtableの値は、実際の値に置き換える必要があります。-
パラメーター
例
{ "externalStoreName":"sls_join_meta_store", "storeType":"rds-vpc", "parameter":{ "region":"cn-qingdao", "vpc-id":"vpc-m5eq4irc1pucp*******", "host":"rm-bp1******rm76.mysql.rds.aliyuncs.com", "port":"3306", "username":"user", "password":"****", "db":"scmc", "table":"join_meta" } }externalStoreName外部ストアの名前。名前は小文字にする必要があります。
storeTypeデータソースのタイプ。このパラメーターを
rds-vpcに設定します。regionデータベースが配置されているリージョン。
-
ApsaraDB RDS for MySQL データベースを使用する場合は、region を RDS インスタンスのリージョンに設定します。
-
AnalyticDB for MySQL データベースを使用する場合は、region を AnalyticDB for MySQL インスタンスのリージョンに設定します。
-
VPC 内の ECS インスタンスで自己管理型 MySQL データベースを使用する場合は、region を ECS インスタンスのリージョンに設定します。
重要ApsaraDB RDS for MySQL インスタンス、AnalyticDB for MySQL インスタンス、または ECS インスタンスは、SLS プロジェクトと同じリージョンにある必要があります。
vpc-idVPC ID。
-
VPC 内の ApsaraDB RDS for MySQL インスタンスを使用する場合は、vpc-id をインスタンスが配置されている VPC の ID に設定します。
-
VPC 内の AnalyticDB for MySQL インスタンスを使用する場合は、vpc-id をインスタンスが配置されている VPC の ID に設定します。
-
VPC 内の ECS インスタンスで自己管理型 MySQL データベースを使用する場合は、vpc-id をインスタンスが配置されている VPC の ID に設定します。
hostVPC 内のデータベースに内部エンドポイントを使用する場合、SLS は外部ストアの作成時にそれをプライベート IP アドレスに解決してキャッシュします。この IP アドレスが後で変更された場合 (インスタンスの移行など)、キャッシュされた IP は自動的に更新されないため、外部ストアへのアクセスが中断されます。これを解決するには、外部ストアを更新または再作成する必要があります。
-
VPC 内の ApsaraDB RDS for MySQL データベースを使用する場合は、host を RDS インスタンスの内部アドレスに設定します。アドレスは、内部エンドポイントまたはプライベート IP アドレスにすることができます。
-
VPC 内の AnalyticDB for MySQL データベースを使用する場合は、host を AnalyticDB for MySQL インスタンスの内部アドレスに設定します。アドレスは、内部エンドポイントまたはプライベート IP アドレスにすることができます。
-
VPC 内の ECS インスタンスで自己管理型 MySQL データベースを使用する場合は、host を ECS インスタンスのプライベート IP アドレスに設定します。
portポート番号。
-
ApsaraDB RDS for MySQL データベースを使用する場合は、port を RDS インスタンスのポート番号に設定します。
-
AnalyticDB for MySQL データベースを使用する場合は、port を AnalyticDB for MySQL インスタンスのポート番号に設定します。
-
ECS インスタンスで自己管理型 MySQL データベースを使用する場合は、port を ECS インスタンス上の MySQL のサービスポートに設定します。
usernameデータベースアカウントのユーザー名。
passwordデータベースアカウントのパスワード。
dbデータベースの名前。
tableデータベーステーブルの名前。次のフォーマットがサポートされています:
-
table_name (例:test)
-
schema_name.table_name (例:public.test)
-
-
-
次のコマンドを実行して、外部ストアを作成します。project_name をご利用のプロジェクト名に置き換えます。この例では
log-rds-demoを使用します。aliyunlog log create_external_store --project_name="log-rds-demo" --config="file:///home/shell/config.json" -
create_external_store コマンドは、成功した場合、出力を返しません。作成を検証するには、
aliyunlog log get_external_store --project_name="log-rds-demo" --store_name="sls_join_meta_store" --format-output=jsonコマンドを実行して、外部ストアの詳細を表示します。次の応答は一例です:{ "externalStoreName":"sls_join_meta_store", "storeType":"rds-vpc", "parameter":{ "db": "scmc", "host": "rm-bp1******rm76.mysql.rds.aliyuncs.com", "port": "3306", "region": "cn-qingdao", "table": "join_meta", "username": "user", "vpc-id": "vpc-m5eq4irc1pucp*******" } }
3. 外部ストアの使用
クエリと分析の実行
-
外部ストアの使用
外部データソースを関連付けた後、SLS コンソールに移動します。
log-rds-demoという名前のプロジェクトで、任意の Logstore をクリックします。次に、クエリと分析のステートメント* | select * from sls_join_meta_storeを実行して、関連付けられた MySQL テーブルからデータをクエリします。[グラフ] タブでは、クエリ結果は
idとnameの列を持つテーブルになります。2 つのレコード例は (123, '田中') と (124, '鈴木') です。 -
JOIN を使用した Logstore と MySQL テーブルの関連付け
-
JOIN 操作の MySQL テーブルは 20 MB 未満である必要があります。
-
クエリと分析のステートメントでは、Logstore は join キーワードの前に指定し、ExternalStore は join キーワードの後に指定する必要があります。
-
クエリでは外部ストア名を使用してください。SLS はこの名前を設定済みのデータベースとテーブルに自動的にマッピングします。MySQL テーブル名を直接使用しないでください。
サポートされている JOIN 句には、INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN があります。
[ INNER ] JOIN LEFT [ OUTER ] JOIN RIGHT [ OUTER ] JOIN FULL [ OUTER ] JOIN* | select count(1) from log l join sls_join_meta_store m on l.projectid = cast( m.ikey as varchar) -
クエリ結果の MySQL への保存
ターゲットの MySQL テーブルのフィールドがvarchar型の場合、Logstore の対応するフィールドを互換性のある varchar 型にキャストする必要があります。たとえば、MySQL テーブルのdetailフィールドがvarchar(60)の場合、Logstore のcontentフィールドにcast関数を使用します:cast(content as varchar(60))。cast 関数の詳細については、「型変換関数」をご参照ください。
INSERT 構文を使用して、クエリ結果を MySQL データベースに保存できます:
* | insert into sls_join_meta_store select cast(method as varchar(65535)),count(1) from log group by method
SDK 操作
Python サンプルコード
# encoding: utf-8
from __future__ import print_function
from aliyun.log import *
from aliyun.log.util import base64_encodestring
from random import randint
import time
import os
from datetime import datetime
endpoint = os.environ.get('ALIYUN_LOG_SAMPLE_ENDPOINT', 'cn-chengdu.log.aliyuncs.com')
accessKeyId = os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSID', '')
accessKey = os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSKEY', '')
logstore = os.environ.get('ALIYUN_LOG_SAMPLE_LOGSTORE', '')
project = "ali-yunlei-chengdu"
client = LogClient(endpoint, accessKeyId, accessKey, '')
# 外部ストアを作成します。
res = client.create_external_store(project,
ExternalStoreConfig(externalStoreName="rds_store", region="cn-chengdu",
storeType="rds-vpc",
vpcId="vpc-2vctx8reuqswmk********",
host='rm-2vc6x67972iv********.mysql.cn-chengdu.rds.aliyuncs.com',
port="3306", username="root", password="123456",
database="test_database", table="test"))
res.log_print()
# 外部ストアの詳細を取得します。
res = client.get_external_store(project,"rds_store")
res.log_print()
res = client.list_external_store(project,"")
res.log_print()
# JOIN クエリを実行します。
req = GetLogsRequest(project,logstore,From,To,"","* | select count(1) from "+ logstore +" s join meta m on s.projectid = cast(m.ikey as varchar)")
res = client.get_logs(req)
res.log_print()
# クエリと分析の結果を MySQL データベースに書き込みます。
req = GetLogsRequest(project,logstore,From,To,"","* | insert into rds_store select count(1) from "+ logstore )
res = client.get_logs(req)
res.log_print()
関連操作
-
MySQL 外部ストアの更新
aliyunlog log update_external_store --project_name="log-rds-demo" --config="file:///home/shell/config.json" -
MySQL 外部ストアの削除
aliyunlog log delete_external_store --project_name="log-rds-demo" --store_name=sls_join_meta_store
参考
-
MySQL 外部ストアを作成する際のベストプラクティスについては、「クエリ分析のための Logstore と MySQL データベースの関連付け」をご参照ください。
-
Alibaba Cloud ECS インスタンス上に自己管理 MySQL データベースを作成する方法については、「MySQL データベースの手動デプロイ (Linux)」をご参照ください。
-
AnalyticDB for MySQL データベースを迅速に作成する方法については、「Elastic モードクラスターのクイックスタート」をご参照ください。
-
ApsaraDB RDS for MySQL インスタンスを迅速に作成する方法については、「ApsaraDB RDS for MySQL インスタンスの迅速な作成」をご参照ください。