跳到主要内容

VictoriaLogs + Alloy Docker 版部署

前置说明

如果你还没做 MongoDB 日志切割,请先看 MongoDB 日志切割。 Docker 版已经内置 Grafana 和慢查询面板,部署完成后可直接使用。

前提条件​

  • 已安装 docker
  • 已安装 docker-compose

部署 VictoriaLogs + Grafana​

  1. 下载镜像

    docker pull registry.cn-hangzhou.aliyuncs.com/hap-mdy/hap-monitor-victorialogs-grafana-amd64:1.1.0
  2. 创建配置文件与数据目录

    mkdir -p /usr/local/victoria-logs-linux
    mkdir -p /data/victorialogs
    mkdir -p /data/grafana
  3. 创建配置文件

    cat > /usr/local/victoria-logs-linux/hap-monitor-logs.yaml << 'EOF'
    services:
    hap-monitor-logs:
    image: registry.cn-hangzhou.aliyuncs.com/hap-mdy/hap-monitor-victorialogs-grafana-amd64:1.1.0
    container_name: hap-monitor-logs
    restart: always
    ports:
    # VictoriaLogs API
    - "9428:9428"
    # Grafana
    - "3000:3000"
    # 持久化
    volumes:
    # VictoriaLogs 数据目录
    - /data/victorialogs:/data/victorialogs
    # Grafana 数据目录
    - /data/grafana:/usr/local/grafana/data
    environment:
    # VictoriaLogs HTTP Basic Auth;Alloy 写入时使用同一账号(生产环境必改)
    MONITOR_AUTH_USERNAME: myuser
    MONITOR_AUTH_PASSWORD: mypassword
    # 外部访问 URL(反向代理/子路径时修改)
    GRAFANA_SERVER_ROOT_URL: "%(protocol)s://%(domain)s:%(http_port)s/privatedeploy/mdy/monitor/victorialogs-grafana/"
    # 与 GRAFANA_SERVER_ROOT_URL 联动:URL 含子路径为 true,根路径为 false
    GRAFANA_SERVER_SERVE_FROM_SUB_PATH: "true"
    # Grafana管理员账号(生产环境必改)
    GRAFANA_ADMIN_USER: admin
    GRAFANA_ADMIN_PASSWORD: admin@123456
    # 资源限制
    mem_limit: 3g
    memswap_limit: 3g
    cpus: 2.0
    ulimits:
    nofile:
    soft: 102400
    hard: 102400
    # 日志
    logging:
    driver: json-file
    options:
    max-size: "100m"
    max-file: "3"
    EOF

启停服务​

# 启动
docker-compose -f /usr/local/victoria-logs-linux/hap-monitor-logs.yaml up -d

# 停止
docker-compose -f /usr/local/victoria-logs-linux/hap-monitor-logs.yaml down

# 查看状态
docker-compose -f /usr/local/victoria-logs-linux/hap-monitor-logs.yaml ps

# 查看日志
docker-compose -f /usr/local/victoria-logs-linux/hap-monitor-logs.yaml logs

变量说明​

以下变量均支持通过 Compose 的 environment 覆盖。标记为“Compose 已省略”的变量由 启动脚本提供默认值,只有需要调整默认行为时才需要显式配置。

认证与服务模式

变量Compose 状态默认值说明支持版本
MONITOR_AUTH_USERNAME / MONITOR_AUTH_PASSWORD保留,生产环境必改myuser / mypasswordVictoriaLogs 对外 Basic Auth 认证信息,同时供 Alloy 和 Grafana 数据源使用。1.1.0+
MONITOR_SERVICESCompose 已省略allall 启动 VictoriaLogs 和 Grafana;victorialogs 或 grafana 可单独启动;未配置或为空时按 all 处理。1.1.0+

Grafana

变量Compose 状态默认值说明支持版本
GRAFANA_ADMIN_USER / GRAFANA_ADMIN_PASSWORD保留,必须修改admin / admin@123456Grafana 管理员账号和密码。1.0.0+
GRAFANA_SERVER_ROOT_URL保留,按部署方式修改%(protocol)s://%(domain)s:%(http_port)s/privatedeploy/mdy/monitor/victorialogs-grafana/Grafana 对外访问地址。使用反向代理或子路径时,填写实际外部地址。1.0.0+
GRAFANA_SERVER_SERVE_FROM_SUB_PATH保留,需与 ROOT_URL 联动trueGRAFANA_SERVER_ROOT_URL 含子路径时设为 true;根路径访问时设为 false。1.0.0+
GRAFANA_ALLOW_UNSIGNED_PLUGINSCompose 已省略victoriametrics-logs-datasource启动脚本默认允许当前插件加载,通常无需修改;插件名称变化时再覆盖。1.0.0+
GRAFANA_VL_DATASOURCE_URLCompose 已省略http://127.0.0.1:9428Grafana 访问 VictoriaLogs 的地址。使用 MONITOR_SERVICES=grafana 时必须改为外部 VictoriaLogs 地址。1.0.0+

运行环境与存储

变量Compose 状态默认值说明支持版本
TZCompose 已省略Asia/Shanghai容器时区。由启动脚本设置,必要时可通过 Compose 覆盖。1.0.0+
GOMEMLIMITCompose 已省略2GiBGo 运行时内存上限。建议不超过 Compose 的 mem_limit。1.0.0+
VL_STORAGE_DATA_PATHCompose 已省略/data/victorialogsVictoriaLogs 数据目录。修改后必须同步修改 Compose 的 volumes 映射。1.0.0+
VL_HTTP_LISTEN_ADDRCompose 已省略:9428VictoriaLogs HTTP 监听地址。修改端口后必须同步修改 ports 和 Alloy 写入地址。1.0.0+

保留策略、并发与查询

变量Compose 状态默认值说明支持版本
VL_RETENTION_PERIODCompose 已省略30d日志最长保留时间。超过期限的数据会被清理。1.0.0+
VL_RETENTION_DISK_USAGECompose 已省略50GiBVictoriaLogs 数据目录允许使用的最大磁盘空间;与时间保留策略同时生效。1.0.0+
VL_MEMORY_ALLOWED_PERCENTCompose 已省略2VictoriaLogs 内存使用比例参数,单位为百分比。1.0.0+
VL_MAX_CONCURRENT_INSERTSCompose 已省略4最大并发写入请求数。调高后会增加 CPU、内存和磁盘压力。1.0.0+
VL_MAX_CONCURRENT_REQUESTSCompose 已省略2最大并发查询请求数。超过后进入等待队列。1.0.0+
VL_SEARCH_MAX_QUERY_DURATIONCompose 已省略30s单次查询最长执行时间,超时后终止查询。1.0.0+
VL_SEARCH_MAX_QUERY_TIMERANGECompose 已省略24h单次查询允许的最大时间范围。1.0.0+
VL_SEARCH_MAX_QUEUE_DURATIONCompose 已省略5s查询在并发队列中的最长等待时间。1.0.0+
VL_SEARCH_LOG_SLOW_QUERY_DURATIONCompose 已省略3s查询耗时达到该值时记录慢查询日志。1.0.0+

日志写入与日志级别

变量Compose 状态默认值说明支持版本
VL_INSERT_MAX_LINE_SIZE_BYTESCompose 已省略262144单条日志最大字节数,即 256 KiB;超出后拒绝写入。1.0.0+
VL_INSERT_MAX_FIELDS_PER_LINECompose 已省略300单条日志允许的最大字段数。1.0.0+
VL_SYSLOG_EXTRA_FIELDS_TCPCompose 已省略{"job":"rsyslog"}TCP Syslog 写入时附加的 JSON 字段。1.0.0+
VL_LOGGER_LEVELCompose 已省略INFOVictoriaLogs 日志级别。常用值:DEBUG、INFO、WARN、ERROR。1.0.0+

服务模式说明:

  • MONITOR_SERVICES=all:启动 VictoriaLogs 和 Grafana,适用于默认部署方式。
  • MONITOR_SERVICES=grafana:仅启动 Grafana,必须将 GRAFANA_VL_DATASOURCE_URL 配置为外部 VictoriaLogs 地址。
  • MONITOR_SERVICES=victorialogs:仅启动 VictoriaLogs,不启动 Grafana。

部署日志采集器 Alloy​

注意事项

Alloy 需要部署在每一台 MongoDB 节点上,直接读取本机的 mongodb.log 并把慢查询日志推送到 VictoriaLogs 。每个节点都要单独部署一份,采集本机日志。

注意事项:

  • VICTORIALOGS_IP:victorialogs 服务地址,需根据实际情况修改。
  • MONITOR_AUTH_USERNAME:VictoriaLogs 认证用户,需根据实际情况修改。
  • MONITOR_AUTH_PASSWORD:VictoriaLogs 认证密码,需根据实际情况修改。
  • VICTORIALOGS_PORT:victorialogs 服务端口,默认 9428。
  • MONGODB_SERVER_IP:MongoDB 所在服务器 IP,用于生成 mongodb-<IP> 唯一标识。
  • 日志挂载路径 /data/logs/mongodb/mongodb.log:/data/logs/mongodb/mongodb.log:ro 中,冒号左侧是服务器上的 MongoDB 日志文件,需根据实际情况修改。
  1. 下载 Alloy 镜像

    docker pull registry.cn-hangzhou.aliyuncs.com/hap-mdy/hap-alloy-vlogs-mongodb-amd64:1.0.0
  2. 创建配置文件与数据目录

    mkdir -p /usr/local/alloy-vlogs/ /data/alloy-data
  3. 创建 Alloy 配置文件

    cat > /usr/local/alloy-vlogs/alloy-vlogs-mongodb.yaml << 'EOF'
    services:
    alloy-vlogs-mongodb:
    image: registry.cn-hangzhou.aliyuncs.com/hap-mdy/hap-alloy-vlogs-mongodb-amd64:1.0.0
    container_name: alloy-vlogs-mongodb
    restart: always
    environment:
    # VictoriaLogs 地址
    VICTORIALOGS_IP: 10.206.0.5
    # VictoriaLogs 端口
    VICTORIALOGS_PORT: 9428
    # 使用 VictoriaLogs 认证信息
    MONITOR_AUTH_USERNAME: myuser
    MONITOR_AUTH_PASSWORD: mypassword
    # MongoDB 所在服务器 IP,用于生成 mongodb-<IP> 唯一标识
    MONGODB_SERVER_IP: 10.206.0.8
    volumes:
    - /data/logs/mongodb/mongodb.log:/data/logs/mongodb/mongodb.log:ro
    - /etc/hostname:/host/etc/hostname:ro
    - /etc/machine-id:/host/etc/machine-id:ro
    - /data/alloy-data:/usr/local/alloy-vlogs/data
    deploy:
    resources:
    limits:
    cpus: '1'
    memory: 1G
    EOF

启停服务​

# 启动
docker-compose -f /usr/local/alloy-vlogs/alloy-vlogs-mongodb.yaml up -d

# 停止
docker-compose -f /usr/local/alloy-vlogs/alloy-vlogs-mongodb.yaml down

# 查看状态
docker-compose -f /usr/local/alloy-vlogs/alloy-vlogs-mongodb.yaml ps

# 查看日志
docker-compose -f /usr/local/alloy-vlogs/alloy-vlogs-mongodb.yaml logs

变量说明​

部署时需要确认下面 5 项:

变量配置状态默认值示例用途
VICTORIALOGS_IP需要确认hap-monitor-logs10.206.0.5VictoriaLogs 地址;与 VictoriaLogs 使用同一 Compose 时可填写服务名。
VICTORIALOGS_PORT需要确认94289428VictoriaLogs HTTP 端口。
MONITOR_AUTH_USERNAME必填无myuserVictoriaLogs 认证用户名。
MONITOR_AUTH_PASSWORD必填无mypasswordVictoriaLogs 认证密码,生产环境必须修改。
MONGODB_SERVER_IP建议填写使用 machine-id 自动生成10.206.0.8生成唯一任务名,例如 mongodb-10.206.0.8。
  • 如果不填写 MONGODB_SERVER_IP 或 MONGODB_INSTANCE_ID,Compose 会只读挂载宿主机 /etc/machine-id,自动生成类似 mongodb-a1b2c3d4e5f6 的名称。虚拟机或服务器克隆后, 请确认 machine-id 已重新生成。

可选变量和默认值:

变量是否填写默认值用途
MONGODB_LOG_PATH否/data/logs/mongodb/mongodb.log容器内 MongoDB 日志路径,需与挂载目标一致。
MONGODB_JOB_NAME否自动生成手工指定唯一任务名时使用,建议以 mongodb- 开头。
MONGODB_INSTANCE_ID否空没有服务器 IP 时,指定稳定的实例标识。
MONGODB_HOSTNAME否自动读取宿主机 hostname仅用于展示,不作为唯一标识。
VICTORIALOGS_PUSH_URL不填写自动生成Alloy 写入 VictoriaLogs 的地址。

变量生效顺序为:宿主机环境变量 > --env-file 文件 > Compose 文件 > 启动脚本默认值。 未设置服务器 IP、实例标识和任务名时,启动脚本使用宿主机 /etc/machine-id 前 12 位生成唯一任务名。

镜像内置 Alloy 参数:

项目值说明
配置文件/usr/local/alloy-vlogs/config.alloy读取 MongoDB 日志、过滤慢查询并写入 VictoriaLogs。
程序路径/usr/local/alloy-vlogs/bin/alloyAlloy 可执行文件路径。
HTTP 监听地址0.0.0.0:9081管理和健康检查端口,Compose 默认不暴露。
状态目录/usr/local/alloy-vlogs/data保存文件读取位置,建议挂载宿主机目录持久化。

生成测试慢查询日志​

说明
  • 以下命令仅用于测试采集链路,会向 /data/logs/mongodb/mongodb.log 追加 15 条耗时大于 1000ms 的 MongoDB 慢查询日志。日志中的表 ID、数据库名、UUID 和签名均为脱敏示例;每条日志写入时使用当前 UTC 时间。
  • /data/logs/mongodb/mongodb.log 注意改为实际的日志路径

不依赖 Python,使用 Bash、date 和 cat。命令会随机生成 3 个表名,共写入 15 条日志; 每个表写入 5 条,每次写入间隔 1 秒,确保同一 ns 有多个时间点。

点击查看 Linux 测试脚本
sudo bash <<'BASH'
set -eu

LOG_FILE=/data/logs/mongodb/mongodb.log
mkdir -p "$(dirname "$LOG_FILE")"
touch "$LOG_FILE"

DURATIONS=(1250 2387 43146 1680 9021 1380 2670 5120 1940 8030 1560 3290 6840 2210 9470)
TABLE_IDS=(
"ws$(od -An -N12 -tx1 /dev/urandom | tr -d ' \n')"
"ws$(od -An -N12 -tx1 /dev/urandom | tr -d ' \n')"
"ws$(od -An -N12 -tx1 /dev/urandom | tr -d ' \n')"
)

for i in "${!DURATIONS[@]}"; do
now="$(date -u +%Y-%m-%dT%H:%M:%S.%3NZ)"
epoch="$(date +%s)"
uuid="$(cat /proc/sys/kernel/random/uuid)"
table_id="${TABLE_IDS[$((i % ${#TABLE_IDS[@]}))]}"
duration="${DURATIONS[$i]}"

cat >> "$LOG_FILE" <<EOF
{"t":{"\$date":"$now"},"s":"I","c":"COMMAND","id":51803,"ctx":"conn$((100+i+1))","msg":"Slow query","attr":{"command":{"\$clusterTime":{"clusterTime":{"\$timestamp":{"i":$((i+1)),"t":$epoch}},"signature":{"hash":{"\$binary":{"base64":"REDACTED","subType":"0"}},"keyId":1}},"\$db":"example_db","find":"$table_id","filter":{"status":1,"sys_lock":{"\$ne":true}},"limit":2000,"lsid":{"id":{"\$uuid":"$uuid"}},"sort":{"utime":-1}},"cursorExhausted":true,"docsExamined":1010000,"durationMillis":$duration,"keysExamined":1010000,"nreturned":0,"ns":"example_db.$table_id","numYields":4095,"planCacheKey":"demo$i","planSummary":"IXSCAN { utime: 1 }","protocol":"op_msg","queryHash":"demo_hash_$i","reslen":249,"type":"command"}}
EOF
sleep 1
done

echo "已写入 ${#DURATIONS[@]} 条测试慢查询日志:$LOG_FILE"
BASH

验证结果:

tail -n 5 /data/logs/mongodb/mongodb.log | jq -r '[.t["$date"], .attr.ns, .attr.durationMillis] | @tsv'

代理转发配置 Grafana​

注意事项
  • 将 192.168.1.10:3000 替换为实际的 Grafana 地址和端口。
  • 将 hap.domain.com:80 替换为实际的外部访问域名和端口,并同步修改 server_name。
  • 代理子路径需与 GRAFANA_SERVER_ROOT_URL 保持一致。
upstream grafana {
server 192.168.1.10:3000;
}

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
listen 80;
server_name hap.domain.com;
access_log /data/logs/weblogs/grafana.log main;
error_log /data/logs/weblogs/grafana.mingdao.net.error.log;

location /privatedeploy/mdy/monitor/victorialogs-grafana/ {
#allow 1.1.1.1;
#deny all;
proxy_hide_header X-Frame-Options;
proxy_set_header X-Frame-Options ALLOWALL;
proxy_set_header Host $http_host;
proxy_pass http://grafana;
proxy_redirect http://localhost:3000 http://hap.domain.com:80/privatedeploy/mdy/monitor/victorialogs-grafana;
}

location /privatedeploy/mdy/monitor/victorialogs-grafana/api/live {
rewrite ^/(.*) /$1 break;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $http_host;
proxy_pass http://grafana;
}
}

访问说明​

代理配置好后即可通过以下地址访问 Grafana 页面:

http://hap.domain.com/privatedeploy/mdy/monitor/victorialogs-grafana
  • 根据前面配置文件中 GRAFANA_ADMIN_USER 和 GRAFANA_ADMIN_PASSWORD 变量值获取
  • 账号:admin
  • 密码:admin@123456