在开始配置前,必须明确需要留存哪些数据。以下四类是故障排查与性能分析的核心,必须全部覆盖。
这些数据反映了服务器的整体健康状态。
这是定位业务问题的直接依据。
用于满足合规要求和安全事件追溯。
用于系统回滚和一致性比对。
我们将使用 Prometheus + Grafana + Loki 组合作为技术栈,实现指标和日志的采集、存储与可视化。
在被监控服务器上安装 Node Exporter 来暴露系统指标。
下载并运行 Node Exporter:
下载最新版本(请访问 https://prometheus.io/download/ 确认版本号)
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
解压
tar xvf node_exporter-1.6.1.linux-amd64.tar.gz
cd node_exporter-1.6.1.linux-amd64/
以后台服务方式启动
sudo ./node_exporter &
验证 Node Exporter 是否工作,访问 http://你的服务器IP:9100/metrics,应能看到大量以 `node_` 开头的指标。
接着,在监控服务器上安装和配置 Prometheus 来抓取这些数据。
下载 Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz
tar xvf prometheus-2.47.0.linux-amd64.tar.gz
cd prometheus-2.47.0.linux-amd64/
编辑配置文件 `prometheus.yml`,添加你的目标服务器:
在 scrape_configs: 部分添加以下配置
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['服务器1_IP:9100', '服务器2_IP:9100'] 替换为你的实际IP和端口
启动 Prometheus:
sudo ./prometheus --config.file=prometheus.yml &
Loki 负责存储日志,Promtail 负责采集并发送给 Loki。
首先在监控服务器上安装 Loki。创建配置文件 `loki-config.yaml`:
auth_enabled: false
server:
http_listen_port: 3100
ingester:
lifecycler:
address: 127.0.0.1
ring:
kvstore:
store: inmemory
replication_factor: 1
final_sleep: 0s
chunk_idle_period: 5m
chunk_retain_period: 30s
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /tmp/loki/boltdb-shipper-active
cache_location: /tmp/loki/boltdb-shipper-cache
shared_store: filesystem
filesystem:
directory: /tmp/loki/chunks
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
chunk_store_config:
max_look_back_period: 0s
table_manager:
retention_deletes_enabled: false
retention_period: 0s
使用 Docker 运行 Loki(确保服务器已安装 Docker):
docker run -d --name loki -v $(pwd)/loki-config.yaml:/mnt/config/loki-config.yaml -p 3100:3100 grafana/loki:2.9.0 --config.file=/mnt/config/loki-config.yaml
在每一台需要采集日志的服务器上安装 Promtail。创建配置文件 `promtail-config.yaml`:
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://监控服务器IP:3100/loki/api/v1/push 替换为你的Loki服务器IP
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/log
- targets:
- localhost
labels:
job: nginx
__path__: /var/log/nginx/log 如果你的应用日志在其他路径,请修改此处
使用 Docker 运行 Promtail:

docker run -d --name promtail -v $(pwd)/promtail-config.yaml:/mnt/config/promtail-config.yaml -v /var/log:/var/log --link loki grafana/promtail:2.9.0 --config.file=/mnt/config/promtail-config.yaml
在监控服务器上安装 Grafana:
对于 Ubuntu/Debian
sudo apt-get install -y adduser libfontconfig1 musl
wget https://dl.grafana.com/oss/release/grafana_10.1.5_amd64.deb
sudo dpkg -i grafana_10.1.5_amd64.deb
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
访问 http://监控服务器IP:3000,默认用户名和密码为 admin/admin。首次登录会要求修改密码。
添加数据源: 1. 点击左侧齿轮图标进入 Configuration -> Data Sources。 2. 点击 Add data source。 3. 选择 Prometheus,在 URL 栏填写 `http://localhost:9090`(即Prometheus地址),点击 Save & Test。 4. 再次点击 Add data source,选择 Loki,在 URL 栏填写 `http://localhost:3100`,点击 Save & Test。
仅有采集不够,必须确保数据长期留存并在异常时及时告警。
Prometheus 本地存储不适合长期数据。配置它远程写入到对象存储(如 MinIO)或远程端点。
编辑 `prometheus.yml`,添加远程写入配置:
remote_write:
- url: "http://你的远程存储网关地址/api/v1/write"
queue_config:
max_samples_per_send: 1000
capacity: 10000
max_shards: 200
如果你使用 Thanos 或 Cortex 等长期存储方案,其端点即为这里的 URL。
编辑之前创建的 `loki-config.yaml`,修改以下部分以启用和设置留存周期:
将原有的 limits_config 和 table_manager 部分替换或修改为:
limits_config:
retention_period: 720h 日志保留30天 (2430=720小时)
其他配置...
table_manager:
retention_deletes_enabled: true 启用自动删除
retention_period: 720h 与上面保持一致
重启 Loki 容器使配置生效:
docker restart loki
在 Prometheus 配置目录下创建 `alert_rules.yml` 文件:
groups:
- name: server_alerts
rules:
- alert: HighCpuUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) 100) > 85
for: 5m
labels:
severity: warning
annotations:
summary: "高CPU使用率 (实例 {{ $labels.instance }})"
description: "CPU使用率持续5分钟高于85%,当前值为 {{ $value }}%"
- alert: HighMemoryUsage
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes 100 > 90
for: 5m
labels:
severity: warning
annotations:
summary: "高内存使用率 (实例 {{ $labels.instance }})"
description: "内存使用率持续5分钟高于90%,当前值为 {{ $value }}%"
- alert: DiskWillFillIn4Hours
expr: predict_linear(node_filesystem_free_bytes{job="node"}[6h], 43600) < 0
for: 5m
labels:
severity: critical
annotations:
summary: "磁盘将在4小时内写满 (实例 {{ $labels.instance }}, 挂载点 {{ $labels.mountpoint }})"
description: "基于过去6小时的增长趋势,预测该磁盘将在4小时内写满。"
在 `prometheus.yml` 中引用此告警规则文件:
rule_files:
- "alert_rules.yml"
配置 Alertmanager(需单独安装)来接收这些告警并通过邮件、钉钉、企业微信等渠道发送。这里以邮件为例,创建 `alertmanager.yml`:
global:
smtp_smarthost: 'smtp.你的邮箱服务商.com:587' 如 smtp.qq.com:587
smtp_from: '你的发件邮箱@xxx.com'
smtp_auth_username: '你的发件邮箱@xxx.com'
smtp_auth_password: '你的邮箱授权码' 注意不是登录密码,是SMTP授权码
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'email-notifications'
receivers:
- name: 'email-notifications'
email_configs:
- to: '接收告警的邮箱@xxx.com'
send_resolved: true 问题恢复时也发送邮件
启动 Alertmanager 并确保 Prometheus 配置中指向它。
编写一个 Shell 脚本,定期收集配置和状态,并归档到指定目录。
创建脚本 `/opt/scripts/collect_snapshot.sh`:
!/bin/bash
定义备份目录和日期
BACKUP_DIR="/var/backups/server_snapshot"
DATE=$(date +%Y%m%d_%H%M%S)
SNAPSHOT_DIR="$BACKUP_DIR/snapshot_$DATE"
mkdir -p $SNAPSHOT_DIR
1. 收集关键配置文件
echo "收集配置文件中..."
cp -r /etc/nginx $SNAPSHOT_DIR/ 2>/dev/null || true
cp -r /etc/mysql $SNAPSHOT_DIR/ 2>/dev/null || true
cp /etc/hosts $SNAPSHOT_DIR/
cp /etc/resolv.conf $SNAPSHOT_DIR/
cp /etc/fstab $SNAPSHOT_DIR/
根据你的服务添加更多配置文件
2. 收集系统状态信息
echo "收集系统状态中..."
ps aux > $SNAPSHOT_DIR/ps_aux.txt
ss -tlnp > $SNAPSHOT_DIR/ss_tlnp.txt
df -h > $SNAPSHOT_DIR/df_h.txt
free -h > $SNAPSHOT_DIR/free_h.txt
systemctl list-units --type=service --state=running > $SNAPSHOT_DIR/running_services.txt
3. 收集软件包列表
echo "收集软件包列表中..."
if [ -f /etc/redhat-release ]; then
rpm -qa > $SNAPSHOT_DIR/rpm_qa.txt
elif [ -f /etc/debian_version ]; then
dpkg -l > $SNAPSHOT_DIR/dpkg_l.txt
fi
4. 打包并清理旧备份(保留最近30天)
echo "打包快照..."
cd $BACKUP_DIR
tar -czf snapshot_$DATE.tar.gz snapshot_$DATE/
rm -rf $SNAPSHOT_DIR
删除30天前的备份
find $BACKUP_DIR -name "snapshot_.tar.gz" -mtime +30 -delete
echo "快照收集完成: $BACKUP_DIR/snapshot_$DATE.tar.gz"
给脚本添加执行权限并设置每日凌晨3点自动执行:
chmod +x /opt/scripts/collect_snapshot.sh
编辑crontab
(crontab -l 2>/dev/null; echo "0 3 /opt/scripts/collect_snapshot.sh") | crontab -
部署完成后,请逐项核对:
至此,一个包含指标、日志、配置快照的完整服务器运维数据留存体系已部署完毕。所有组件均采用开源方案,配置细节完整,可直接复制使用。后续只需根据业务增长,按此架构水平扩展监控节点即可。
上一篇: 服务器运维脚本:别让重复操作拖垮你的效率
下一篇: 服务器站点上线前必备的完整测试流程详解
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图