运行配额与机器绑定
授权中的并发访问 IP 与运行数量配额如何统计与拒绝、集群下的计数方式、客户端 IP 排查方法,以及机器绑定的匹配规则、宽限期与诊断。
概述
授权除有效期外,还可以包含两类约束:
- 运行配额:限制统计窗口内被「运行」的并发访问 IP 数和不同对象数。限的是运行,不是创建:可以任意新建、编辑、保存报表和大屏,设计器预览也不计入。
- 机器绑定:把授权绑定到部署环境的机器特征,防止把整套部署原样拷到别处使用。
这两项都由授权文件决定;授权里没有写的项,不受限制。授权的导入方法见 授权与许可。
运行配额
配额维度
| 维度 | 授权中的键 | 统计对象 | 单位 |
|---|---|---|---|
| 并发访问 IP | maxIp |
窗口内发起过运行访问的不同客户端 IP | 个 |
| 表格报表 | maxGrid |
窗口内运行过的不同表格报表(含移动端报表) | 张 |
| 单据模板 | maxDocument |
窗口内运行过的不同单据模板 | 个 |
| 仪表盘 | maxDashboard |
窗口内运行过的不同仪表盘 | 个 |
| 大屏 | maxDatawall |
窗口内运行过(在播)的不同大屏 | 块 |
某个维度的上限为 0、负数,或授权里没有该维度,都表示不限。
统计窗口
统计窗口由授权里的 windowSec 指定;授权没有指定时为 1800 秒(30 分钟)。窗口内,同一个 IP 或同一个报表只计一次;超过窗口没有再被访问,则退出统计。注册管理页的「运行数量」下方会写明当前窗口,如「30 分钟内打开运行过的不同对象数;新建、编辑、设计器预览不受限制」。
什么算一次运行
- 计入:查看、打印、导出等按已发布版本解析报表或大屏的访问,包括嵌入与分享链接访问。
- 不计入:新建、编辑、保存、设计器预览;草稿与历史版本的访问(属设计态)。
- 随系统发布的示例报表:其运行不占用配额,IP 与对象两个维度都不计。
超限时的行为
只拒绝新进入窗口的 IP 或对象。已在窗口内的照常运行并续窗。
被拒绝的请求返回 HTTP 403、业务码 42902,提示:「同时运行的<维度>数已达授权上限(N 单位)。已在运行的不受影响,请稍后再试或联系服务商调整授权。」
超限期间,系统对每个维度每分钟最多写一条审计日志,并注明期间另有多少次被拒,避免刷屏。
注意:统计设施出现故障(例如 Redis 不可达)时,系统选择放行并记录告警,不会因为计数故障把付费客户挡在外面。此时注册管理页的已用数显示为「—」。只有确认超限才会拒绝。
查看用量
- 「系统 > 注册管理」页的「并发访问」和「运行数量」显示「最多 N」与「当前 M」。
- 接口
GET /api/license/info返回的usage字段含窗口、各维度的上限与已用数,以及countingShared(计数是否跨节点共享)、clusterUnsafe(授权为集群拓扑却使用内存计数时为true)。 - 接口
GET /api/license/quota/detail?kind=ip返回该维度窗口内实际被计入的成员,最多 200 条。kind可取ip、grid、document、dashboard、datawall。以上接口均需管理员登录。
集群下的计数
配置项 sight-data.quota.store 决定计数后端:
| 取值 | 行为 |
|---|---|
local(默认) |
各节点在内存中各算各的,集群下实际放行量约为配额的节点数倍 |
redis |
使用 Redis,跨节点共享,需要集群模式已启用 |
配置为 redis 但 Redis 不可用时,程序退回内存计数并在日志中告警;取值无法识别时按 local 处理。设置示例:
JVM_OPTS="-Dsight-data.quota.store=redis" ./start.sh
并发 IP 统计不准的排查
| 现象 | 可能原因 | 处理 |
|---|---|---|
| 用户不多,却提示 IP 超限 | 用户经同一个出口(NAT)访问,实际是一个地址 | 用 quota/detail?kind=ip 查看被计入的 IP 列表 |
| 所有用户被算成同一个内网地址 | 反向代理没有传 X-Forwarded-For,或 trusted-proxy-hops 与实际代理层数不符 |
让反向代理传递 X-Forwarded-For,并把 sight-data.trial.trusted-proxy-hops 设为实际代理层数 |
| 集群下配额被放大 | 计数后端为 local |
设为 redis |
机器绑定
概念
授权可以带一组机器特征(授权里的白名单)。程序启动和刷新授权时,采集当前机器的特征,与白名单比对:
- 硬因子(难伪造):主板序列号(
board)、磁盘序列号(disk)、注入的机器指纹(fp,来自环境变量MR_MACHINE_FP)、集群标识(clusteruid,来自MR_CLUSTER_UID或 Kubernetes Pod 自动获取)、配置库实例身份(dbid)、安装目录(dir)。 - 软因子(可更改):网卡地址(
mac)、/etc/machine-id(machineid)、主机名(host)。
匹配规则:授权白名单与当前机器特征的交集数量不少于授权设定的最小匹配数(缺省为 2),并且默认要求交集中至少含一个硬因子。这样换网卡、加磁盘不会误判,只伪造软因子也无法通过。授权还可以指定某些类型必须命中。只暴露散列,不外泄原始序列号或 MAC。取不到的因子会被跳过。
授权里没有写入机器绑定信息时,直接放行,不做任何比对。
强制、观察与宽限期
| 配置项 | 说明 | 默认值 |
|---|---|---|
app.license.bind-enforce |
true 为强制:失配且超过宽限期后停用;false 为观察:只记录告警,不阻断 |
true |
app.license.bind-grace-days |
强制模式下确认失配后的宽限天数,给合法换机留出重新申请授权的时间 | 14 |
绑定状态(接口返回的 bindStatus):
| 取值 | 含义 | 影响 |
|---|---|---|
off |
授权未绑定机器 | 无 |
matched |
匹配 | 无 |
observe_mismatch |
观察模式下失配 | 只告警,不阻断 |
grace |
强制模式下失配,宽限期内 | 不阻断,bindGraceDaysLeft 给出剩余天数,日志提示重新申请授权 |
blocked |
强制模式下失配且已过宽限期 | 综合状态变为 machine_mismatch,报表运行被拒绝,提示 LICENSE_MACHINE_MISMATCH |
宽限期的起点保存在配置库中,重启不会重置;匹配恢复后清零。
诊断失配
管理员可调用 GET /api/license/diagnose,返回授权里绑定的因子与本机当前采集到的因子,按类型并排列出(只含散列),用于判断是哪一项对不上,例如安装目录(dir)变了还是磁盘(disk)变了。
容器与集群
- 容器重建后磁盘序列号、安装目录等可能变化。可以在部署侧注入稳定的
MR_MACHINE_FP,并用它生成带绑定的环境信息,见 容器化部署。 - 集群授权的白名单会包含各节点的特征。授权中指定「必须命中」的类型时,按类型判断:当前节点在该类型下命中列出的任一个即可,不要求每台机器同时出现全部特征。
- 从别处整套拷贝部署(同机另一目录、同机克隆配置库再起第二套、拷库到另一台机器),会因
dir、dbid、board、disk等特征变化而失配。
合法换机的处理
- 在新环境的「系统 > 注册管理」点击「获取环境信息」。
- 向服务商申请新的授权并导入。
- 在宽限期内完成。宽限期内业务不受影响。
注意事项
提示:
app.license.bind-enforce在当前版本默认值为true。历史签发、未写入绑定信息的授权不受此项影响。
提示:对存量环境升级前,可先将
-Dapp.license.bind-enforce=false设为观察模式,从日志确认失配情况后再决定是否强制。