VictoriaLogs + Promtail 二进制部署
前置说明
如果你还没做 MongoDB 日志切割,请先看 MongoDB 日志切割。
该方案不包含 Grafana,需要现场提前准备好可用的 Grafana;安 装 VictoriaLogs 数据源插件时,
Grafana 版本必须满足插件要求。当前参考的 VictoriaLogs 数据源插件版本为 0.23.5,
Grafana 版本必须满足 >= 10.4.0,不满足时请先参考 Grafana 12.1.2 升级步骤参考。
部署 VictoriaLogs
-
准备安装目录
mkdir -p /data/mdtempcd /data/mdtemp -
下载 VictoriaLogs 安装包
wget https://pdpublic.mingdao.com/private-deployment/offline/common/victoria-logs-linux-amd64-v1.43.1.tar.gz -
解压到安装目录
mkdir /usr/local/victorialogs/tar xzvf victoria-logs-linux-amd64-v1.43.1.tar.gz -C /usr/local/victorialogs/ -
创建数据目录
mkdir -p /data/victorialogs -
写入环境变量文件
cat > /usr/local/victorialogs/victorialogs.env <<'EOF'# VictoriaLogs 基础配置STORAGE_DATA_PATH=/data/victorialogsHTTP_LISTEN_ADDR=:9428HTTP_AUTH_USERNAME=myuserHTTP_AUTH_PASSWORD=mypassword# 数据保留策略RETENTION_PERIOD=30dRETENTION_DISK_USAGE=50GiB# 内存和并发控制MEMORY_ALLOWED_PERCENT=2MAX_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# syslog 附加字段SYSLOG_EXTRA_FIELDS_TCP={"job":"rsyslog"}# 日志级别LOGGER_LEVEL=INFOEOF变量说明:
HTTP_AUTH_USERNAME和HTTP_AUTH_PASSWORD用于 VictoriaLogs 的 Basic Auth 认证,建议按现场规范改成更复杂的用户名和密码,不要直接沿用示例值RETENTION_PERIOD用于设置日志保留时长,例如30d表示保留 30 天RETENTION_DISK_USAGE用于设置 VictoriaLogs 的磁盘占用上限,例如50GiB表示最多使用 50 GiB 磁盘空间- 如果日志量比较大,建议同时结合这两个参数一起调整,避免磁盘增长过快
-
写入 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.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 $MAINPIDRestart=on-failureLimitNOFILE=65536TasksMax=2048CPUAccounting=trueCPUQuota=100%MemoryAccounting=trueMemoryMax=2GMemoryLimit=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 http://localhost:9428/health
部署 Promtail
Promtail 需要部署在每一台 MongoDB 节点上,直接读取本机的 mongodb.log
并把慢查询日志推送到 VictoriaLogs。每个节点都要单独部署一份,采集本机日志,
这样才能保证慢查询日志来源和节点一一对应。
注意事项:
PROMTAIL_PUSH_URL需要改成实际的 VictoriaLogs 地址PROMTAIL_USERNAME和PROMTAIL_PASSWORD需要改成 VictoriaLogs 的真实认证信息PROMTAIL_JOB_NAME需要在每台 MongoDB 节点上保持唯一,便于区分日志来源PROMTAIL_LOG_PATH需要改成当前节点上 MongoDB 日志文件的绝对路径- 如果每台 MongoDB 节点的日志路径不同,请分别调整对应配置
-
下载 Promtail
wget https://pdpublic.mingdao.com/private-deployment/offline/common/promtail-linux-amd64.zip -
解压安装
mkdir /usr/local/promtail-vlogsunzip promtail-linux-amd64.zip -d /usr/local/promtail-vlogs/ -
写入配置文件
cat > /usr/local/promtail-vlogs/promtail-config.yaml << 'EOF'server:# 监听端口http_listen_port: 9081# gRPC 服务监听端口,0 表示随机grpc_listen_port: 0# grpc 最大接收消息值,默认 4Mgrpc_server_max_recv_msg_size: 4194304# grpc 最大发送消息值,默认 4Mgrpc_server_max_send_msg_size: 4194304positions:# Promtail 保存文件位置,服务异常关闭后重启可从中断处继续采集filename: /usr/local/promtail-vlogs/positions.yamlclients:- 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 kBheaders:X-Loki-Disable-Structured-Metadata: "true"scrape_configs:- job_name: mongodbstatic_configs:- targets:- localhostlabels:job: mongodb-01 # 每个节点不要一样host: ${HOSTNAME}__path__: /data/logs/mongodb/mongodb.log # mongodb.log 绝对路径pipeline_stages:# 1. 拆 JSON- json:expressions:ts: t."$date"c: cmsg: msgattr: attr# 2. 用日志自带时间戳- timestamp:source: tsformat: 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: attrexpressions:durationMillis: durationMillisns: nsplanSummary: planSummarydocsExamined: docsExaminedreslen: reslen# 5. 打 label 供页面展示,方便 LogSQL 直接过滤- labels:durationMillis:ns:planSummary:docsExamined:reslen:ts:attr:# 6. 定义 _msg- template:source: linedestination: linetemplate: >-- {"ns":"{{ .ns }}","durationMillis":"{{ .durationMillis }}","planSummary":"{{ .planSummary }}","docsExamined":"{{ .docsExamined }}","reslen":"{{ .reslen }}","attr":"{{ .attr }}"}- output:source: linelimits_config:readline_rate: 1000000 # 每秒读取字节数限制 1MBreadline_burst: 2000000 # 突发读取字节数限制 2MBEOF -
写入 positions 文件
cat > /usr/local/promtail-vlogs/positions.yaml << 'EOF'positions: {}EOF -
写入 systemd 服务文件
cat > /etc/systemd/system/promtail-vlogs.service << 'EOF'[Unit]Description=promtail Logging ServiceAfter=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=trueExecStop=/usr/bin/kill -9 $MAINPIDRestart=on-failure# CPU:1C 硬限制CPUAccounting=trueCPUQuota=100%# 内存:1G 硬限制MemoryAccounting=trueMemoryMax=1GMemoryLimit=1GMemorySwapMax=0LimitNOFILE=65536TasksMax=1024[Install]WantedBy=multi-user.targetEOF -
启动 Promtail
systemctl daemon-reloadsystemctl enable --now promtail-vlogssleep 1ss -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 升级步骤参考。
-
安装 VictoriaLogs 数据源插件
cd /data/mdtemp# Grafana >= 10.4.0,若不满足请先升级 Grafanawget https://pdpublic.mingdao.com/private-deployment/offline/common/victoriametrics-logs-datasource-v0.23.5.tar.gztar xzvf victoriametrics-logs-datasource-v0.23.5.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.json - 导入方式:在 Grafana 里点击
Import dashboard,然后上传这个文件 - 导入完成后,请确认选择的是当前 VictoriaLogs 的数据源
- 如果想先看看内容,也可以直接在浏览器里打开这个 JSON 文件
在浏览器中打开 JSON 文件 - 面板文件: