INFINI Gateway 如何防止大跨度查询

背景

业务每天生成一个日期后缀的索引,写入当日数据。

业务查询有时会查询好多天的数据,导致负载告警。

现在想对查询进行限制--只允许查询一天的数据(不限定是哪天),如果想查询多天的数据就走申请。

技术分析

在每天一个索引的情况下,要进行多天的数据查询,有三种途径:

  1. 查询时,指定多个索引
  2. 查询时,写前缀+*号,模糊匹配多个索引
  3. 查询别名,别名关联多个索引

需求实现

我们只需用网关代理 ES 集群,并在 default_flow 中增加一段 request_path_filter 过滤器的配置,只允许查询一个索引且格式如 "xxx-2023-12-06", "xxx.2023.12.06", "xxx20231206" 。

复制代码
      - request_path_filter:
           message: "Query scope exceeds limit, please contact the administrator for application."
           must:
             suffix:
                - _search
             regex:
                - \/[a-z]+[-.]?\d{4}[-.]?\d{1,2}[-.]?\d{1,2}\/

如果需要指定其他格式,请自行修改 regex 的正则表达式。

创建测试索引

INFINI Console 开发工具中执行下列语句:

复制代码
POST test-2023-12-06/_doc
{
  "test":"test"
}

POST test-2023-12-6/_doc
{
  "test":"test"
}
POST test.2023.12.06/_doc
{
  "test":"test"
}
POST test.2023.12.6/_doc
{
  "test":"test"
}

POST test20231206/_doc
{
  "test":"test"
}

POST test/_doc
{
  "test":"test"
}

查询测试语句

复制代码
#预计成功的查询
curl localhost:8000/test-2023-12-06/_search?pretty
curl localhost:8000/test-2023-12-6/_search?pretty
curl localhost:8000/test.2023.12.06/_search?pretty
curl localhost:8000/test.2023.12.6/_search?pretty
curl localhost:8000/test20231206/_search?pretty
#预计失败的查询
curl localhost:8000/test-2023-12-06,test-2023-12-6/_search?pretty
curl localhost:8000/test-2023-12*/_search?pretty
curl localhost:8000/test*/_search?pretty
curl localhost:8000/*/_search?pretty

查询结果

预计成功的查询
预计失败的查询

此外,我们在 Console 中的 Request Analysis 看板中也能看到,哪些请求被拒绝,哪些请求被"放行"。

查询多个索引(多天)

现在我们已经实现了业务只能查一个索引,即一天的数据。当业务需要查询多天的索引时,我们只需创建一个别名,关联多个索引就行了。注意别名也要符合格式要求:字母开头 + 日期格式后缀。

下面我们创建一个 test-1111-1-1 的别名,关联前面的三个测试索引。

复制代码
POST /_aliases
{
  "actions" : [
    { "add" : { "indices" : ["test-2023-12-06", "test.2023.12.06","test-2023-12-6"], "alias" : "test-1111-1-1" } }
  ]
}

查询别名

待业务查询用完之后,删除别名即可。

复制代码
POST /_aliases
{
  "actions" : [
    { "remove": { "indices" : ["test-2023-12-06", "test.2023.12.06","test-2023-12-6"], "alias" : "test-1111-1-1" } }
  ]
}

最后,我们只需严格控制别名的创建,就能实现我们最初的需求了。

相关推荐
AOwhisky2 天前
Ceph系列第五期:Ceph 对象存储(RADOS Gateway)精讲
linux·运维·笔记·ceph·gateway·对象存储
西凉的悲伤3 天前
Spring Cloud Gateway介绍
java·spring cloud·gateway
苏渡苇4 天前
Spring Cloud Gateway 网关限流
spring cloud·gateway·springboot·网关限流
一个儒雅随和的男子5 天前
Spring cloud组件gateway网关详细剖析
spring·spring cloud·gateway
超梦dasgg5 天前
Gateway 鉴权场景:网关统一鉴权 + 业务应用决定放行规则
java·gateway
木雷坞5 天前
AI Gateway 接入大模型服务后首 token 慢排查:镜像、模型缓存和 GPU 节点
人工智能·缓存·gateway
明夜之约6 天前
Spring Cloud Gateway 深度解析:从路由原理到生产级网关实战
java·spring·spring cloud·gateway
tyler_download7 天前
深入深出openclaw:gateway 服务进程的启动逻辑
gateway
Upsy-Daisy7 天前
OpenClaw 源码解析(七):Gateway 控制平面与 WebSocket RPC 机制
websocket·平面·gateway
香菜烤面包7 天前
SGLang Model Gateway 核心功能解析
gateway