跳到主要内容

VictoriaLogs + Promtail 二进制部署

前置说明

如果你还没做 MongoDB 日志切割,请先看 MongoDB 日志切割。 该方案不包含 Grafana,需要现场提前准备好可用的 Grafana;安装 VictoriaLogs 数据源插件时, Grafana 版本必须满足插件要求。当前参考的 VictoriaLogs 数据源插件版本为 0.23.5, Grafana 版本必须满足 >= 10.4.0,不满足时请先参考 Grafana 12.1.2 升级步骤参考

部署 VictoriaLogs

  1. 准备安装目录

    mkdir -p /data/mdtemp
    cd /data/mdtemp
  2. 下载 VictoriaLogs 安装包

    wget https://pdpublic.mingdao.com/private-deployment/offline/common/victoria-logs-linux-amd64-v1.43.1.tar.gz
  3. 解压到安装目录

    mkdir /usr/local/victorialogs/
    tar xzvf victoria-logs-linux-amd64-v1.43.1.tar.gz -C /usr/local/victorialogs/
  4. 创建数据目录

    mkdir -p /data/victorialogs
  5. 写入环境变量文件

    cat > /usr/local/victorialogs/victorialogs.env <<'EOF'
    # VictoriaLogs 基础配置
    STORAGE_DATA_PATH=/data/victorialogs
    HTTP_LISTEN_ADDR=:9428
    HTTP_AUTH_USERNAME=myuser
    HTTP_AUTH_PASSWORD=mypassword

    # 数据保留策略
    RETENTION_PERIOD=30d
    RETENTION_DISK_USAGE=50GiB

    # 内存和并发控制
    MEMORY_ALLOWED_PERCENT=2
    MAX_CONCURRENT_INSERTS=4
    MAX_CONCURRENT_REQUESTS=2

    # 查询限制
    SEARCH_MAX_QUERY_DURATION=30s
    SEARCH_MAX_QUERY_TIMERANGE=24h
    SEARCH_MAX_QUEUE_DURATION=5s
    SEARCH_LOG_SLOW_QUERY_DURATION=3s

    # 写入保护
    INSERT_MAX_LINE_SIZE_BYTES=262144
    INSERT_MAX_FIELDS_PER_LINE=300

    # syslog 附加字段
    SYSLOG_EXTRA_FIELDS_TCP={"job":"rsyslog"}

    # 日志级别
    LOGGER_LEVEL=INFO
    EOF

    变量说明:

    • HTTP_AUTH_USERNAMEHTTP_AUTH_PASSWORD 用于 VictoriaLogs 的 Basic Auth 认证,建议按现场规范改成更复杂的用户名和密码,不要直接沿用示例值
    • RETENTION_PERIOD 用于设置日志保留时长,例如 30d 表示保留 30 天
    • RETENTION_DISK_USAGE 用于设置 VictoriaLogs 的磁盘占用上限,例如 50GiB 表示最多使用 50 GiB 磁盘空间
    • 如果日志量比较大,建议同时结合这两个参数一起调整,避免磁盘增长过快
  6. 写入 systemd 服务文件

    cat > /etc/systemd/system/victorialogs.service <<'EOF'
    [Unit]
    Description=VictoriaLogs Logging Service
    Wants=network-online.target
    After=network-online.target

    [Service]
    Type=simple
    EnvironmentFile=/usr/local/victorialogs/victorialogs.env
    Environment="GOMEMLIMIT=2GiB"
    WorkingDirectory=/usr/local/victorialogs
    ExecStart=/usr/local/victorialogs/victoria-logs-prod \
    -storageDataPath=${STORAGE_DATA_PATH} \
    -httpListenAddr=${HTTP_LISTEN_ADDR} \
    -retentionPeriod=${RETENTION_PERIOD} \
    -retention.maxDiskSpaceUsageBytes=${RETENTION_DISK_USAGE} \
    -memory.allowedPercent=${MEMORY_ALLOWED_PERCENT} \
    -maxConcurrentInserts=${MAX_CONCURRENT_INSERTS} \
    -search.maxConcurrentRequests=${MAX_CONCURRENT_REQUESTS} \
    -search.maxQueryDuration=${SEARCH_MAX_QUERY_DURATION} \
    -search.maxQueryTimeRange=${SEARCH_MAX_QUERY_TIMERANGE} \
    -search.maxQueueDuration=${SEARCH_MAX_QUEUE_DURATION} \
    -search.logSlowQueryDuration=${SEARCH_LOG_SLOW_QUERY_DURATION} \
    -insert.maxLineSizeBytes=${INSERT_MAX_LINE_SIZE_BYTES} \
    -insert.maxFieldsPerLine=${INSERT_MAX_FIELDS_PER_LINE} \
    -syslog.extraFields.tcp=${SYSLOG_EXTRA_FIELDS_TCP} \
    -httpAuth.username=${HTTP_AUTH_USERNAME} \
    -httpAuth.password=${HTTP_AUTH_PASSWORD} \
    -loggerLevel=${LOGGER_LEVEL}
    ExecStop=/usr/bin/kill $MAINPID
    Restart=on-failure
    LimitNOFILE=65536
    TasksMax=2048
    CPUAccounting=true
    CPUQuota=100%
    MemoryAccounting=true
    MemoryMax=2G
    MemoryLimit=2G
    MemorySwapMax=0
    StandardOutput=journal
    StandardError=journal

    [Install]
    WantedBy=multi-user.target
    EOF
  7. 启动 VictoriaLogs

    systemctl daemon-reload
    systemctl enable --now victorialogs
    systemctl status victorialogs --no-pager
    ss -lnt | grep '9428'
    curl -s http://localhost:9428/health

