자체 호스팅 MySQL에 대한 데이터베이스 모니터링 설정

데이터베이스 모니터링은 InnoDB 스토리지 엔진에 대한 쿼리 메트릭, 쿼리 샘플, 설명 계획, 연결 데이터, 시스템 메트릭, 텔레메트리를 표시하여 MySQL 데이터베이스에 대해 구체적인 가시성을 제공합니다.

Agent는 읽기 전용 사용자로 로그인하여 데이터베이스에서 직접 텔레메트리를 수집합니다. MySQL 데이터베이스로데이터베이스 모니터링을 활성화하려면 다음대로 설정하세요.

  1. 데이터베이스 파라미터 설정
  2. 에이전트에 데이터베이스 접근 권한 부여
  3. Agent 설치

시작 전 참고 사항

지원되는 MySQL 버전
5.6, 5.7, 또는 8.0+
지원되는 MariaDB 버전
10.5, 10.6, 10.11 또는 11.1

MariaDB용 데이터베이스 모니터링 는 알려진 제한 사항과 함께 지원됩니다.
지원되는 에이전트 버전
7.36.1+
성능에 미치는 영향
데이터베이스 모니터링에 대한 기본 에이전트 설정은 변경하지 않는 것이 좋으나 수집 간격 및 쿼리 샘플링 속도와 같은 설정은 필요에 맞게 조정할 수 있습니다. 대부분의 워크로드에서 에이전트는 데이터베이스에서 쿼리 실행 시간의 1% 미만, CPU의 1% 미만을 나타냅니다.

데이터베이스 모니터링은 기본 에이전트 위에서 통합으로 실행됩니다(벤치마크 참조).
프록시, 로드 밸런서 및 연결 풀러
Datadog 에이전트는 모니터링되는 호스트에 직접 연결해야 합니다. 자체 호스팅 데이터베이스의 경우 127.0.0.1 또는 소켓을 사용하는 것이 좋습니다. 에이전트는 프록시, 로드 밸런서 또는 연결 풀러를 통해 데이터베이스에 연결해서는 안 됩니다. 에이전트가 실행되는 동안 다른 호스트에 연결하면(장애 조치, 로드밸런싱 등의 경우) 에이전트가 두 호스트 간의 통계 차이를 계산하여 부정확한 메트릭을 생성합니다.
데이터 보안 고려 사항
에이전트가 데이터베이스에서 수집하는 데이터와 데이터 보안을 유지하는 방법에 대한 자세한 내용은 민감한 정보를 참조하세요.

MySQL 설정 구성

쿼리 메트릭, 샘플, 설명 계획을 수집하려면 MySQL 성능 스키마를 활성화하고 명령줄 또는 설정 파일 (예: mysql.conf)에서 다음 성능 스키마 옵션을 설정합니다:

ParameterValueDescription
performance_schemaON필수. 성능 스키마를 활성화합니다.
max_digest_length4096더 대규모의 쿼리 수집에 필요합니다. 기본값을 사용하면 1024자 이상의 쿼리가 수집됩니다.
performance_schema_max_digest_length4096max_digest_length와 일치해야 합니다.
performance_schema_max_sql_text_length4096max_digest_length와 일치해야 합니다.
performance-schema-consumer-events-statements-currentON필수. 현재 실행 중인 쿼리 모니터링을 활성화합니다.
performance-schema-consumer-events-waits-currentON필수. 대기 이벤트 수집을 활성화합니다.
performance-schema-consumer-events-statements-history-longON권장. 모든 스레드에서 더 많은 최근 쿼리 추적을 활성화합니다. 활성화하면 빈도수가 낮은 쿼리에서 실행 상세정보를 캡처할 가능성이 더 커집니다.
performance-schema-consumer-events-statements-historyON선택 사항. 스레드별 최근 쿼리 기록 추적을 활성화합니다. 활성화하면 빈도수가 낮은 쿼리에서 실행 상세정보를 캡처할 가능성이 더 커집니다.
파라미타설명
performance_schemaON필수. 성능 스키마를 활성화합니다.
max_digest_length4096더 많은 양의 쿼리 수집에 필요합니다. 기본값을 사용하면 1024자 이상의 쿼리가 수집되지 않습니다.
performance_schema_max_digest_length4096max_digest_length와 일치해야 합니다.
performance-schema-consumer-events-statements-currentON필수. 현재 실행 중인 쿼리 모니터링을 활성화합니다.
performance-schema-consumer-events-waits-currentON필수. 대기 이벤트 수집을 활성화합니다.
performance-schema-consumer-events-statements-history-longON권장. 모든 스레드에서 더 많은 최근 쿼리 추적을 활성화합니다. 활성화하면 빈도수가 낮은 쿼리에서 실행 상세정보를 캡처할 가능성이 더 커집니다.
performance-schema-consumer-events-statements-historyON선택 사항. 스레드별 최근 쿼리 기록 추적을 활성화합니다. 활성화하면 빈도수가 낮은 쿼리에서 실행 상세정보를 캡처할 가능성이 더 커집니다.

참고: Agent 액세스 권한 부여의 일부로 Agent가 런타임에 동적으로 performance-schema-consumer-* 설정을 사용하도록 허용합니다. 런타임 설정 컨슈머를 참조하세요.

에이전트에 접근 권한 부여

Datadog 에이전트가 통계와 쿼리를 수집하려면 데이터베이스에 대한 읽기 전용 액세스가 필요합니다.

다음 지침은 datadog@'%'를 사용하는 모든 호스트에서 로그인할 수 있도록 Agent에 권한을 부여합니다. datadog@'localhost'를 사용하여 로컬 호스트에서만 로그인하도록 datadog 사용자를 제한할 수 있습니다. 자세한 정보는 MySQL 설명서를 참조하세요.

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@'%';

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@'%';

다음 스키마를 생성하세요.

CREATE SCHEMA IF NOT EXISTS datadog;
GRANT EXECUTE ON datadog.* to datadog@'%';

에이전트가 설명 계획을 수집할 수 있도록 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 ;

또한 설명 계획을 수집하려는 모든 스키마에서 이 절차를 생성합니다. <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@'%';

에이전트 v7.65부터 Datadog 에이전트에서 MySQL 데이터베이스에서 스키마 정보를 수집할 수 있습니다. 이 수집을 위해 에이전트 권한을 부여하는 방법에 대한 자세한 내용은 아래의 스키마 수집 섹션을 참조하세요.

런타임 설정 컨슈머

다음 절차를 생성하여 에이전트가 런타임에 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@'%';

비밀번호를 안전하게 저장하기

Store your password using secret management software such as Vault. You can then reference this password as ENC[<SECRET_NAME>] in your Agent configuration files: for example, ENC[datadog_user_database_password]. See Secrets Management for more information.

The examples on this page use datadog_user_database_password to refer to the name of the secret where your password is stored. It is possible to reference your password in plain text, but this is not recommended.

에이전트 설치

DataDog Agent를 설치하면 MySQL에 데이터베이스 모니터링에 필요한 MySQL 검사도 설치됩니다. MySQL 데이터베이스 호스트에 대한 Agent를 아직 설치하지 않은 경우 Agent 설치 지침을 참조하세요.

호스트에서 실행 중인 에이전트에 이 점검을 구성하는 방법:

Agent의 설정 디렉터리 루트에 있는 conf.d/ 폴더에서 mysql.d/conf.yaml 파일을 편집하여 MySQL 메트릭로그 수집을 시작하세요. 커스텀 메트릭을 포함하여 사용 가능한 모든 설정 옵션은 sample mysql.d/conf.yaml에서 확인하세요.

메트릭 수집

이 설정 블록을 mysql.d/conf.yaml에 추가하여 MySQL 메트릭을 수집하세요.

init_config:

instances:
  - dbm: true
    host: 127.0.0.1
    port: 3306
    username: datadog
    password: 'ENC[datadog_user_database_password]' # from the CREATE USER step earlier

