跳转到主要内容

适用于InfluxDB等时间序列数据库的断路器,可防止昂贵的查询

项目描述

![logo](contrib/assets/protector_rabbit.png)

# 保护器

适用于InfluxDB等时间序列数据库的断路器

## 简介

本项目旨在为时间序列数据库创建一个保护机制。
它防止恶意查询可能耗尽内存,从而造成浏览器或数据库过载。
**目前仅支持InfluxDB 0.8**。但也可能添加其他数据库。

目标

防止恶意查询到时间序列数据库(例如InfluxDB),这可能导致其崩溃。
防止浏览器因数据点过多而冻结。
为拒绝的查询提供有用的错误信息。

保护器应该在您的仪表板解决方案和数据库之间运行。
例如,您应该将Grafana指向保护器而不是InfluxDB来过滤查询

![logo](contrib/assets/diagram_protector.jpeg)

有关我们为什么构建此工具的更多信息,请阅读我们在trivgo技术博客上的公告帖子。


## 工作原理

保护器在查询甚至到达数据库之前,就会对其进行规则列表的检查。
被过滤的查询将不会执行,而是返回错误信息。
规则可以在您的 `config.yaml` 文件中指定。

使用 `protector --show_rules` 可显示所有可用规则的描述。
以下是当前规则列表

#### 防止负分组语句 (`negative_groupby_statement`) ####
负分组语句可能导致未定义的行为。
它们甚至可能使服务器崩溃。这就是为什么它们被禁止的原因。

#### 防止删除查询 (`prevent_drop`) ####
删除查询意味着数据丢失。这是一个风险操作,应仅限于管理员用户。

#### 防止删除查询 (`prevent_delete`) ####
删除数据可能是一个代价高昂的操作。在 InfluxDB 0.8 及之前版本中不应执行此操作。
参见:https://influxdb.com/docs/v0.8/api/query_language.html#deleting-data-or-dropping-series

#### 防止以点结尾的系列名称 (`series_endswith_dot`) ####
此类系列通常表示查询未完成,并且
是意外执行的。为了避免错误,只需删除点
或添加另一个单词(例如 'my.graphite.series.' -> 'my.graphite.series')

#### 防止每个查询中数据点过多 (`too_many_datapoints`) ####
此类查询可能会使时序数据库崩溃
或因通过线缆传输过多数据而使客户端过载。

#### 防止查询短系列名称 (`short_series_name`) ####
系列名称的正则表达式越短,潜在的匹配系列名称就越多。
这对 InfluxDB 来说是一次巨大的性能损失。

#### 防止查询非常旧的数据 (`query_old_data`) ####
此类查询可能会使时序数据库崩溃
因为它需要从磁盘打开和解析非常旧的碎片


## 白名单

您可以在配置中添加系列名称的白名单。匹配这些模式的系列名称的查询始终会执行,而无需进行任何之前的检查。如果您想允许所有针对 [Grafana 注释](http://docs.grafana.org/reference/annotations/) 的查询,这非常有用。请查看 `config.yaml` 中的示例模式。

## 使用方法

您可以选择以 Docker 容器或独立的 Python 应用程序的形式运行 Protector。

但首先,请创建一个包含所有设置的 `config.yaml` 文件。
我们已添加了一个示例配置文件,应该能帮助您开始。
请确保将 `backend_host` 和 `backend_port` 调整为指向您的数据库

### 选项 1:作为独立应用程序运行

您需要在您的服务器上安装 Python 2.7

```Python
pip安装保护器
protector -c config.yaml
```

### 选项 2:作为 Docker 容器运行

在您的 `config.yaml` 所在的同一目录中启动容器

```
docker run -it -v `pwd`:config trivago/protector
```

### 连接

启动 Protector 后,将所有面向用户的端点(例如 Grafana)指向 Protector 而不是 InfluxDB。
这样应该就可以了。


## 命令行选项

您可以从命令行覆盖以下设置

```
用法:protector [-h] [--host HOST] [--port PORT]
[--backend_host BACKEND_HOST] [--backend_port BACKEND_PORT]
[-c CONFIGFILE] [-v] [--show_rules] [-f] [--version]
[{start,stop,status,restart}]

Protector - 时序数据库的电路断路器

位置参数
{start,stop,status,restart}
以下选项之一
start: 启动守护程序(默认)
stop: 停止守护程序
status: 显示当前状态
restart: 重新启动守护程序

可选参数
-h, --help 显示此帮助信息并退出
--host HOST 绑定的主机名(默认:localhost)
--port PORT 绑定的端口(默认:8888)
--backend_host BACKEND_HOST
时序数据库的主机名(默认:localhost)
--backend_port BACKEND_PORT
时序数据库的端口(默认:8086)
-c CONFIGFILE, --configfile CONFIGFILE
配置文件路径(默认:None)
-v, --verbose 设置详细程度。通过添加 v 增加详细程度
-v -vv -vvv(默认:0)
--show_rules 显示可用规则列表并退出
-f, --foreground 在前台运行。启动时不要作为守护进程。
--version 显示版本
```


## 性能

保护器可以轻松地每秒检查数百个查询。
我们包含了一个您可以自己运行的负载测试。有关更多信息,请查看 `docker-compose-integration.yml`。


## 致谢

标志由 [Bradley Ashburn](https://thenounproject.com/bashburn/) 创建。感谢您的贡献!


## 许可证

BSD-3

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源分布

protector-0.6.0.tar.gz (32.4 kB 查看散列值)

上传时间

由以下组织支持