5.7 KiB
Server A Redis 热路径、HEP 与指标 Runbook
适用范围:S20 在 Server A 上部署的 OpenSIPS Redis 热路径、HEP 发送、自定义指标和本地 Redis AUTH 代理。
部署结果
- OpenSIPS 继续监听
100.90.90.90:15060/udp,HEP 本地发送 socket 为100.90.90.90:9061/udp。 - 本地 Redis AUTH 代理监听
127.0.0.1:6380/tcp,上游连接 Server B Redis100.90.90.91:6379,凭据通过 systemd encrypted credential 加载,不写入明文配置。 - OpenSIPS Redis URL 由预处理器注入为本地代理地址。
- Lua 热路径脚本读取版本化配置:
cfg:active_versioncfg:v:{version}:auth:ip:{source_ip}cfg:v:{version}:customer_gateway:{id}cfg:v:{version}:customer:{id}cfg:v:{version}:customer_gateway:{id}:policies
- INVITE 会按 Lua 返回结果降级:
- Redis 不可用:
503 Redis Unavailable - 配置缺失:
503 Config Missing - 策略缺失:
503 No Route Policy - 策略允许但 S21/S28 路由未完成:
503 Routing Not Ready
- Redis 不可用:
- CDR 冒烟事件写入
stream:cdr_payload,S20 验证事件已清理。 - Prometheus 指标:
- OpenSIPS MI/Prometheus:
http://127.0.0.1:8888/metrics - Node Exporter textfile:
/var/lib/prometheus/node-exporter/lisglosips_s20.prom - Server B 抓取 A:
http://100.90.90.90:9100/metrics
- OpenSIPS MI/Prometheus:
关键文件
/etc/opensips/opensips.cfg/etc/opensips/lisglosips_hotpath.lua/usr/local/sbin/lisglosips-redis-auth-proxy/usr/local/sbin/lisglosips-redis-load-hotpath/usr/local/sbin/lisglosips-opensips-preprocess/usr/local/sbin/lisglosips-s20-metrics/etc/systemd/system/lisglosips-redis-auth-proxy.service/etc/systemd/system/lisglosips-redis-hotpath-load.service/etc/systemd/system/opensips.service.d/20-lisglosips-s20.conf/etc/systemd/system/lisglosips-s20-metrics.service/etc/systemd/system/lisglosips-s20-metrics.timer/etc/default/lisglosips-node-exporter/etc/nftables.d/lisglosips-s20-observability.nft/etc/systemd/system/lisglosips-a-firewall.service
仓库副本位于 infra/server-a/s20/。
服务检查
sudo systemctl is-system-running
sudo systemctl is-active opensips lisglosips-redis-auth-proxy lisglosips-s20-metrics.timer lisglosips-node-exporter lisglosips-a-firewall
sudo systemctl is-enabled opensips lisglosips-redis-auth-proxy lisglosips-redis-hotpath-load lisglosips-s20-metrics.timer lisglosips-node-exporter lisglosips-a-firewall
sudo ss -lntup | grep -E ':15060|:9061|:8888|:6380|:9100'
lisglosips-redis-hotpath-load.service 是 oneshot,执行成功后显示 inactive 属于正常状态;检查 systemctl show -p Result lisglosips-redis-hotpath-load.service 应为 success。
指标检查
curl -fsS http://127.0.0.1:8888/metrics | grep 'lisglosips_opensips_s20_'
cat /var/lib/prometheus/node-exporter/lisglosips_s20.prom
Server B 可抓取:
curl -fsS http://100.90.90.90:9100/metrics | grep -E 'lisglosips_(voip_rec|recording|redis_proxy|rtpengine)'
当前 S20 自定义指标包括:
lisglosips_opensips_s20_invite_totallisglosips_opensips_s20_hotpath_allow_totallisglosips_opensips_s20_hotpath_reject_totallisglosips_opensips_s20_redis_error_totallisglosips_opensips_s20_cdr_xadd_totallisglosips_opensips_s20_cdr_xadd_error_totallisglosips_redis_proxy_uplisglosips_voip_rec_tmpfs_byteslisglosips_recording_fileslisglosips_recording_oldest_ready_age_secondslisglosips_rtpengine_sessions
HEP 检查
A 侧确认无发送错误:
sudo journalctl -u opensips --since '10 minutes ago' --no-pager | grep -E 'Cannot send HEP|Failed to duplicate|S20'
B 侧确认 heplify 收包统计:
journalctl -u heplify-server --since '10 minutes ago' --no-pager | tail -n 80
S20 验证中曾因 HEP socket 绑定 127.0.0.1 触发发送错误,OpenSIPS 仍按预期返回 SIP 响应;配置修正为 100.90.90.90:9061 后,A 侧抓包看到 HEP 发往 B 100.90.90.91:9060,B heplify 统计显示 HEP 收包且 Error 为 0。
降级验证记录
- Redis 配置缺失:T 发 INVITE 后 A 返回
SIP/2.0 503 Config Missing,OpenSIPS 记录S20 hotpath reject reason=CONFIG_MISSING,CDR XADD 成功。 - Redis 代理不可用:短暂停止
lisglosips-redis-auth-proxy后,T 发 INVITE 返回SIP/2.0 503 Redis Unavailable,OpenSIPS 记录S20 Redis hotpath unavailable和S20 CDR XADD failed;随后启动代理并重新执行 Lua loader 恢复。 - HEP 发送异常:绑定错误期间 OpenSIPS 记录 HEP 发送失败,但 SIP 降级响应和 CDR 热路径继续执行;绑定修正后无新增 HEP 发送错误。
回滚
S20 初始备份目录:
/var/backups/lisglosips-s20/20260621T061900Z
后续验证阶段重启 OpenSIPS 前,也在该目录下的 post-verify/ 保存了当时的 /etc/opensips/opensips.cfg 副本。
回滚步骤:
-
停止 S20 新增服务:
sudo systemctl stop lisglosips-s20-metrics.timer lisglosips-s20-metrics.service sudo systemctl stop lisglosips-redis-auth-proxy.service -
从备份恢复
/etc/opensips/opensips.cfg、OpenSIPS drop-in、Node Exporter 默认文件和 S20 systemd/nftables 文件。 -
执行 OpenSIPS 语法检查:
sudo opensips -C -f /etc/opensips/opensips.cfg -
重载 systemd 并重启相关服务:
sudo systemctl daemon-reload sudo systemctl restart opensips sudo systemctl restart lisglosips-node-exporter sudo systemctl restart lisglosips-a-firewall -
验证
systemctl is-system-running、SIPOPTIONS、Node Exporter 和 nftables 表。
回滚不删除 Redis Stream 历史数据;如需清理测试事件,只按明确 Call-ID 精确 XDEL。