Files
ai-security-xdr/haobang-security-dm/upgrade-doc/v4/README.md
T
王绍宏 8173c2ff3f perf(syslog): 统计异步化并按采样保留率自适应调整业务批量
- 入口统计改用独立 Kafka 消费组,移除主消费同步统计写库
- DIRECT 模式入库计数改为事务提交后异步投递,取消事实事务内统计 Outbox 写入
- 采样审计、告警分钟桶通知改为后台处理,异常不阻断主消费或回滚告警
- RAW 基础业务批量默认 500,按保留率动态扩大,上限 3000
- 限制业务块字节数及规则任务数量,保留告警全量处理和整次 poll 完成后提交
- 细化 SLOW_SYSLOG_BATCH,补充批次关联、线程排队、数据库执行及提交耗时
- 更新 v4 升级说明,明确异步统计损失风险及现场验证方法

验证:JDK 8 构建成功,232 项测试通过。
升级:复用现有表和 Kafka Topic,无新增建表或建 Topic 脚本要求。
2026-09-13 06:11:12 +08:00

128 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# v4 积压分级采样与告警优先升级说明
## 升级范围
v4 只升级 `syslog-consumer-rule` 和达梦数据库,不修改 `syslog-serve`,也不新增 Kafka Topic。
后续吞吐优化(独立入口统计、事实计数/审计/分钟桶异步化、RAW底层poll上限3000/业务基础500自适应、精细慢批次日志)见
[吞吐优化升级配置与验证](./config/02-throughput-upgrade.md)。已完成v4表升级的现场应用此补丁无需新增DDL。
本次升级包含:
- 根据消息 `receive_time` 与当前时间的差值,对积压消息分级采样;
- `syslog_normal_alarm` 始终全量保留,并在 InfluxDB 原文、普通表和非标表之前单独提交;
- 未被保留的 `syslog_normal_data`、`syslog_non_normal_message` 及对应原文不写入存储;
- 按消息来源小时、Topic、Partition、策略版本和实际保留率记录采样审计;
- 最新吞吐补丁采用消费优先:审计后台尽力写入,失败不取消采样;分钟桶提交后后台重试,可能丢通知,详见上述文档;
- InfluxDB 原文写入变为非关键旁路,启动检查或运行时写入失败只记录并继续主消费。
## 文件与执行顺序
| 顺序 | 文件 | 作用 |
| --- | --- | --- |
| 1 | `database/01-backlog-sampling-precheck.sql` | 只读检查目标表、约束和索引是否已经存在 |
| 2 | `database/02-backlog-sampling-upgrade.sql` | 创建积压采样小时审计表,仅执行一次 |
| 3 | `database/03-backlog-sampling-verify.sql` | 只读验证表结构,并查看实际保留情况 |
| 4 | `config/01-new-environment-variables.md` | 核对新增配置,再替换 `syslog-consumer-rule` JAR |
数据库脚本必须使用 `syslog-consumer-rule` 实际连接的达梦用户执行。
## 第一步:升级达梦
先执行:
```text
database/01-backlog-sampling-precheck.sql
```
- 如果目标表、约束和索引都不存在,执行 `02-backlog-sampling-upgrade.sql`,再执行
`03-backlog-sampling-verify.sql`;
- 如果目标表已经存在,不要重复执行 `02`,直接执行 `03` 核对结构;
- 如果只存在部分对象,先停止升级并确认此前执行到哪一步,不要盲目重跑建表脚本。
`03` 验证应满足:
- 返回 `SYSLOG_BACKLOG_RETENTION_HOURLY` 一张表;
- 表包含 22 个字段;
- 主键和保留率检查约束状态为 `ENABLED`;
- 更新时间索引状态为 `VALID`。
## 第二步:配置并升级应用
按 [新增变量配置清单](./config/01-new-environment-variables.md) 核对配置,然后替换并重启
`syslog-consumer-rule`。只替换 JAR、不增加环境变量时,积压采样也会按 JAR 内置默认值开启,因此必须先
完成数据库升级。
默认策略如下:
| 消息延迟 | 普通记录保留率 | 非标记录保留率 |
| --- | ---: | ---: |
| 不大于 15 分钟 | 100% | 100% |
| 大于 15、且小于 19.5 分钟 | 100% | 100% |
| 19.5~小于 24 分钟 | 91% | 92% |
| 24~小于 28.5 分钟 | 82% | 84% |
| 28.5~小于 33 分钟 | 73% | 76% |
| 33~小于 37.5 分钟 | 64% | 68% |
| 37.5~小于 42 分钟 | 55% | 60% |
| 42~小于 46.5 分钟 | 46% | 52% |
| 46.5~小于 51 分钟 | 37% | 44% |
| 51~小于 55.5 分钟 | 28% | 36% |
| 55.5~小于 60 分钟 | 19% | 28% |
| 不小于 60 分钟 | 10% | 20% |
默认前 15 分钟为免采样窗口。之后使用 `(60 分钟 - 15 分钟)÷ 10 = 4.5 分钟` 的阶梯宽度;
达到 1 小时才使用最低保留率。
采样采用 `event_id` 的确定性哈希:同一策略版本下,同一消息重复处理时选择结果一致。规则计算始终执行,
只有完成规则计算、确认是否产生告警并成功写入小时审计后,才执行丢弃。
## 写入顺序与故障行为
每个批次按以下顺序处理:
1. 完整规则计算并提交采样审计;
2. 单独提交全部 `syslog_normal_alarm`;
3. 写入被保留消息的 InfluxDB 原文;
4. 写入被保留的 `syslog_normal_data` 和 `syslog_non_normal_message`。
InfluxDB 原文写入默认单次网络阶段最多等待 5 秒;发生依赖故障后,30 秒内快速跳过后续原文请求。启动
健康检查失败、写入失败以及特殊 DLT 写入失败都只记录日志,不阻塞 Kafka 主消费进度。
## 升级后验证
查看消费和异常日志:
```bash
docker logs --since 10m syslog-consumer-rule-dm 2>&1 \
| grep -E 'Syslog批次完成|BACKLOG_SAMPLING|INFLUX_RAW_BYPASS|SYSLOG_CONTINUITY_LOSS' \
| tail -100
```
查看运行状态:
```text
GET /xdrrule/api/syslog/backlog-sampling/status
GET /xdrrule/api/syslog/raw-storage/metrics
```
然后执行 `database/03-backlog-sampling-verify.sql` 的最后一段查询。没有延迟消息时,审计查询为空属于正常;
发生积压后,应能按来源小时看到告警保存数、普通/非标实际保留率和原文丢弃数。
重点确认:
- `alarm_rows_saved` 始终等于 `alarm_rows_total`;
- `audit_write_failures_total` 和 `audit_fallback_messages_total` 不持续增加;
- InfluxDB 故障时 Kafka offset 仍继续推进,告警和达梦保留数据仍持续写入;
- `raw_write_bypassed_messages_total` 增加表示原文旁路失败,不表示主消费停止。
## 回滚
紧急关闭采样可配置:
```yaml
- SYSLOG_BACKLOG_SAMPLING_ENABLED=false
```
重建 `syslog-consumer-rule` 容器后,普通、非标及原文恢复全量保留。也可回滚旧 JAR。无论采用哪种方式,
都保留 `syslog_backlog_retention_hourly` 表,不要删除历史审计数据。