
Smokeping 支持 Standalone(单机)模式和 Master/Slave(主从)模式。
之前老苏折腾过单机模式,这次应网友 Roxmie 的要求,研究了一下主从模式的部署
文章传送门: 网络性能监控工具Smokeping
因为有了前文铺垫,本文的设置文件仅提到需要修改的部分。老苏不是网络专家,如果文中任何错误,请不吝指出
安装
在群晖上以 Docker 方式安装。
不过这次用到的镜像 ivyavanmahajan/smokeping有点老了,已经是 2 年之前的了,Tags 只有一个 latest

还有个 divyavanmahajan/smokeping-slave ,但实际上老苏没用这个镜像来做从服务,因为 ivyavanmahajan/smokeping 已经包含了 Slave 模式

从描述看,镜像是基于 linuxserver/smokeping 改造的,所以理论上你也可以基于最新的版本重新编译试试,能不能成功我就不知道了。
镜像老归老,并不影响使用,接下来进入今天的正题
环境变量
主服务容器只用到了 linuxserver 镜像最常用的 3 个变量
| 可变 | 值 | 
|---|---|
| TZ | 设为 Asia/Shanghai | 
| PUID | 设为 1000 | 
| PGID | 设为 1000 | 
从服务容器除了上面 3 个外,还用到下面👇几个
| 可变 | 值 | 
|---|---|
| NO_WEB | 设为 1,仅在没有HTTP服务器的情况下启动Smokeping。只收集数据,但不会显示数据。 | 
| SLAVE_SECRET | 从服务模式需要设置:共享密码 | 
| MASTER_URL | 从服务模式需要设置: 连接主服务器获取配置文件的 URL | 
要避免每次容器启动升级
Smokeping检测,可以加上-e NO_UPDATE=1,这样会加快了启动速度;
更多的环境变量可以看官方文档:https://github.com/divyavanmahajan/smokeping#parameters
主服务容器安装
# 新建文件夹 smokeping_ms 和 子目录
mkdir -p /volume2/docker/smokeping_ms/{cache,config,data}
# 进入 smokeping_ms 目录
cd /volume2/docker/smokeping_ms
   
# 运行主服务器
docker run -d \
  --restart unless-stopped \
  --name=smokeping-master \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Asia/Shanghai \
  -p 8580:80 \
  -v $(pwd)/config:/config \
  -v $(pwd)/data:/data \
  -v $(pwd)/cache:/cache \
  divyavanmahajan/smokeping
从服务容器安装
可以先装,也可以在主服务容器设置完成之后再安装
# 运行从服务器
docker run -d \
  --restart unless-stopped \
  --name=smokeping-slave \
  -h slave1 \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Asia/Shanghai \
  -e NO_WEB=1 \
  -e SLAVE_SECRET=12345678 \
  -e MASTER_URL=http://192.168.0.197:8580/smokeping/smokeping.cgi \
  divyavanmahajan/smokeping
老苏的群晖主机 IP 为 192.168.0.197,如果反代了,这里改域名
主服务容器设置
访问权限
首先要处理权限问题,否则你会在从服务器的日志中看到下面的错误
WARNING: Opening secrets file /etc/smokeping/smokeping_secrets: Permission denied
Sent data to Server. Server said WARNING: Opening secrets file /etc/smokeping/smokeping_secrets: Permission denied
这需要我们进入到主服务容器中去修改权限
# 以 root 身份进入主服务容器
docker exec -it --user root smokeping-master /bin/bash
# 修改权限
chown 1000:1000 /etc/smokeping/smokeping_secrets
原本的 root:root 会变成 abc:user

连接凭证
接下来需要处理从服务器连接主服务器时,要用到的凭证,否则你会在从服务器的日志中看到下面的错误
WARNING: No secret found for slave slave1
Sent data to Server. Server said WARNING: No secret found for slave slave1
ERROR: we did not get config from the master. Maybe we are not configured as a slave for any of the targets on the master ?
查看 /etc/smokeping/smokeping_secrets 中的密码
# 查看 /etc/smokeping/smokeping_secrets 中的密码
cat /etc/smokeping/smokeping_secrets