datadog 사용자는 MySQL 통합 설정에서 localhost 대신 host: 127.0.0.1로 설정되어야 합니다. 또는, sock를 사용합니다.

MySQL 메트릭을 Datadog으로 전송하기 위해 Agent를 재시작합니다.

로그 수집 (선택 사항)

Agent가 데이터베이스에서 수집한 텔레메트리 외에도 데이터베이스 로그를 Datadog으로 직접 전송하도록 선택할 수있습니다.

  1. 기본적으로 MySQL은 읽기 위해 루트 액세스 권한이 필요한 모든 항목을 /var/log/syslog에서 기록합니다. 로그에 더 쉽게 액세스할 수 있도록 하려면 다음 단계를 따르세요:

    1. /etc/mysql/conf.d/mysqld_safe_syslog.cnf을 편집하여 모든 행에 코멘트를 추가합니다.
    2. /etc/mysql/my.cnf를 편집하여 원하는 로깅 설정을 사용하세요. 예를 들어, 일반, 오류 및 느린 쿼리 로그를 사용하도록 설정하려면 다음 구성을 사용합니다:
      [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
    
    1. 파일을 저장하고 MySQL을 다시 시작합니다.
    2. Agent가 /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
      }
    
  2. 로그 수집은 Datadog 에이전트에서 기본적으로 비활성화되어 있습니다. datadog.yaml 파일에서 활성화합니다.

    logs_enabled: true
    
  3. 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:"
            # If mysqld was started with `--log-short-format`, use:
            # pattern: "# Query_time:"
            # If using mysql version <5.7, use the following rules instead:
            # - 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>"
        # For multiline logs, if they start by the date with the format yyyy-mm-dd uncomment the following processing rule
        # 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])
        # If the logs start with a date with the format yymmdd but include a timestamp with each new second, rather than with each log, uncomment the following processing rule
        # 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+
    
  4. [에이전트를 재시작합니다] 9.

검증

에이전트 상태 하위 명령을 실행하고 점검 섹션에서 mysql을 찾거나 데이터베이스 페이지를 참조하여 시작하세요!

에이전트 설정 예시

One agent connecting to multiple hosts

It is common to configure a single Agent host to connect to multiple remote database instances (see Agent installation architectures for DBM). To connect to multiple hosts, create an entry for each host in the MySQL integration config. In these cases, Datadog recommends limiting the number of instances per Agent to a maximum of 10 database instances to guarantee reliable performance.

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'
    [...]

Running custom queries

To collect custom metrics, use the custom_queries option. See the sample mysql.d/conf.yaml for more details.

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

Starting from Agent v7.65, the Datadog Agent can collect schema information from MySQL databases. To enable this feature, use the schemas_collection option.

Note: To collect schemas for a table, MySQL requires that the Datadog Agent has SELECT access for it. This is a MySQL-enforced restriction. Without SELECT access, the table will not appear in metadata queries.

The Agent does not use SELECT to access or read your table data. This permission is needed solely to retrieve schema details, due to how MySQL handles metadata visibility.

To grant SELECT permissions to a Datadog user, use one or a combination of the following commands:

  • All databases:
    GRANT SELECT ON *.* TO datadog@'%';
    
  • Per database basis:
    GRANT SELECT ON [database name].* TO datadog@'%';
    
  • Per table basis:
    GRANT SELECT ON [database name].[table name] TO datadog@'%';
    
  • Per column basis:
    GRANT SELECT ([column name1], [column name 2]) ON [database name].[table name] TO datadog@'%';
    

Working with hosts through a proxy

If the Agent must connect through a proxy such as the Cloud SQL Auth proxy, all telemetry is tagged with the hostname of the proxy rather than the database instance. Use the reported_hostname option to set a custom override of the hostname detected by the Agent.

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

트러블슈팅

설명에 따라 통합 및 Agent를 설치 및 설정하였으나 제대로 작동하지 않는 경우 트러블슈팅을 참조하세요.

참고 자료

추가 유용한 문서, 링크 및 기사:

PREVIEWING: guacbot/translation-pipeline