Este tópico descreve como criar um external store para associar o Simple Log Service (SLS) a um banco de dados MySQL.
Pré-requisitos
Dados coletados no Simple Log Service. Para mais informações, consulte Coleta de dados.
CLI do Log Service instalada e endpoint e par de AccessKey configurados.
Dados armazenados em um banco de dados ApsaraDB RDS for MySQL, AnalyticDB for MySQL ou MySQL autogerenciado em uma instância Elastic Compute Service (ECS) da Alibaba Cloud.
-
Banco de dados MySQL em uma Virtual Private Cloud (VPC) da Alibaba Cloud. A instância ApsaraDB RDS for MySQL, AnalyticDB for MySQL ou ECS deve estar na mesma região do projeto SLS.
ImportanteNão é possível conectar-se diretamente a um banco de dados MySQL por endereço IP público.
Informações básicas
O recurso de external store do Simple Log Service (SLS) permite associar o SLS a um banco de dados ApsaraDB RDS for MySQL, AnalyticDB for MySQL ou MySQL autogerenciado em uma instância ECS. Também é possível gravar resultados de consultas e análises no banco de dados MySQL para processamento posterior.
Procedimento
1. Configure uma lista de permissões
ApsaraDB RDS for MySQL
Adicione os blocos CIDR 100.104.0.0/16, 11.194.0.0/16 e 11.201.0.0/16 à lista de permissões. Para mais informações, consulte Configure uma lista de permissões de endereços IP.
MySQL autogerenciado no ECS
Adicione regras de grupo de segurança para permitir acesso dos blocos CIDR 100.104.0.0/16, 11.194.0.0/16 e 11.201.0.0/16. Para mais informações, consulte Adicionar uma regra de grupo de segurança.
AnalyticDB for MySQL
Adicione os blocos CIDR 100.104.0.0/16, 11.194.0.0/16 e 11.201.0.0/16 à lista de permissões. Para mais informações, consulte Configure uma lista de permissões.
2. Crie um external store
-
Faça login no servidor onde a CLI está instalada. Na linha de comando, execute o comando
touchpara criar o arquivo de configuração /home/shell/config.json. Adicione o script abaixo ao arquivo config.json. Substitua os valores deregion,vpc-id,host,port,username,password,dbetablepelos valores reais.-
Parâmetros
Exemplo
{ "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" } }externalStoreNameNome do external store. Use apenas letras minúsculas.
storeTypeTipo da fonte de dados. Defina este parâmetro como
rds-vpc.regionRegião do banco de dados.
-
Para ApsaraDB RDS for MySQL, defina region como a região da instância RDS.
-
Para AnalyticDB for MySQL, defina region como a região da instância AnalyticDB for MySQL.
-
Para MySQL autogerenciado em instância ECS dentro de uma VPC, defina region como a região da instância ECS.
ImportanteA instância ApsaraDB RDS for MySQL, AnalyticDB for MySQL ou ECS deve estar na mesma região do projeto SLS.
vpc-idID da VPC.
-
Para instância ApsaraDB RDS for MySQL em VPC, defina vpc-id como o ID da VPC da instância.
-
Para instância AnalyticDB for MySQL em VPC, defina vpc-id como o ID da VPC da instância.
-
Para MySQL autogerenciado em instância ECS dentro de uma VPC, defina vpc-id como o ID da VPC da instância.
hostAo usar um endpoint interno para banco de dados em VPC, o SLS resolve o nome para um endereço IP privado e o armazena em cache durante a criação do external store. Se esse IP mudar posteriormente (por exemplo, devido à migração da instância), o acesso ao external store será interrompido porque o IP em cache não é atualizado automaticamente. Para resolver, atualize ou recrie o external store.
-
Para ApsaraDB RDS for MySQL em VPC, defina host como o endereço interno da instância RDS. Pode ser um endpoint interno ou um IP privado.
-
Para AnalyticDB for MySQL em VPC, defina host como o endereço interno da instância AnalyticDB for MySQL. Pode ser um endpoint interno ou um IP privado.
-
Para MySQL autogerenciado em instância ECS dentro de uma VPC, defina host como o endereço IP privado da instância ECS.
portNúmero da porta.
-
Para ApsaraDB RDS for MySQL, defina port como o número da porta da instância RDS.
-
Para AnalyticDB for MySQL, defina port como o número da porta da instância AnalyticDB for MySQL.
-
Para MySQL autogerenciado em instância ECS, defina port como a porta de serviço do MySQL na instância ECS.
usernameNome de usuário da conta do banco de dados.
passwordSenha da conta do banco de dados.
dbNome do banco de dados.
tableNome da tabela do banco de dados. Formatos suportados:
-
table_name, como test.
-
schema_name.table_name, como public.test.
-
-
-
Execute o comando a seguir para criar o external store. Substitua project_name pelo nome do seu projeto. Este exemplo usa
log-rds-demo.aliyunlog log create_external_store --project_name="log-rds-demo" --config="file:///home/shell/config.json" -
O comando create_external_store não retorna saída em caso de sucesso. Para verificar a criação, execute o comando
aliyunlog log get_external_store --project_name="log-rds-demo" --store_name="sls_join_meta_store" --format-output=jsone visualize os detalhes do external store. Exemplo de resposta:{ "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. Usar o external store
Execute consulta e análise
-
Uso do external store
Após associar a fonte de dados externa, acesse o console SLS. No projeto
log-rds-demo, clique em qualquer logstore. Em seguida, execute a instrução de consulta e análise* | select * from sls_join_meta_storepara consultar dados da tabela MySQL associada.Na aba Charts, o resultado da consulta é uma tabela com colunas
idename. Dois registros de exemplo são (123, 'Bob') e (124, 'Lucy'). -
Uso de JOIN para associar um logstore a uma tabela MySQL
-
A tabela MySQL em uma operação JOIN deve ter tamanho inferior a 20 MB.
-
Na instrução de consulta e análise, especifique o LogStore antes da palavra-chave join e o ExternalStore após a palavra-chave join .
-
Use o nome do external store na consulta. O SLS mapeia automaticamente esse nome para o banco de dados e a tabela configurados. Não use o nome da tabela MySQL diretamente.
Cláusulas JOIN suportadas: INNER JOIN, LEFT JOIN, RIGHT JOIN e 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) -
Salve resultados de consulta no MySQL
Se um campo na tabela MySQL de destino for do tipovarchar, converta o campo correspondente do logstore para um tipo varchar compatível. Por exemplo, se o campodetailna tabela MySQL forvarchar(60), use a funçãocastno campocontentdo logstore:cast(content as varchar(60)). Para mais informações sobre a função cast, consulte função de conversão de tipos .
Use a sintaxe INSERT para salvar resultados de consulta em um banco de dados MySQL:
* | insert into sls_join_meta_store select cast(method as varchar(65535)),count(1) from log group by method
Operações via SDK
Código de exemplo em 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, '')
# Create an external store.
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()
# Get the details of the external store.
res = client.get_external_store(project,"rds_store")
res.log_print()
res = client.list_external_store(project,"")
res.log_print()
# Run a JOIN query.
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()
# Write the query and analysis results to the MySQL database.
req = GetLogsRequest(project,logstore,From,To,"","* | insert into rds_store select count(1) from "+ logstore )
res = client.get_logs(req)
res.log_print()
Operações relacionadas
-
Atualize um external store MySQL.
aliyunlog log update_external_store --project_name="log-rds-demo" --config="file:///home/shell/config.json" -
Exclua um external store MySQL.
aliyunlog log delete_external_store --project_name="log-rds-demo" --store_name=sls_join_meta_store
Referências
Para melhores práticas de criação de um external store MySQL, consulte Associar um logstore a um banco de dados MySQL para consulta e análise.
Para criar um banco de dados MySQL autogerenciado em uma instância ECS da Alibaba Cloud, consulte Implantar manualmente um banco de dados MySQL (Linux).
Para criar rapidamente um banco de dados AnalyticDB for MySQL, consulte Início rápido para clusters no modo elástico.
Para criar rapidamente um banco de dados ApsaraDB RDS for MySQL, consulte Criar rapidamente uma instância ApsaraDB RDS for MySQL.