Aurora 관리형 MySQL용 Database Monitoring 설정하기
이 페이지에서는 Amazon Aurora에서 호스팅하는 MySQL 데이터베이스에 Database Monitoring을 설정하는 방법을 설명드릴게요. Database Monitoring은 쿼리 메트릭, 쿼리 샘플, explain plan, 연결 데이터, 시스템 메트릭, InnoDB 스토리지 엔진 원격 측정 등을 노출해 MySQL 데이터베이스에 대한 깊은 가시성을 제공합니다.
에이전트는 읽기 전용 사용자로 로그인해 데이터베이스에서 직접 원격 측정을 수집해요. MySQL 데이터베이스에 Database Monitoring을 활성화하려면 다음 단계를 따르세요.
- 데이터베이스 파라미터 구성하기
- 에이전트에 데이터베이스 액세스 권한 부여하기
- 에이전트 설치 및 구성하기
- RDS 통합 설치하기
출처: 문서
본문
시작하기 전에 (Before you begin)
- 지원되는 MySQL 버전: 5.6, 5.7, 8.0 이상
- 지원되는 Agent 버전: 7.36.1 이상
- 성능 영향: Database Monitoring의 기본 Agent 구성은 보수적이지만, 수집 간격이나 쿼리 샘플링 비율 같은 설정을 필요에 맞게 조정할 수 있어요. 대부분의 워크로드에서 에이전트는 데이터베이스 쿼리 실행 시간의 1% 미만, CPU의 1% 미만을 차지합니다. Database Monitoring은 기본 Agent 위에서 통합으로 실행돼요 (벤치마크 참고).
- 프록시, 로드 밸런서, 커넥션 풀러: Datadog Agent는 모니터링 대상 호스트에 직접 연결해야 하며, 가능하면 인스턴스 엔드포인트를 통해 연결하는 것이 좋아요. 에이전트는 프록시, 로드 밸런서, 커넥션 풀러나 Aurora 클러스터 엔드포인트를 통해 데이터베이스에 연결하면 안 됩니다. 클러스터 엔드포인트에 연결하면 에이전트는 임의의 복제본 하나에서만 데이터를 수집하고, 그 복제본에 대해서만 가시성을 제공해요. 에이전트가 실행 중에 다른 호스트에 연결하면(장애 조치, 로드 밸런싱 등의 경우) 에이전트는 두 호스트 사이의 통계 차이를 계산해 부정확한 메트릭을 만들어내요.
- 데이터 보안 고려 사항: 에이전트가 데이터베이스에서 수집하는 데이터와 이를 안전하게 유지하는 방법은 민감 정보 (Sensitive information) 문서를 참고하세요.
MySQL 설정 구성하기
DB 클러스터 파라미터 그룹 (DB cluster parameter group)에서 다음을 구성한 뒤 서버를 재시작해야 설정이 적용돼요.
{% tab title="MySQL ≥ 5.7" %}
| 파라미터 | 값 | 설명 |
|---|---|---|
performance_schema |
1 |
필수. Performance Schema를 활성화합니다. |
| performance_schema_consumer_events_statements_current | 1 |
필수. 현재 실행 중인 쿼리 모니터링을 활성화합니다. |
| performance-schema-consumer-events-waits-current | ON |
필수. 대기 이벤트 수집을 활성화합니다. |
| performance_schema_consumer_events_statements_history | 1 |
선택. 스레드별 최근 쿼리 기록 추적을 활성화합니다. 활성화하면 빈도가 낮은 쿼리의 실행 세부 정보를 캡처할 가능성이 높아져요. |
| performance_schema_consumer_events_statements_history_long | 1 |
선택. 모든 스레드에서 더 많은 최근 쿼리 추적을 활성화합니다. 활성화하면 빈도가 낮은 쿼리의 실행 세부 정보를 캡처할 가능성이 높아져요. |
| performance_schema_max_digest_length | 4096 |
events_statements_* 테이블의 SQL digest 텍스트 크기를 늘립니다. 기본값으로 두면 1024자보다 긴 쿼리는 수집되지 않아요. |
| performance_schema_max_sql_text_length | 4096 |
performance_schema_max_digest_length와 일치해야 해요. |
{% /tab %}
{% tab title="MySQL 5.6" %}
| 파라미터 | 값 | 설명 |
|---|---|---|
performance_schema |
1 |
필수. Performance Schema를 활성화합니다. |
| performance_schema_consumer_events_statements_current | 1 |
필수. 현재 실행 중인 쿼리 모니터링을 활성화합니다. |
| performance-schema-consumer-events-waits-current | ON |
필수. 대기 이벤트 수집을 활성화합니다. |
| performance_schema_consumer_events_statements_history | 1 |
선택. 스레드별 최근 쿼리 기록 추적을 활성화합니다. 활성화하면 빈도가 낮은 쿼리의 실행 세부 정보를 캡처할 가능성이 높아져요. |
| performance_schema_consumer_events_statements_history_long | 1 |
선택. 모든 스레드에서 더 많은 최근 쿼리 추적을 활성화합니다. 활성화하면 빈도가 낮은 쿼리의 실행 세부 정보를 캡처할 가능성이 높아져요. |
{% /tab %}
참고: 권장되는 방법은 에이전트 액세스 권한을 부여하는 과정의 일부로 performance-schema-consumer-* 설정을 런타임에 동적으로 활성화하도록 하는 것입니다. 런타임 설정 컨슈머(Runtime setup consumers)를 참고하세요.
에이전트에 액세스 권한 부여하기
Datadog Agent는 통계와 쿼리를 수집하기 위해 데이터베이스에 대한 읽기 전용 액세스가 필요해요.
다음 지침은 datadog@'%'를 사용해 어떤 호스트에서든 로그인할 수 있는 권한을 에이전트에 부여합니다. datadog@'localhost'를 사용하면 datadog 사용자가 localhost에서만 로그인하도록 제한할 수 있어요. 자세한 내용은 MySQL 문서를 참고하세요.
{% tab title="MySQL ≥ 5.7" %}
datadog 사용자를 만들고 기본 권한을 부여하세요.
CREATE USER datadog@'%' IDENTIFIED by '<UNIQUEPASSWORD>';
ALTER USER datadog@'%' WITH MAX_USER_CONNECTIONS 5;
GRANT REPLICATION CLIENT ON *.* TO datadog@'%';
GRANT PROCESS ON *.* TO datadog@'%';
GRANT SELECT ON performance_schema.* TO datadog@'%';
{% /tab %}
{% tab title="MySQL 5.6" %}
datadog 사용자를 만들고 기본 권한을 부여하세요.
CREATE USER datadog@'%' IDENTIFIED BY '<UNIQUEPASSWORD>';
GRANT REPLICATION CLIENT ON *.* TO datadog@'%' WITH MAX_USER_CONNECTIONS 5;
GRANT PROCESS ON *.* TO datadog@'%';
GRANT SELECT ON performance_schema.* TO datadog@'%';
{% /tab %}
다음 스키마를 만드세요.
CREATE SCHEMA IF NOT EXISTS datadog;
GRANT EXECUTE ON datadog.* to datadog@'%';
에이전트가 explain plan을 수집할 수 있도록 explain_statement 프로시저를 만드세요.
DELIMITER $$
CREATE PROCEDURE datadog.explain_statement(IN query TEXT)
SQL SECURITY DEFINER
BEGIN
SET @explain := CONCAT('EXPLAIN FORMAT=json ', query);
PREPARE stmt FROM @explain;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
추가로, explain plan을 수집하려는 모든 스키마에 이 프로시저를 만드세요. <YOUR_SCHEMA>를 데이터베이스 스키마로 바꾸세요.
DELIMITER $$
CREATE PROCEDURE <YOUR_SCHEMA>.explain_statement(IN query TEXT)
SQL SECURITY DEFINER
BEGIN
SET @explain := CONCAT('EXPLAIN FORMAT=json ', query);
PREPARE stmt FROM @explain;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
GRANT EXECUTE ON PROCEDURE <YOUR_SCHEMA>.explain_statement TO datadog@'%';
인덱스 메트릭을 수집하려면 datadog 사용자에게 추가 권한을 부여하세요.
GRANT SELECT ON mysql.innodb_index_stats TO datadog@'%';
Agent v7.65부터 Datadog Agent는 MySQL 데이터베이스에서 스키마 정보를 수집할 수 있어요. 이 수집을 위해 에이전트에 권한을 부여하는 방법은 아래 스키마 수집 (Collecting schemas) 섹션을 참고하세요.
런타임 설정 컨슈머 (Runtime setup consumers)
Datadog은 에이전트가 런타임에 performance_schema.events_* 컨슈머를 활성화할 수 있도록 다음 프로시저를 만들 것을 권장합니다.
DELIMITER $$
CREATE PROCEDURE datadog.enable_events_statements_consumers()
SQL SECURITY DEFINER
BEGIN
UPDATE performance_schema.setup_consumers SET enabled='YES' WHERE name LIKE 'events_statements_%';
UPDATE performance_schema.setup_consumers SET enabled='YES' WHERE name = 'events_waits_current';
END $$
DELIMITER ;
GRANT EXECUTE ON PROCEDURE datadog.enable_events_statements_consumers TO datadog@'%';
비밀번호를 안전하게 저장하기
Vault 같은 비밀 관리 소프트웨어로 비밀번호를 저장하세요. 그러면 에이전트 설정 파일에서 이 비밀번호를 ENC[<SECRET_NAME>]로 참조할 수 있어요. 예: ENC[datadog_user_database_password]. 자세한 내용은 비밀 관리 (Secrets Management)를 참고하세요.
이 페이지의 예시는 비밀번호가 저장된 비밀의 이름으로 datadog_user_database_password를 사용합니다. 비밀번호를 평문으로 참조하는 것도 가능하지만 권장되지는 않아요.
에이전트 설치 및 구성하기
Aurora 호스트를 모니터링하려면 인프라에 Datadog Agent를 설치하고 각 인스턴스 엔드포인트에 원격으로 연결하도록 구성하세요. 에이전트가 데이터베이스 위에서 실행될 필요는 없고, 연결만 하면 돼요. 여기에 언급되지 않은 추가 설치 방법은 Agent 설치 지침을 참고하세요.
{% tab title="Host" %}
자동 탐지 설정 (권장)
Datadog Agent는 클러스터의 모든 Aurora 엔드포인트 자동 탐지(Autodiscovery)를 지원해요. 인스턴스마다 다른 구성을 원하거나 Aurora 엔드포인트를 수동으로 찾아 나열하려는 경우가 아니라면, 아래의 수동 설정 섹션 대신 Aurora DB 클러스터용 자동 탐지 설정 지침을 따르세요.
수동 설정 (Manual setup)
호스트에서 실행되는 에이전트에 대해 이 점검을 구성하려면 (예: 에이전트가 Aurora 데이터베이스에서 수집하기 위해 작은 EC2 인스턴스를 프로비저닝하는 경우):
에이전트의 구성 디렉토리 루트에 있는 conf.d/ 폴더의 mysql.d/conf.yaml 파일을 편집하세요. 사용자 지정 메트릭을 포함한 모든 구성 옵션은 샘플 mysql.d/conf.yaml을 참고하세요.
MySQL 메트릭을 수집하려면 mysql.d/conf.yaml에 이 구성 블록을 추가하세요.
init_config:
instances:
- dbm: true
host: '<AWS_INSTANCE_ENDPOINT>'
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]' # 앞선 CREATE USER 단계에서 비밀로 저장한 값
# 프로젝트와 인스턴스를 추가한 뒤, Datadog AWS 통합을 구성해 CPU와 메모리 같은 추가 클라우드 데이터를 가져오세요.
aws:
instance_endpoint: '<AWS_INSTANCE_ENDPOINT>'
{% alert level="danger" %} 여기에는 Aurora 인스턴스 엔드포인트를 사용하세요. 클러스터 엔드포인트가 아니라요. {% /alert %}
MySQL 메트릭을 Datadog로 보내기 시작하려면 에이전트를 재시작하세요. {% /tab %}
{% tab title="Docker" %}
ECS나 Fargate 같은 Docker 컨테이너에서 실행되는 Database Monitoring Agent를 구성하려면 Autodiscovery 통합 템플릿을 에이전트 컨테이너의 Docker 라벨로 설정할 수 있어요.
참고: 라벨 자동 탐지(Autodiscovery)가 동작하려면 에이전트가 Docker 소켓에 대한 읽기 권한이 있어야 해요.
커맨드 라인 (Command line)
커맨드 라인에서 에이전트를 실행하려면 다음 명령을 실행하세요. 계정과 환경에 맞게 값을 바꾸세요.
export DD_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export DD_AGENT_VERSION=7.36.1
docker run -e "DD_API_KEY=${DD_API_KEY}" \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-l com.datadoghq.ad.check_names='["mysql"]' \
-l com.datadoghq.ad.init_configs='[{}]' \
-l com.datadoghq.ad.instances='[{
"dbm": true,
"host": "<AWS_INSTANCE_ENDPOINT>",
"port": 3306,
"username": "datadog",
"password": "<UNIQUEPASSWORD>"
}]' \
registry.datadoghq.com/agent:${DD_AGENT_VERSION}
Dockerfile
라벨은 Dockerfile에서도 지정할 수 있어요. 그러면 인프라 구성을 바꾸지 않고도 사용자 지정 에이전트를 빌드하고 배포할 수 있습니다.
FROM registry.datadoghq.com/agent:<AGENT_VERSION>
LABEL "com.datadoghq.ad.check_names"='["mysql"]'
LABEL "com.datadoghq.ad.init_configs"='[{}]'
LABEL "com.datadoghq.ad.instances"='[{"dbm": true, "host": "<AWS_INSTANCE_ENDPOINT>", "port": 3306,"username": "datadog","password": "ENC[datadog_user_database_password]"}]'
{% alert level="danger" %} 호스트로는 클러스터 엔드포인트가 아니라 Aurora 인스턴스 엔드포인트를 사용하세요. {% /alert %}
{% /tab %}
{% tab title="Kubernetes" %}
Kubernetes 클러스터가 있다면 Database Monitoring에 Datadog Cluster Agent를 사용하세요.
Kubernetes 클러스터에서 아직 활성화하지 않았다면 클러스터 점검 활성화 지침을 따르세요. MySQL 구성을 Cluster Agent 컨테이너에 마운트된 정적 파일로 선언하거나 서비스 어노테이션으로 선언할 수 있어요.
Operator
Kubernetes 및 Integrations의 Operator 지침을 참고로, 아래 단계에 따라 MySQL 통합을 설정하세요.
-
다음 구성으로
datadog-agent.yaml파일을 만들거나 업데이트하세요.apiVersion: datadoghq.com/v2alpha1 kind: DatadogAgent metadata: name: datadog spec: global: clusterName: <CLUSTER_NAME> site: <DD_SITE> credentials: apiSecret: secretName: datadog-agent-secret keyName: api-key features: clusterChecks: enabled: true override: nodeAgent: image: name: agent tag: <AGENT_VERSION> clusterAgent: extraConfd: configDataMap: mysql.yaml: |- cluster_check: true init_config: instances: - host: <AWS_INSTANCE_ENDPOINT> port: <PORT> username: datadog password: 'ENC[datadog_user_database_password]' dbm: true aws: instance_endpoint: <AWS_INSTANCE_ENDPOINT> region: <AWS_REGION> -
다음 명령으로 변경 사항을 Datadog Operator에 적용하세요.
kubectl apply -f datadog-agent.yaml
Helm
-
Helm에 대한 Datadog Agent 설치 지침을 완료하세요.
-
YAML 설정 파일(Cluster Agent 설치 지침의
datadog-values.yaml)을 업데이트해 다음을 포함하세요.clusterAgent: confd: mysql.yaml: |- cluster_check: true init_config: instances: - dbm: true host: <AWS_INSTANCE_ENDPOINT> port: <PORT> username: datadog password: 'ENC[datadog_user_database_password]' aws: instance_endpoint: <AWS_INSTANCE_ENDPOINT> region: <AWS_REGION> clusterChecksRunner: enabled: true -
커맨드 라인에서 위 설정 파일로 에이전트를 배포하세요.
helm install datadog-agent -f datadog-values.yaml datadog/datadog
{% alert level="info" %}
Windows에서는 helm install 명령에 --set targetSystem=windows를 추가하세요.
{% /alert %}
마운트된 파일로 구성하기
마운트된 설정 파일로 클러스터 점검을 구성하려면 /conf.d/mysql.yaml 경로에 설정 파일을 Cluster Agent 컨테이너에 마운트하세요.
cluster_check: true # 이 플래그를 포함해야 해요
init_config:
instances:
- dbm: true
host: '<AWS_INSTANCE_ENDPOINT>'
port: <PORT>
username: datadog
password: 'ENC[datadog_user_database_password]'
aws:
instance_endpoint: <AWS_INSTANCE_ENDPOINT>
region: <AWS_REGION>
Kubernetes 서비스 어노테이션으로 구성하기
파일을 마운트하는 대신 인스턴스 구성을 Kubernetes Service로 선언할 수 있어요. Kubernetes에서 실행되는 에이전트에 대해 이 점검을 구성하려면 다음 구문으로 서비스를 만드세요.
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
tags.datadoghq.com/env: '<ENV>'
tags.datadoghq.com/service: '<SERVICE>'
annotations:
ad.datadoghq.com/service.check_names: '["mysql"]'
ad.datadoghq.com/service.init_configs: '[{}]'
ad.datadoghq.com/service.instances: |
[
{
"dbm": true,
"host": "<AWS_INSTANCE_ENDPOINT>",
"port": <PORT>,
"username": "datadog",
"password": "ENC[datadog_user_database_password]",
"aws": {
"instance_endpoint": "<AWS_INSTANCE_ENDPOINT>",
"region": "<AWS_REGION>"
}
}
]
spec:
ports:
- port: <PORT>
protocol: TCP
targetPort: <PORT>
name: mysql
Cluster Agent는 이 구성을 자동으로 등록하고 MySQL 점검을 실행하기 시작해요.
datadog 사용자의 비밀번호가 평문으로 노출되지 않게 하려면 에이전트의 비밀 관리 패키지를 사용하고 비밀번호를 ENC[] 구문으로 선언하세요.
{% /tab %}
검증 (Validate)
에이전트의 status 하위 명령을 실행해 Checks 섹션에서 mysql을 찾아보세요. 또는 Databases 페이지를 방문해 시작할 수 있어요.
예시 에이전트 구성 (Example Agent Configurations)
하나의 에이전트가 여러 호스트에 연결하기
단일 에이전트 호스트를 구성해 여러 원격 데이터베이스 인스턴스에 연결하는 것은 흔한 일이에요 (DBM용 에이전트 설치 아키텍처 참고). 여러 호스트에 연결하려면 MySQL 통합 구성에서 호스트별로 항목을 만드세요.
{% alert level="info" %} Datadog은 하나의 에이전트가 30개 이하의 데이터베이스 인스턴스를 모니터링할 것을 권장합니다. 벤치마크에 따르면 t4g.medium EC2 인스턴스(2 CPU, 4GB RAM)에서 실행되는 하나의 에이전트가 30개의 RDS db.t3.medium 인스턴스(2 CPU, 4GB RAM)를 성공적으로 모니터링할 수 있어요. {% /alert %}
init_config:
instances:
- dbm: true
host: example-service-primary.example-host.com
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]'
tags:
- 'env:prod'
- 'team:team-discovery'
- 'service:example-service'
- dbm: true
host: example-service-replica-1.example-host.com
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]'
options:
replication: true
tags:
- 'env:prod'
- 'team:team-discovery'
- 'service:example-service'
- dbm: true
host: example-service-replica-2.example-host.com
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]'
options:
replication: true
tags:
- 'env:prod'
- 'team:team-discovery'
- 'service:example-service'
[...]
사용자 지정 쿼리 실행하기
사용자 지정 메트릭을 수집하려면 custom_queries 옵션을 사용하세요. 자세한 내용은 샘플 mysql.d/conf.yaml을 참고하세요.
init_config:
instances:
- dbm: true
host: localhost
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]'
custom_queries:
- query: SELECT age, salary, hours_worked, name FROM hr.employees;
columns:
- name: custom.employee_age
type: gauge
- name: custom.employee_salary
type: gauge
- name: custom.employee_hours
type: count
- name: name
type: tag
tags:
- 'table:employees'
스키마 수집 (Collecting schemas)
{% alert level="danger" %} MySQL 스키마 수집에는 Datadog Agent v7.65+가 필요해요. {% /alert %}
이 기능을 활성화하려면 collect_schemas 옵션을 사용하세요. 자세한 내용은 샘플 mysql.d/conf.yaml을 참고하세요.
init_config:
instances:
- dbm: true
host: localhost
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]'
collect_schemas:
enabled: true
참고: Agent v7.68 이하에서는 collect_schemas 대신 schemas_collection을 사용하세요.
참고: 테이블의 스키마를 수집하려면 MySQL은 Datadog Agent가 해당 테이블에 대한 권한을 보유해야 해요. 이는 MySQL이 강제하는 제한으로, 에이전트가 권한이 없는 테이블은 메타데이터 쿼리에 아예 나타나지 않아요.
Datadog은 REFERENCES 권한 부여를 권장합니다. 이는 테이블 내용을 읽을 능력을 부여하지 않으면서 MySQL의 메타데이터 가시성 요구를 충족시켜요. 에이전트는 테이블 데이터를 절대 읽지 않으며, 테이블이 INFORMATION_SCHEMA에 표시되기만 하면 됩니다.
다음 명령 중 하나 또는 조합을 사용하세요.
- 모든 데이터베이스 (권장. 나중에 만든 데이터베이스와 테이블도 자동으로 선택되기 때문):
GRANT REFERENCES ON *.* TO datadog@'%'; - 데이터베이스 단위:
GRANT REFERENCES ON [database name].* TO datadog@'%'; - 테이블 단위:
GRANT REFERENCES ON [database name].[table name] TO datadog@'%';
프록시를 통한 호스트 작업
에이전트가 Cloud SQL Auth proxy 같은 프록시를 통해 연결해야 한다면, 모든 원격 측정이 데이터베이스 인스턴스가 아닌 프록시의 호스트 이름으로 태그됩니다. reported_hostname 옵션을 사용해 에이전트가 감지한 호스트 이름의 사용자 지정 재정의를 설정하세요.
init_config:
instances:
- dbm: true
host: localhost
port: 5000
username: datadog
password: 'ENC[datadog_user_database_password]'
reported_hostname: example-service-primary
- dbm: true
host: localhost
port: 5001
username: datadog
password: 'ENC[datadog_user_database_password]'
reported_hostname: example-service-replica-1
RDS 통합 설치하기
AWS CPU 같은 인프라 메트릭을 DBM의 데이터베이스 원격 측정과 함께 보려면 RDS 통합을 설치하세요 (선택 사항).
트러블슈팅
설명한 대로 통합과 에이전트를 설치하고 구성했는데 예상대로 동작하지 않으면 트러블슈팅 문서를 참고하세요.
더 알아보기 (Learn more)
추가로 도움이 되는 문서, 링크, 글: