Files
lisglosips/docs/SERVER_A_REDIS_HEP_METRICS_RUNBOOK.md
T

5.7 KiB
Raw Blame History

Server A Redis 热路径、HEP 与指标 Runbook

适用范围:S20 在 Server A 上部署的 OpenSIPS Redis 热路径、HEP 发送、自定义指标和本地 Redis AUTH 代理。

部署结果

  • OpenSIPS 继续监听 100.90.90.90:15060/udpHEP 本地发送 socket 为 100.90.90.90:9061/udp
  • 本地 Redis AUTH 代理监听 127.0.0.1:6380/tcp,上游连接 Server B Redis 100.90.90.91:6379,凭据通过 systemd encrypted credential 加载,不写入明文配置。
  • OpenSIPS Redis URL 由预处理器注入为本地代理地址。
  • Lua 热路径脚本读取版本化配置:
    • cfg:active_version
    • cfg: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
  • CDR 冒烟事件写入 stream:cdr_payloadS20 验证事件已清理。
  • Prometheus 指标:
    • OpenSIPS MI/Prometheushttp://127.0.0.1:8888/metrics
    • Node Exporter textfile/var/lib/prometheus/node-exporter/lisglosips_s20.prom
    • Server B 抓取 Ahttp://100.90.90.90:9100/metrics

关键文件

  • /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_total
  • lisglosips_opensips_s20_hotpath_allow_total
  • lisglosips_opensips_s20_hotpath_reject_total
  • lisglosips_opensips_s20_redis_error_total
  • lisglosips_opensips_s20_cdr_xadd_total
  • lisglosips_opensips_s20_cdr_xadd_error_total
  • lisglosips_redis_proxy_up
  • lisglosips_voip_rec_tmpfs_bytes
  • lisglosips_recording_files
  • lisglosips_recording_oldest_ready_age_seconds
  • lisglosips_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:9060B heplify 统计显示 HEP 收包且 Error 为 0。

降级验证记录

  • Redis 配置缺失:T 发 INVITE 后 A 返回 SIP/2.0 503 Config MissingOpenSIPS 记录 S20 hotpath reject reason=CONFIG_MISSINGCDR XADD 成功。
  • Redis 代理不可用:短暂停止 lisglosips-redis-auth-proxy 后,T 发 INVITE 返回 SIP/2.0 503 Redis UnavailableOpenSIPS 记录 S20 Redis hotpath unavailableS20 CDR XADD failed;随后启动代理并重新执行 Lua loader 恢复。
  • HEP 发送异常:绑定错误期间 OpenSIPS 记录 HEP 发送失败,但 SIP 降级响应和 CDR 热路径继续执行;绑定修正后无新增 HEP 发送错误。

回滚

S20 初始备份目录:

/var/backups/lisglosips-s20/20260621T061900Z

后续验证阶段重启 OpenSIPS 前,也在该目录下的 post-verify/ 保存了当时的 /etc/opensips/opensips.cfg 副本。

回滚步骤:

  1. 停止 S20 新增服务:

    sudo systemctl stop lisglosips-s20-metrics.timer lisglosips-s20-metrics.service
    sudo systemctl stop lisglosips-redis-auth-proxy.service
    
  2. 从备份恢复 /etc/opensips/opensips.cfg、OpenSIPS drop-in、Node Exporter 默认文件和 S20 systemd/nftables 文件。

  3. 执行 OpenSIPS 语法检查:

    sudo opensips -C -f /etc/opensips/opensips.cfg
    
  4. 重载 systemd 并重启相关服务:

    sudo systemctl daemon-reload
    sudo systemctl restart opensips
    sudo systemctl restart lisglosips-node-exporter
    sudo systemctl restart lisglosips-a-firewall
    
  5. 验证 systemctl is-system-running、SIP OPTIONS、Node Exporter 和 nftables 表。

回滚不删除 Redis Stream 历史数据;如需清理测试事件,只按明确 Call-ID 精确 XDEL