部署 Promtail

Promtail 需要部署在每一台 MongoDB 节点上,直接读取本机的 mongodb.log 并把慢查询日志推送到 VictoriaLogs。每个节点都要单独部署一份,采集本机日志, 这样才能保证慢查询日志来源和节点一一对应。

注意事项:

  • PROMTAIL_PUSH_URL 需要改成实际的 VictoriaLogs 地址
  • PROMTAIL_USERNAMEPROMTAIL_PASSWORD 需要改成 VictoriaLogs 的真实认证信息
  • PROMTAIL_JOB_NAME 需要在每台 MongoDB 节点上保持唯一,便于区分日志来源
  • PROMTAIL_LOG_PATH 需要改成当前节点上 MongoDB 日志文件的绝对路径
  • 如果每台 MongoDB 节点的日志路径不同,请分别调整对应配置
  1. 下载 Promtail

    wget https://pdpublic.mingdao.com/private-deployment/offline/common/promtail-linux-amd64.zip
  2. 解压安装

    mkdir /usr/local/promtail-vlogs
    unzip promtail-linux-amd64.zip -d /usr/local/promtail-vlogs/
  3. 写入配置文件

    cat > /usr/local/promtail-vlogs/promtail-config.yaml << 'EOF'
    server:
    # 监听端口
    http_listen_port: 9081
    # gRPC 服务监听端口,0 表示随机
    grpc_listen_port: 0
    # grpc 最大接收消息值,默认 4M
    grpc_server_max_recv_msg_size: 4194304
    # grpc 最大发送消息值,默认 4M
    grpc_server_max_send_msg_size: 4194304
    positions:
    # Promtail 保存文件位置,服务异常关闭后重启可从中断处继续采集
    filename: /usr/local/promtail-vlogs/positions.yaml
    clients:
    - url: "http://10.206.0.5:9428/insert/loki/api/v1/push" # 地址改为 victorialogs 地址
    basic_auth:
    username: "myuser" # 改为 victorialogs 的认证用户
    password: "mypassword" # 改为 victorialogs 的认证密码
    batchwait: 1s # 最长 1 s 发一批
    batchsize: 102400 # 单位字节,约 100 kB
    headers:
    X-Loki-Disable-Structured-Metadata: "true"
    scrape_configs:
    - job_name: mongodb
    static_configs:
    - targets:
    - localhost
    labels:
    job: mongodb-01 # 每个节点不要一样
    host: ${HOSTNAME}
    __path__: /data/logs/mongodb/mongodb.log # mongodb.log 绝对路径
    pipeline_stages:
    # 1. 拆 JSON
    - json:
    expressions:
    ts: t."$date"
    c: c
    msg: msg
    attr: attr
    # 2. 用日志自带时间戳
    - timestamp:
    source: ts
    format: RFC3339
    # 打 labels,供下面 match 调用
    - labels:
    c:
    msg:
    # 3. 只保留 COMMAND 且 msg=Slow query 的日志,初次部署可先注释掉这两条 drop 规则做验证
    - match:
    selector: '{c!="COMMAND"}'
    action: drop
    - match:
    selector: '{msg!="Slow query"}'
    action: drop
    # 4. 把 attr 下的字段提到顶层,方便 LogSQL 直接过滤
    - json:
    source: attr
    expressions:
    durationMillis: durationMillis
    ns: ns
    planSummary: planSummary
    docsExamined: docsExamined
    reslen: reslen
    # 5. 打 label 供页面展示,方便 LogSQL 直接过滤
    - labels:
    durationMillis:
    ns:
    planSummary:
    docsExamined:
    reslen:
    ts:
    attr:
    # 6. 定义 _msg
    - template:
    source: line
    destination: line
    template: >-
    - {
    "ns":"{{ .ns }}",
    "durationMillis":"{{ .durationMillis }}",
    "planSummary":"{{ .planSummary }}",
    "docsExamined":"{{ .docsExamined }}",
    "reslen":"{{ .reslen }}",
    "attr":"{{ .attr }}"
    }
    - output:
    source: line
    limits_config:
    readline_rate: 1000000 # 每秒读取字节数限制 1MB
    readline_burst: 2000000 # 突发读取字节数限制 2MB
    EOF
  4. 写入 positions 文件

    cat > /usr/local/promtail-vlogs/positions.yaml << 'EOF'
    positions: {}
    EOF
  5. 写入 systemd 服务文件

    cat > /etc/systemd/system/promtail-vlogs.service << 'EOF'
    [Unit]
    Description=promtail Logging Service
    After=network.target

    [Service]
    Type=simple
    # Go runtime 堆硬上限,即使 cgroup 识别失败也有效
    Environment="GOMEMLIMIT=1GiB"
    ExecStart=/usr/local/promtail-vlogs/promtail-linux-amd64 -config.file=/usr/local/promtail-vlogs/promtail-config.yaml -config.expand-env=true
    ExecStop=/usr/bin/kill -9 $MAINPID
    Restart=on-failure
    # CPU:1C 硬限制
    CPUAccounting=true
    CPUQuota=100%
    # 内存:1G 硬限制
    MemoryAccounting=true
    MemoryMax=1G
    MemoryLimit=1G
    MemorySwapMax=0
    LimitNOFILE=65536
    TasksMax=1024

    [Install]
    WantedBy=multi-user.target
    EOF
  6. 启动 Promtail

    systemctl daemon-reload
    systemctl enable --now promtail-vlogs
    sleep 1
    ss -lnt | grep '9081'
    curl -s http://127.0.0.1:9081/ready
    # 检查是否推送
    curl -s http://127.0.0.1:9081/metrics | egrep -i 'promtail_.*(client|sent|dropped|error|retry|targets)' | head -n 80

Grafana 配置

该方案不包含 Grafana,需要现场已有可用的 Grafana。 如果现场还没有 Grafana,请先完成 Grafana 的安装或升级,再继续下面步骤。 当前参考的 VictoriaLogs 数据源插件版本为 0.23.5,安装时 Grafana 版本必须满足 >= 10.4.0,不满足时请先参考 Grafana 12.1.2 升级步骤参考

  1. 安装 VictoriaLogs 数据源插件

    cd /data/mdtemp
    # Grafana >= 10.4.0,若不满足请先升级 Grafana
    wget https://pdpublic.mingdao.com/private-deployment/offline/common/victoriametrics-logs-datasource-v0.23.5.tar.gz
    tar xzvf victoriametrics-logs-datasource-v0.23.5.tar.gz -C /usr/local/grafana/data/plugins/
    systemctl restart grafana
  2. 配置数据源

    • url 填写 VictoriaLogs 地址,例如 http://127.0.0.1:9428
    • Basic auth 打开
    • User 填写 HTTP_AUTH_USERNAME
    • Password 填写 HTTP_AUTH_PASSWORD
    • Maximum lines 建议保持 2000000
  3. 导入慢查询面板

    这个面板文件已经准备好了,直接下载后导入 Grafana 即可。

    点击查看 / 下载面板 JSON
    • 面板文件:mongodb-VictoriaLogs-Slow-Query.json
    • 导入方式:在 Grafana 里点击 Import dashboard,然后上传这个文件
    • 导入完成后,请确认选择的是当前 VictoriaLogs 的数据源
    • 如果想先看看内容,也可以直接在浏览器里打开这个 JSON 文件
    下载面板 JSON
    在浏览器中打开 JSON 文件