자체 호스팅 MySQL용 Database Monitoring 설정하기
이 페이지에서는 자체 호스팅 MySQL 데이터베이스에 Database Monitoring을 설정하는 방법을 설명드릴게요. Database Monitoring은 쿼리 메트릭, 쿼리 샘플, explain plan, 연결 데이터, 시스템 메트릭, InnoDB 스토리지 엔진 원격 측정 등을 노출해 MySQL 데이터베이스에 대한 깊은 가시성을 제공합니다.
참고: MariaDB를 사용하신다면 MariaDB 설정하기 문서를 대신 참고해 주세요.
에이전트는 읽기 전용 사용자로 로그인해 데이터베이스에서 직접 원격 측정을 수집해요. MySQL 데이터베이스에 Database Monitoring을 활성화하려면 다음 단계를 따르세요.
- 데이터베이스 파라미터 구성하기
- 에이전트에 데이터베이스 액세스 권한 부여하기
- 에이전트 설치하기
출처: 문서
본문
시작하기 전에 (Before you begin)
- 지원되는 MySQL 버전: 5.6, 5.7, 8.0+ 또는 9 (MySQL 9는 Agent 7.84+ 필요)
- 지원되는 MariaDB 버전: 10.5, 10.6, 10.11, 11.1, 12 또는 13 (MariaDB 12와 13은 Agent 7.84+ 필요). MariaDB용 Database Monitoring은 [알려진 제한 사항][13]과 함께 지원됩니다.
- 지원되는 Agent 버전: 7.36.1+
- 성능 영향: Database Monitoring의 기본 Agent 구성은 보수적이지만, 수집 간격이나 쿼리 샘플링 비율 같은 설정을 필요에 맞게 조정할 수 있어요. 대부분의 워크로드에서 에이전트는 데이터베이스 쿼리 실행 시간의 1% 미만, CPU의 1% 미만을 차지합니다. Database Monitoring은 기본 Agent 위에서 통합으로 실행돼요 (벤치마크 참고).
- 프록시, 로드 밸런서, 커넥션 풀러: Datadog Agent는 모니터링 대상 호스트에 직접 연결해야 해요. 자체 호스팅 데이터베이스의 경우
127.0.0.1이나 소켓이 선호됩니다. 에이전트는 프록시, 로드 밸런서, 커넥션 풀러를 통해 데이터베이스에 연결하면 안 돼요. 에이전트가 실행 중에 다른 호스트에 연결하면(장애 조치, 로드 밸런싱 등의 경우) 에이전트는 두 호스트 사이의 통계 차이를 계산해 부정확한 메트릭을 만들어내요. - 데이터 보안 고려 사항: 에이전트가 데이터베이스에서 수집하는 데이터와 이를 안전하게 유지하는 방법은 민감 정보 (Sensitive information) 문서를 참고하세요.
MySQL 설정 구성하기
쿼리 메트릭, 샘플, explain plan을 수집하려면 MySQL Performance Schema를 활성화하고 커맨드 라인이나 설정 파일(예: mysql.conf)에서 다음 Performance Schema 옵션을 구성하세요.
{% tab title="MySQL ≥ 5.7" %}
| 파라미터 | 값 | 설명 |
|---|---|---|
performance_schema |
ON |
필수. Performance Schema를 활성화합니다. |
max_digest_length |
4096 |
더 큰 쿼리 수집에 필요합니다. 기본값으로 두면 1024자보다 긴 쿼리는 수집되지 않아요. |
performance_schema_max_digest_length |
4096 |
max_digest_length와 일치해야 해요. |
performance_schema_max_sql_text_length |
4096 |
max_digest_length와 일치해야 해요. |
performance-schema-consumer-events-statements-current |
ON |
필수. 현재 실행 중인 쿼리 모니터링을 활성화합니다. |
performance-schema-consumer-events-waits-current |
ON |
필수. 대기 이벤트 수집을 활성화합니다. |
performance-schema-consumer-events-statements-history-long |
ON |
권장. 모든 스레드에서 더 많은 최근 쿼리 추적을 활성화합니다. 활성화하면 빈도가 낮은 쿼리의 실행 세부 정보를 캡처할 가능성이 높아져요. |
performance-schema-consumer-events-statements-history |
ON |
선택. 스레드별 최근 쿼리 기록 추적을 활성화합니다. 활성화하면 빈도가 낮은 쿼리의 실행 세부 정보를 캡처할 가능성이 높아져요. |
{% /tab %}
{% tab title="MySQL 5.6" %}
| 파라미터 | 값 | 설명 |
|---|---|---|
performance_schema |
ON |
필수. Performance Schema를 활성화합니다. |
max_digest_length |
4096 |
더 큰 쿼리 수집에 필요합니다. 기본값으로 두면 1024자보다 긴 쿼리는 수집되지 않아요. |
performance_schema_max_digest_length |
4096 |
max_digest_length와 일치해야 해요. |
performance-schema-consumer-events-statements-current |
ON |
필수. 현재 실행 중인 쿼리 모니터링을 활성화합니다. |
performance-schema-consumer-events-waits-current |
ON |
필수. 대기 이벤트 수집을 활성화합니다. |
performance-schema-consumer-events-statements-history-long |
ON |
권장. 모든 스레드에서 더 많은 최근 쿼리 추적을 활성화합니다. 활성화하면 빈도가 낮은 쿼리의 실행 세부 정보를 캡처할 가능성이 높아져요. |
performance-schema-consumer-events-statements-history |
ON |
선택. 스레드별 최근 쿼리 기록 추적을 활성화합니다. 활성화하면 빈도가 낮은 쿼리의 실행 세부 정보를 캡처할 가능성이 높아져요. |
{% /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를 사용합니다. 비밀번호를 평문으로 참조하는 것도 가능하지만 권장되지는 않아요.
에이전트 설치하기
Datadog Agent를 설치하면 MySQL Database Monitoring에 필요한 MySQL 점검도 함께 설치돼요. MySQL 데이터베이스 호스트에 아직 에이전트를 설치하지 않았다면 Agent 설치 지침을 참고하세요.
호스트에서 실행되는 에이전트에 대해 이 점검을 구성하려면:
MySQL 메트릭과 로그 수집을 시작하려면 에이전트의 구성 디렉토리 루트에 있는 conf.d/ 폴더의 mysql.d/conf.yaml 파일을 편집하세요. 사용자 지정 메트릭을 포함한 모든 구성 옵션은 샘플 mysql.d/conf.yaml을 참고하세요.
메트릭 수집 (Metric collection)
MySQL 메트릭을 수집하려면 mysql.d/conf.yaml에 이 구성 블록을 추가하세요.
init_config:
instances:
- dbm: true
host: 127.0.0.1
port: 3306
username: datadog
password: 'ENC[datadog_user_database_password]' # 앞선 CREATE USER 단계에서
datadog 사용자는 MySQL 통합 구성에서 host: 127.0.0.1로 설정해야 하며, localhost가 아니라야 해요. 또는 sock을 사용할 수도 있어요.
MySQL 메트릭을 Datadog로 보내기 시작하려면 에이전트를 재시작하세요.
로그 수집 (선택 사항)
에이전트가 데이터베이스에서 수집하는 원격 측정 외에도, 데이터베이스 로그를 Datadog로 직접 보낼 수 있어요.
-
기본적으로 MySQL은 모든 것을
/var/log/syslog에 기록하는데, 이를 읽으려면 root 액세스가 필요해요. 로그에 더 쉽게 접근하려면 다음 단계를 따르세요./etc/mysql/conf.d/mysqld_safe_syslog.cnf를 편집하고 모든 줄을 주석 처리하세요./etc/mysql/my.cnf를 편집해 원하는 로깅 설정을 활성화하세요. 예를 들어 general, error, slow query 로그를 활성화하려면 다음 구성을 사용하세요.
[mysqld_safe] log_error = /var/log/mysql/mysql_error.log [mysqld] general_log = on general_log_file = /var/log/mysql/mysql.log log_error = /var/log/mysql/mysql_error.log slow_query_log = on slow_query_log_file = /var/log/mysql/mysql_slow.log long_query_time = 3
파일을 저장하고 MySQL을 재시작하세요. 에이전트가 /var/log/mysql 디렉토리와 그 안의 모든 파일에 대해 읽기 권한을 갖도록 하세요. logrotate 구성에서 이러한 파일이 고려되고 권한이 올바르게 설정되었는지 다시 확인하세요. /etc/logrotate.d/mysql-server에는 다음과 유사한 내용이 있어야 해요.
/var/log/mysql.log /var/log/mysql/mysql.log /var/log/mysql/mysql_slow.log {
daily
rotate 7
missingok
create 644 mysql adm
Compress
}
-
로그 수집은 Datadog Agent에서 기본적으로 꺼져 있어요.
datadog.yaml파일에서 활성화하세요.logs_enabled: true -
MySQL 로그 수집을 시작하려면
mysql.d/conf.yaml파일에 이 구성 블록을 추가하세요.logs: - type: file path: "<ERROR_LOG_FILE_PATH>" source: mysql service: "<SERVICE_NAME>" - type: file path: "<SLOW_QUERY_LOG_FILE_PATH>" source: mysql service: "<SERVICE_NAME>" log_processing_rules: - type: multi_line name: new_slow_query_log_entry pattern: "# Time:" # mysqld를 `--log-short-format`로 시작했다면 다음을 사용하세요: # pattern: "# Query_time:" # mysql 버전 <5.7을 사용한다면 대신 다음 규칙을 사용하세요: # - type: multi_line # name: new_slow_query_log_entry # pattern: "# Time|# User@Host" # - type: exclude_at_match # name: exclude_timestamp_only_line # pattern: "# Time:" - type: file path: "<GENERAL_LOG_FILE_PATH>" source: mysql service: "<SERVICE_NAME>" # 여러 줄 로그가 yyyy-mm-dd 형식의 날짜로 시작한다면 다음 처리 규칙의 주석을 해제하세요 # log_processing_rules: # - type: multi_line # name: new_log_start_with_date # pattern: \\d{4}\\-(0?[1-9]|1[012])\\-(0?[1-9]|[12][0-9]|3[01]) # 로그가 yymmdd 형식의 날짜로 시작하지만 각 로그가 아닌 매 초마다 타임스탬프를 포함한다면 다음 처리 규칙의 주석을 해제하세요 # log_processing_rules: # - type: multi_line # name: new_logs_do_not_always_start_with_timestamp # pattern: \\t\\t\\s*\\d+\\s+|\\d{6}\\s+\\d{,2}:\\d{2}:\\d{2}\\t\\s*\\d+\\s+ -
에이전트를 재시작하세요.
검증 (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
트러블슈팅
설명한 대로 통합과 에이전트를 설치하고 구성했는데 예상대로 동작하지 않으면 트러블슈팅 문서를 참고하세요.
더 알아보기 (Learn more)
추가로 도움이 되는 문서, 링크, 글: