VictoriaLogs + Alloy 二进制部署
如果你还没做 MongoDB 日志切割,请先看 MongoDB 日志切割。
该方案不包含 Grafana,需要现场提前准备好可用的 Grafana;安装 VictoriaLogs 数据源插件时,
Grafana 版本必须满足插件要求。当前参考的 VictoriaLogs 数据源插件版本为 0.32.0,
Grafana 版本必须满足 >= 10.4.0,不满足时请先参考 Grafana 升级步骤参考。
部署 VictoriaLogs
-
准备安装目录
mkdir -p /data/mdtempmkdir -p /usr/local/victorialogsmkdir -p /data/victorialogscd /data/mdtemp -
下载 VictoriaLogs 安装包
wget https://pdpublic.mingdao.com/private-deployment/offline/common/victoria-logs-linux-amd64-v1.52.0.tar.gz -
解压到安装目录
tar xzvf victoria-logs-linux-amd64-v1.52.0.tar.gz -C /usr/local/victorialogs/chmod +x /usr/local/victorialogs/victoria-logs-prod确认版本:
/usr/local/victorialogs/victoria-logs-prod --version预期包含版本
v1.52.0。 -
创建数据目录
mkdir -p /data/victorialogs -
写入环境变量文件
cat > /usr/local/victorialogs/victorialogs.env <<'EOF'# 数据目录STORAGE_DATA_PATH=/data/victorialogs# HTTP 监听端口HTTP_LISTEN_ADDR=:9428# Basic Auth,生产环境必须修改HTTP_AUTH_USERNAME=myuserHTTP_AUTH_PASSWORD=mypassword# 数据保留RETENTION_PERIOD=30dRETENTION_DISK_USAGE=50GiB# 内存和并发MEMORY_ALLOWED_BYTES=1GiBMAX_CONCURRENT_INSERTS=4MAX_CONCURRENT_REQUESTS=2# 查询限制SEARCH_MAX_QUERY_DURATION=30sSEARCH_MAX_QUERY_TIMERANGE=24hSEARCH_MAX_QUEUE_DURATION=5sSEARCH_LOG_SLOW_QUERY_DURATION=3s# 写入保护INSERT_MAX_LINE_SIZE_BYTES=262144INSERT_MAX_FIELDS_PER_LINE=300# 日志级别LOGGER_LEVEL=INFOEOF必须按现场修改:
HTTP_AUTH_USERNAMEHTTP_AUTH_PASSWORDRETENTION_PERIODRETENTION_DISK_USAGE -
写入 systemd 服务文件
cat > /etc/systemd/system/victorialogs.service <<'EOF'[Unit]Description=VictoriaLogs Logging ServiceWants=network-online.targetAfter=network-online.target[Service]Type=simpleEnvironmentFile=/usr/local/victorialogs/victorialogs.envEnvironment="GOMEMLIMIT=2GiB"WorkingDirectory=/usr/local/victorialogsExecStart=/usr/local/victorialogs/victoria-logs-prod \-storageDataPath=${STORAGE_DATA_PATH} \-httpListenAddr=${HTTP_LISTEN_ADDR} \-retentionPeriod=${RETENTION_PERIOD} \-retention.maxDiskSpaceUsageBytes=${RETENTION_DISK_USAGE} \-memory.allowedBytes=${MEMORY_ALLOWED_BYTES} \-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} \-httpAuth.username=${HTTP_AUTH_USERNAME} \-httpAuth.password=${HTTP_AUTH_PASSWORD} \-loggerLevel=${LOGGER_LEVEL}Restart=on-failureRestartSec=3sLimitNOFILE=65536TasksMax=2048CPUAccounting=trueCPUQuota=100%MemoryAccounting=trueMemoryMax=2GMemorySwapMax=0StandardOutput=journalStandardError=journal[Install]WantedBy=multi-user.targetEOF -
启动 VictoriaLogs
systemctl daemon-reloadsystemctl enable --now victorialogssystemctl status victorialogs --no-pagerss -lnt | grep '9428'curl -s -u 'myuser:mypassword' http://localhost:9428/healthjournalctl -u victorialogs -n 100 --no-pager
部署 Alloy
Alloy 需要部署在每一台 MongoDB 节点上,直接读取本机的 mongodb.log
并把慢查询日志推送到 VictoriaLogs。每个节点都要单独部署一份,采集本机日志,
这样才能保证慢查询日志来源和节点一一对应。
注意事项:
VICTORIALOGS_PUSH_URL需要改成实际的 VictoriaLogs 地址VICTORIALOGS_USERNAME和VICTORIALOGS_PASSWORD需要改成真实认证信息- Alloy 会自动使用本机 IPv4 作为
job标识,每个节点不需要手工修改节点名 MONGODB_LOG_PATH需要改成当前节点 MongoDB 日志文件的绝对路径/data/alloy-vlogs-data保存日志读取位置,不能随意删除,否则可能重复采集
-
确认 MongoDB 日志路径
ls -lh /data/logs/mongodb/mongodb.logtail -n 3 /data/logs/mongodb/mongodb.log -
创建 Alloy 安装目录
mkdir -p /data/mdtempmkdir -p /usr/local/alloy-vlogs/binmkdir -p /data/alloy-vlogs-datacd /data/mdtemp -
下载 Alloy 安装包
wget https://pdpublic.mingdao.com/private-deployment/offline/common/alloy-linux-amd64-v1.19.2.zip -
解压安装
unzip -o alloy-linux-amd64-v1.19.2.zip -d /data/mdtemp/mv -f /data/mdtemp/alloy-linux-amd64 /usr/local/alloy-vlogs/bin/alloychmod +x /usr/local/alloy-vlogs/bin/alloy/usr/local/alloy-vlogs/bin/alloy --version预期版本为
v1.19.2。 -
写入 Alloy 环境变量文件
cat > /usr/local/alloy-vlogs/alloy.env <<'EOF'# VictoriaLogs 地址,请修改为实际 IPVICTORIALOGS_PUSH_URL="http://VictoriaLogs_IP:9428/insert/loki/api/v1/push?preserve_json_keys=attr&_stream_fields=job,host&ignore_fields=filename"# VictoriaLogs Basic AuthVICTORIALOGS_USERNAME="myuser"VICTORIALOGS_PASSWORD="mypassword"# MongoDB 日志绝对路径MONGODB_LOG_PATH="/data/logs/mongodb/mongodb.log"EOFchmod 600 /usr/local/alloy-vlogs/alloy.env以下参数需要按现场修改:
VictoriaLogs_IPVICTORIALOGS_USERNAMEVICTORIALOGS_PASSWORDMONGODB_LOG_PATH -
写入 Alloy 配置文件
cat > /usr/local/alloy-vlogs/config.alloy <<'EOF'// ============================================================// Grafana Alloy// MongoDB Slow Query -> VictoriaLogs// ============================================================logging {level = "info"format = "logfmt"}// ============================================================// 1. 读取 MongoDB 日志// ============================================================loki.source.file "mongodb" {targets = [{__path__ = sys.env("MONGODB_LOG_PATH"),job = string.format("mongodb-%s", sys.env("HOST_IP")),host = constants.hostname,},]forward_to = [loki.process.mongodb.receiver,]}// ============================================================// 2. MongoDB Slow Query 处理// ============================================================loki.process "mongodb" {forward_to = [loki.write.victorialogs.receiver,]// 解析 MongoDB JSON 日志stage.json {expressions = {ts = "t.\"$date\"",severity = "s",c = "",msg = "",attr = "attr",durationMillis = "attr.durationMillis",ns = "attr.ns",planSummary = "attr.planSummary",docsExamined = "attr.docsExamined",reslen = "attr.reslen",}}// 使用 MongoDB 原始日志时间stage.timestamp {source = "ts"format = "RFC3339"}// c / msg 仅用于下面过滤stage.labels {values = {c = "",msg = "",}}// 只保留 c=COMMANDstage.match {selector = "{c!=\"COMMAND\"}"action = "drop"drop_counter_reason = "not_command"}// 只保留 msg=Slow querystage.match {selector = "{msg!=\"Slow query\"}"action = "drop"drop_counter_reason = "not_slow_query"}// 删除临时 labelstage.label_drop {values = ["c","msg",]}// MongoDB 日志级别转换stage.template {source = "level"template = `{{ if eq .severity "I" }}info{{ else if eq .severity "W" }}warn{{ else if eq .severity "E" }}error{{ else if eq .severity "F" }}critical{{ else if eq .severity "D" }}debug{{ else }}info{{ end }}`}stage.labels {values = {level = "",}}// 常用字段保留为 Structured Metadatastage.structured_metadata {values = {durationMillis = "",ns = "",planSummary = "",docsExamined = "",reslen = "",}}// Grafana Logs 面板展示内容stage.template {source = "display_msg"template = `{"ns": {{ toJson .ns }},"durationMillis": {{ toJson (printf "%v" .durationMillis) }},"planSummary": {{ toJson .planSummary }},"docsExamined": {{ toJson (printf "%v" .docsExamined) }},"reslen": {{ toJson (printf "%v" .reslen) }},"attr": {{ toJson (fromJson .attr) }}}`}// 最终发送给 VictoriaLogs 的 JSONstage.template {source = "vl_line"template = `{"_msg":{{ toJson .display_msg }},"ns":{{ toJson .ns }},"durationMillis":{{ toJson (printf "%v" .durationMillis) }},"planSummary":{{ toJson .planSummary }},"docsExamined":{{ toJson (printf "%v" .docsExamined) }},"reslen":{{ toJson (printf "%v" .reslen) }},"attr":{{ toJson (fromJson .attr) }}}`}stage.output {source = "vl_line"}}// ============================================================// 3. 发送到 VictoriaLogs// ============================================================loki.write "victorialogs" {endpoint {url = sys.env("VICTORIALOGS_PUSH_URL")batch_wait = "1s"batch_size = "100KiB"basic_auth {username = sys.env("VICTORIALOGS_USERNAME")password = sys.env("VICTORIALOGS_PASSWORD")}}}EOF -
校验 Alloy 配置
加载环境变量:
set -a. /usr/local/alloy-vlogs/alloy.envset +a临时生成本机 IP:
export HOST_IP="$(ip -4 route get 1.1.1.1 2>/dev/null \| sed -n 's/.* src \([^ ]*\).*/\1/p' \| head -n1)"确认环境变量:
echo "$HOST_IP"echo "$MONGODB_LOG_PATH"校验配置:
/usr/local/alloy-vlogs/bin/alloy validate \/usr/local/alloy-vlogs/config.alloy无报错后再继续。
-
写入 Alloy 启动脚本
cat > /usr/local/alloy-vlogs/bin/start-alloy.sh <<'EOF'#!/bin/sh# 根据默认 IPv4 路由自动获取服务器实际出口 IPHOST_IP=$(ip -4 route get 1.1.1.1 2>/dev/null \| sed -n 's/.* src \([^ ]*\).*/\1/p' \| head -n1)if [ -z "$HOST_IP" ]; thenecho "ERROR: failed to detect local IPv4 address"exit 1fiif [ -z "$MONGODB_LOG_PATH" ]; thenecho "ERROR: MONGODB_LOG_PATH is empty"exit 1fiif [ ! -r "$MONGODB_LOG_PATH" ]; thenecho "ERROR: MongoDB log is not readable: $MONGODB_LOG_PATH"exit 1fiexport HOST_IPecho "Alloy HOST_IP=${HOST_IP}"echo "MongoDB LOG=${MONGODB_LOG_PATH}"/usr/local/alloy-vlogs/bin/alloy validate \/usr/local/alloy-vlogs/config.alloy || exit 1exec /usr/local/alloy-vlogs/bin/alloy run \--server.http.listen-addr=127.0.0.1:9081 \--storage.path=/data/alloy-vlogs-data \/usr/local/alloy-vlogs/config.alloyEOF增加执行权限:
chmod +x /usr/local/alloy-vlogs/bin/start-alloy.sh验证自动 IP:
ip -4 route get 1.1.1.1只查看 IP:
ip -4 route get 1.1.1.1 \| sed -n 's/.* src \([^ ]*\).*/\1/p' -
写入 systemd 服务文件
cat > /etc/systemd/system/alloy-vlogs.service <<'EOF'[Unit]Description=Grafana Alloy VictoriaLogs CollectorWants=network-online.targetAfter=network-online.target[Service]Type=simpleEnvironmentFile=/usr/local/alloy-vlogs/alloy.envEnvironment="GOMEMLIMIT=768MiB"ExecStart=/usr/local/alloy-vlogs/bin/start-alloy.shRestart=on-failureRestartSec=3sCPUAccounting=trueCPUQuota=100%MemoryAccounting=trueMemoryMax=1GMemorySwapMax=0LimitNOFILE=65536TasksMax=1024StandardOutput=journalStandardError=journal[Install]WantedBy=multi-user.targetEOF -
启动 Alloy
systemctl daemon-reload
systemctl enable --now alloy-vlogs
查看状态:
systemctl status alloy-vlogs --no-pager
查看日志:
journalctl -u alloy-vlogs -n 50 --no-pager
应看到:
Alloy HOST_IP=<本机IP>
MongoDB LOG=/data/logs/mongodb/mongodb.log
- Alloy 健康检查
端口:
ss -lntp | grep ':9081'
Ready:
curl -s http://127.0.0.1:9081/-/ready
正常返回:
Alloy is ready.
Healthy:
curl -s http://127.0.0.1:9081/-/healthy
正常返回:
All Alloy components are healthy.
- 检查 Alloy 采集和发送
curl -s http://127.0.0.1:9081/-/healthy
journalctl -u alloy-vlogs -n 50 --no-pager
curl -s http://127.0.0.1:9081/metrics | egrep -i 'loki_.*(sent|dropped|error|retry|read)' | head -n 80
Grafana 配置
该方案不包含 Grafana,需要现场已有可用的 Grafana。 如果现场还没有 Grafana,请先完成 Grafana 的安装或升级,再继续下面步骤。 当前参考的 VictoriaLogs 数据源插件版本为
0.32.0,安装时 Grafana 版本必须满足>= 10.4.0,不满足时请先参考 Grafana 升级步骤参考。
-
安装 VictoriaLogs 数据源插件
cd /data/mdtemp# Grafana >= 10.4.0,若不满足请先升级 Grafanawget https://pdpublic.mingdao.com/private-deployment/offline/common/victoriametrics-logs-datasource-v0.32.0.tar.gztar xzvf victoriametrics-logs-datasource-v0.32.0.tar.gz -C /usr/local/grafana/data/plugins/systemctl restart grafana -
配置数据源
url填写 VictoriaLogs 地址,例如http://127.0.0.1:9428Basic auth打开User填写HTTP_AUTH_USERNAMEPassword填写HTTP_AUTH_PASSWORDMaximum lines建议保持2000000
-
导入慢查询面板
这个面板文件已经准备好了,直接下载后导入 Grafana 即可。
点击查看 / 下载面板 JSON
- 面板文件:
mongodb-VictoriaLogs-Slow-Query-v1.1.0.json - 导入方式:在 Grafana 里点击
Import dashboard,然后上传这个文件 - 导入完成后,请确认选择的是当前 VictoriaLogs 的数据源
- 如果想先看看内容,也可以直接在浏览器里打开这个 JSON 文件
在浏览器中打开 JSON 文件 - 面板文件: