InfluxDB Proxy

基于 influx-proxy , influxdb-proxy 是一个基于高可用、一致性哈希的 InfluxDB 集群代理服务,实现了 InfluxDB 高可用集群的部署方案,具有动态扩/缩容、故障恢复、数据同步等能力。连接到 Influx Proxy 和连接原生的 InfluxDB Server 没有显著区别 (支持的查询语句列表),对上层客户端是透明的,上层应用可以像使用单机的 InfluxDB 一样使用,Influx Proxy 会处理请求的转发,并对各个 InfluxDB 集群节点进行管理。在 饿了么开源的 Influx-Proxy 基础上,并进一步开发和优化,支持了更多的特性,移除了 Python、Redis 依赖,解决了受限于一个数据库、需要额外配置 KEYMAPS 、数据负载不均衡的问题。

架构图

InfluxDB_influxdb-proxy

架构的示例

  • Client: 目前支持 UDP 的直接写入 , 支持 Http 的 write / query 操作 , 包含有: influxdb-java / influxdb-go / influxdb-shell / curl / 浏览器 等
  • Gateway: 支持 客户端为 Http 请求的操作,对于 UDP 请求 目前暂时 不支持, UDP 请求 直接 对接到 Proxy
  • influxdb-proxy: Proxy 实例
  • Circle: 一致性的 Hash Ring , 在一个 HashRing 里面 存在 多个 influxdb 实例 的配置。 并且 一个 HashRing 内的 实例 共同存储 一份全量的 Influxdb 时序 数据,每个 HashRing 都是 全量数据的 一个副本,做到 HashRing 之间 的数据备份。
  • 请注意: 不同的 HashRing 不允许 拥有 相同的 Influxdb 实例;

  • 每个 HashRing 的 实例 个数可以不等;

  • HashRing 只是一种 逻辑 概念

  • Influxdb: 通过 url 进行 区分
  • 一个 influxdb 实例 只存储 当前 HashRing 全量数据的一部分

原理

一致性哈希

  • 一致性哈希算法解决了分布式环境下机器扩缩容时,简单的取模运算导致数据需要大量迁移的问题
  • 一致性哈希算法能达到较少的机器数据迁移成本,实现快速扩缩容
  • 通过虚拟节点的使用,一致性哈希算法可以均匀分担机器的数据负载

HashRing 的设计

  • 一个 circle 是一个逻辑上的一致性哈希环,包含少数的物理节点和更多数的虚拟节点
  • 一个 circle 中的所有 influxdb 实例对应了这个一致性哈希环的物理节点

数据存储位置

  • 每个 circle 维护了一份全量数据,一个 influxdb 实例上的数据只是从属 circle 数据的一部分
  • 每个 circle 数据存储位置计算:

    db,measurement + influxdb实例列表 + 一致性哈希算法 => influxdb实例

  • 当influxdb实例列表不发生改变时,db,measurement将只会唯一对应一台influxdb实例
  • 当influxdb实例列表发生改变时,需要对少量机器数据进行迁移,即 重新平衡 (rebalance)

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
{
"circles": [
{
"name": "circle-1",
"backends": [
{
"name": "influxdb-1-1",
"url": "http://127.0.0.1:8056",
"username": "",
"password": "",
"auth_secure": false,
"udp": [
{
"url": "127.0.0.1:8059",
"db":"msp"
}
]
},
......
]
},
{
"name": "circle-2",
"backends": [
{
"name": "influxdb-2-1",
"url": "http://127.0.0.1:8076",
"username": "",
"password": "",
"auth_secure": false
},
......
]
}
],
"listen_addr": ":7076",
"db_list": [],
"data_dir": "data",
"tlog_dir": "log",
"hash_key": "idx",
"flush_size": 10000,
"flush_time": 1,
"check_interval": 1,
"rewrite_interval": 10,
"conn_pool_size": 20,
"write_timeout": 10,
"idle_timeout": 10,
"username": "",
"password": "",
"auth_secure": false,
"write_tracing": false,
"query_tracing": false,
"https_enabled": false,
"udp_url": ":7079",
"udp_db": "telegraf",
"https_cert": "",
"https_key": ""
}

配置说明

  • circles: hash ring 的列表

  • circles.name: 每个 hash ring 的 名字(保证唯一性)

  • circles.backends: hash ring 中的 每个 influxdb 实例

  • circles.backends.name: 后端实例名(唯一)

  • circles.backends.url: 后端地址(唯一)

  • circles.backends.username: 后端 实例认证 (若 Influxdb 开启,则必填)

  • circles.backends.password: 后端 实例认证 (若 Influxdb 开启,则必填)

  • circles.backends.auth_secure: 是否 启用加密认证 , default: false

  • listen_addr: Proxy 的 Http 请求地址

  • db_list: 允许 Proxy 访问 的 数据库 列表, default: [] , 表示 不限制

  • data_dir: 保存写入失败的数据的缓存目录, 文件类型为: .dat / .rec ,

  • tlog_dir: 用于记录重新平衡、故障恢复、数据同步、错误数据清理的日志目录

  • hash_key: 配置一致性哈希算法的 key,可选值为 idx、exi、name 或 url,分别使用 backend 实例的 索引、扩展索引、name、url 的值进行 hash,默认值为 idx.

  • hash key 确定后,尽量不进行 修改, 否则 会 rebalance

  • 若 backend 实例的 index、name、url 的值发生变更,也会导致 hash 策略发生变化,从而需要 rebalance,如新增 backend 实例、name 变更、url 从 http 协议变成 https 协议等,默认值 idx 会使得一致性哈希更加稳定,从而减少 rebalance ;

  • 扩展索引 exi 是 索引 idx 的扩展版,v2.5.3 开始支持,一个 circle 中的 influxdb 实例数量大于 10 时建议使用 exi

  • flush_size: 写数据时缓冲的最大点数,达到设定值时将一次性批量写入到 influxdb 实例;

  • flush_time: 写数据时缓冲的最大时间,达到设定值时即使没有达到 flush_size 也进行一次性批量写入到 influxdb 实例,单位为秒,默认为 1

  • check_interval: 检查后端存活 的间隔时间

  • rewrite_interval: 向 influxdb 后端实例重写缓存失败数据的间隔时间,默认为 10 秒

  • conn_pool_size: 创建 influxdb 后端实例写入的连接池大小,默认为 20

  • write_timeout: 向 influxdb 后端实例写数据的超时时间,默认为 10 秒

  • idle_timeout: 服务器 keep-alives 的等待时间,默认为 10 秒

  • username: proxy 的认证用户,若 auth_secure 开启则启用认证加密,空表示不启用认证

  • password:

  • auth_secure:

  • write_tracing: 写入请求的日志开关,默认为 false

  • query_tracing: 查询请求的日志开关,默认为 false

  • https_enabled: 是否启用 https,默认为 false

  • udp_url: UDP 的 监控地址

  • udp_db: UDP 的写入 库

  • https_cert: ssl 证书路径,https_enabled 开启后有效

  • https_key: ssl 私钥路径