我们可以用原有的,也可以加一组账号密码,比如 slave1:12345678
# 追加账号、密码
echo 'slave1:12345678'>>/etc/smokeping/smokeping_secrets

现在从服务容器日志应该变成下面👇这样了
WARNING: I don't know the slave slave1 ignoring it
Sent data to Server. Server said WARNING: I don't know the slave slave1 ignoring it
ERROR: we did not get config from the master. Maybe we are not configured as a slave for any of the targets on the master ?
Slaves 文件
在 config/Slaves 中,新增下面部分
location加不加无所谓的
+slave1
display_name=slave1
color=00ff00
location=Shanghai

Target 文件
在 config/Target 中,新增下面部分
上海联通和上海移动的地址可能不对,一直没数据。应用的时候需要自己改改,这里只是个示意;
slaves = slave1 slave2
+dest1
slaves = slave1
menu = slave1
title = slave1
++ sh-dianxing
menu = 上海电信
title = 上海电信
host = 116.228.111.118
alerts = rttdetect,lossdetect
++ sh-liantong
menu = 上海联通
title = 上海联通
host = 210.22.84.3
alerts = rttdetect,lossdetect
++ sh-yidong
menu = 上海移动
title = 上海移动
host = 117.131.19.23
alerts = rttdetect,lossdetect

Alerts 文件
还需要在 config/Alerts 中,新增 rttdetect 和 lossdetect,其他的看提示吧
+rttdetect
type = rtt
pattern = <20,<20,<20,<20,<20,>20,>20,>20
comment = 连续3次延时20以上
+lossdetect
type = loss
pattern = ==0%,==0%,==0%,==0%,==0%,>0%,>0%,>0%
comment = 突然有丢包
重启主服务容器
改完上述几个设置文件之后,可能会需要重启主服务容器,以便让设置生效

这个时候,从服务容器日志中会显示主服务关闭了连接
WARNING Master said 500 Server closed connection without sending any data back
当主服务容器正常启动后,就应该可以正常收到数据了
Sending to server:
/dest1/sh-yidong	1676036574	U:20:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U
/dest1/sh-dianxing	1676036574	U:0:3.2800000000e-03:2.1200000000e-03:2.6800000000e-03:3.0500000000e-03:3.0600000000e-03:3.1100000000e-03:3.1500000000e-03:3.1900000000e-03:3.2000000000e-03:3.2600000000e-03:3.2600000000e-03:3.2800000000e-03:3.3600000000e-03:3.4300000000e-03:3.4900000000e-03:3.5000000000e-03:3.5800000000e-03:3.6000000000e-03:3.6300000000e-03:3.6600000000e-03:4.0300000000e-03
/dest1/sh-liantong	1676036574	U:20:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U
Sent data to Server. Server said OK
运行
在浏览器中输入 http://群晖IP:8580 就能看到 slave1 传来的数据

刚开始数据还比较少

第二天就不一样了

注意事项
Smokeping 反代存在截端口现象,例如老苏反代后通过 https://smokeping.laosu.ml:444 访问,但是会跳转到 https://smokeping.laosu.ml/smokeping/ ,从而导致访问失败
如果你和老苏一样用 npm 反代,可以在 npm 的 Advance 中加入下面的代码
   location / {  
       proxy_set_header Host $host:444;  
       proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;  
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Forwarded-Protocol $scheme;
       proxy_pass  http://192.168.0.197:8580;  
       proxy_redirect http:// https://;  
   }
这段代码,你可以在老苏的博客搜索 截端口 找到,已经在多篇文章中使用了
参考文档
divyavanmahajan/smokeping: Smokeping extensions to Linuxserver Smokeping
地址:https://github.com/divyavanmahajan/smokeping
divyavanmahajan/smokeping - Docker Image | Docker Hub
地址:https://hub.docker.com/r/divyavanmahajan/smokeping
Problems with slave config on ubuntu · Issue #46 · oetiker/SmokePing
地址:https://github.com/oetiker/SmokePing/issues/46
SmokePing - smokeping_master_slave
地址:https://oss.oetiker.ch/smokeping/doc/smokeping_master_slave.en.html



















