m0_75124167 2025-08-15 10:17 采纳率: 0%
浏览 8

关于#elk#的问题:elk监控mysql日志配置完整配置

elk监控mysql一主一从的日志文件elk安装怎么配置监控mysql

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-08-15 10:18
    关注

    上午好☀️☀️☀️️
    本答案参考通义千问

    关于使用 ELK(Elasticsearch + Logstash + Kibana) 监控 MySQL 日志(包括一主一从的 MySQL 实例),以下是完整的配置流程和详细说明。


    一、ELK 简介

    • Elasticsearch:用于存储和搜索日志数据。
    • Logstash:用于收集、解析和转发日志数据。
    • Kibana:用于可视化和展示日志数据。

    二、MySQL 日志类型(监控目标)

    MySQL 的日志类型包括:

    1. 错误日志(Error Log):记录数据库运行过程中的错误信息。
    2. 慢查询日志(Slow Query Log):记录执行时间较长的 SQL 查询。
    3. 通用查询日志(General Query Log):记录所有 SQL 操作。
    4. 二进制日志(Binary Log):用于主从复制和数据恢复。
    5. 中继日志(Relay Log):主从复制过程中使用的日志。

    三、配置 ELK 监控 MySQL 的步骤

    1. 安装 ELK 栈

    确保你已经安装了以下组件:

    • Elasticsearch
    • Logstash
    • Kibana

    如果你还没有安装,可以参考官方文档或使用 Docker 部署。


    2. 配置 MySQL 日志

    a. 启用 MySQL 错误日志和慢查询日志

    编辑 MySQL 配置文件(通常为 /etc/my.cnf/etc/mysql/my.cnf):

    [mysqld]
    log_error = /var/log/mysql/error.log
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/slow.log
    long_query_time = 2
    

    long_query_time 设置为 2 秒以上,根据实际需求调整。

    b. 配置主从复制日志(可选)

    在主库中启用二进制日志:

    [mysqld]
    server-id=1
    log-bin=mysql-bin
    

    在从库中配置:

    [mysqld]
    server-id=2
    relay-log=mysql-relay-bin
    

    3. 配置 Logstash 收集 MySQL 日志

    创建一个 Logstash 配置文件,例如 /etc/logstash/conf.d/mysql.conf

    input {
      file {
        path => "/var/log/mysql/*.log"
        start_position => "beginning"
        sincedb_path => "/dev/null"  # 避免重复读取
      }
    }
    
    filter {
      if [message] =~ /.*Time: .*/ {
        grok {
          match => { "message" => "%{GREEDYDATA}Time: %{TIME:time} %{NUMBER:thread_id} %{WORD:command_type} %{NUMBER:query_time} %{NUMBER:lock_time} %{NUMBER:rows_sent} %{NUMBER:rows_examined} %{DATA:sql}" }
        }
      }
    
      if [message] =~ /.*InnoDB:/ {
        grok {
          match => { "message" => "%{DATESTAMP:timestamp} %{GREEDYDATA:innoDB_message}" }
        }
      }
    
      date {
        match => [ "time", "HH:mm:ss" ]
        target => "@timestamp"
      }
    }
    
    output {
      elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "mysql-%{+YYYY.MM.dd}"
      }
      stdout { codec => rubydebug }
    }
    

    注意:上述 grok 表达式需要根据你的 MySQL 日志格式进行调整。如果日志格式不同,可能需要自定义 grok 模式。


    4. 启动 Logstash

    sudo systemctl start logstash
    sudo systemctl enable logstash
    

    5. 使用 Kibana 查看日志

    打开浏览器访问 http://localhost:5601,进入 Kibana。

    • 创建索引模式:mysql-*
    • 进入 Discover 页面查看 MySQL 日志

    四、监控一主一从 MySQL 的配置建议

    如果你有 一主一从 的 MySQL 架构,可以通过以下方式实现统一监控:

    1. 分别配置主从服务器的日志路径

    在主库和从库中分别配置日志路径,如:

    • 主库:/var/log/mysql/master-error.log, /var/log/mysql/master-slow.log
    • 从库:/var/log/mysql/slave-error.log, /var/log/mysql/slave-slow.log

    2. 修改 Logstash 配置文件

    在 Logstash 中添加多个 file 输入,分别指向主从服务器的日志路径:

    input {
      file {
        path => "/var/log/mysql/master-*.log"
        start_position => "beginning"
      }
    
      file {
        path => "/var/log/mysql/slave-*.log"
        start_position => "beginning"
      }
    }
    

    3. 在 Kibana 中区分主从日志

    可以在日志字段中添加 source 字段,标识日志来源是主库还是从库:

    filter {
      mutate {
        add_field => { "source" => "master" }
      }
      if [path] =~ /slave/ {
        mutate {
          remove_field => [ "source" ]
          add_field => { "source" => "slave" }
        }
      }
    }
    

    五、完整配置示例(修改后的 Logstash 配置)

    input {
      file {
        path => "/var/log/mysql/master-*.log"
        start_position => "beginning"
        sincedb_path => "/dev/null"
      }
    
      file {
        path => "/var/log/mysql/slave-*.log"
        start_position => "beginning"
        sincedb_path => "/dev/null"
      }
    }
    
    filter {
      # 处理慢查询日志
      if [message] =~ /.*Time: .*/ {
        grok {
          match => { "message" => "%{GREEDYDATA}Time: %{TIME:time} %{NUMBER:thread_id} %{WORD:command_type} %{NUMBER:query_time} %{NUMBER:lock_time} %{NUMBER:rows_sent} %{NUMBER:rows_examined} %{DATA:sql}" }
        }
        date {
          match => [ "time", "HH:mm:ss" ]
          target => "@timestamp"
        }
      }
    
      # 添加 source 字段
      if [path] =~ /master/ {
        mutate {
          add_field => { "source" => "master" }
        }
      } else {
        mutate {
          add_field => { "source" => "slave" }
        }
      }
    }
    
    output {
      elasticsearch {
        hosts => ["http://localhost:9200"]
        index => "mysql-%{+YYYY.MM.dd}"
      }
      stdout { codec => rubydebug }
    }
    

    六、常见问题与解决方案

    | 问题 | 解决方案 | |------|----------| | Logstash 无法读取日志 | 检查文件权限,确保 Logstash 用户有权限读取日志文件 | | 日志未显示在 Kibana | 检查 Elasticsearch 是否正常运行,确认索引是否正确 | | Grok 匹配失败 | 使用 Grok Debugger 调试日志格式 | | 主从日志混在一起 | 使用 source 字段进行过滤 |


    七、总结

    • ELK 是监控 MySQL 日志的强大工具,通过 Logstash 可以灵活地采集、解析和发送日志。
    • 一主一从 MySQL 的监控可以通过配置不同的日志路径和添加标识字段来实现。
    • 推荐使用 Kibana 可视化日志,便于快速定位问题。

    如需进一步定制日志解析规则,请提供你的 MySQL 日志示例,我可以帮助你优化 grok 模式。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月15日