chengshiwen/influx-proxy

influx proxy的路由规则、数据倾斜及 hash 分布

Closed this issue · 8 comments

您好,我们的应用最近发现内存有比较剧烈的波动,如下图所示, 想请教下几个问题

问题描述

近两天:
image
近七天:
image

最近的改变就是新增加了一些写入 但是也都比较均衡,查询用量和以前也一样

当前版本

  • chengshiwen/influx-proxy:2.5.10
  • influxdb:1.8.10 - oss

QA

  1. 图1看起来也是比较规律的波动,这边可能是什么原因呢?
  2. 据文档说明,proxy会根据database 和measurement 和instance做hash ,这样的话很有可能实例数据量分布不均, 我们的case是两个环每个环3个实例, 其中两个平常用量也就1g,第三个用量有时候可以飙到30多g.. 这个是否可以在哪里指定我的数据就写到某个instance呢?或者说会在哪个新版本中release这种功能嘛?
  3. 假如没有指定,这边有什么算法可以自己模拟一下我的表会落到哪个instance嘛?
  4. 适配influx1的 influx-proxy是否还有更新计划呢?

期待您的回复,谢谢!

  1. 图1是influxdb还是proxy的图?
  2. 目前无法指定,可以在下个大版本中加上这个功能,可以指定 hash 规则和自定义路由规则
  3. 目前可以修改的是 hash_key,详见字段说明,可以通过修改这个来测试模拟
  4. 可以查看演进路线,对于您反馈的两个 issue #67#68,如何确认会加入到演进路线

感谢您的回复!

  1. 图1是influxdb
  2. 演进路线这边看到了, 但是留意到您那边最近可能还有v2版本的influx-proxy和cluster的替代品, 不知道v1 是否还会继续如演进路线前行, 有大概的时间线嘛?

QA:

  1. 问下influxdb-proxy2 也已经prod就绪了吗?
  2. cluster的替代品和 influxdb-proxy2 哪个您那边更加倾向呢,有一些对比的资料嘛?

演进路线这边看到了, 但是留意到您那边最近可能还有v2版本的influx-proxy和cluster的替代品, 不知道v1 是否还会继续如演进路线前行, 有大概的时间线嘛?

主要还是 influxdb v1 的支持,influxdb v1 对应 influx-proxy v2.x,influxdb v2 是对应 influx-proxy v3.x。没有明确时间线,有时间就支持

问下influxdb-proxy2 也已经prod就绪了吗?

influx-proxy v2.x 早已经生产验证过,多家客户和厂商都在使用

cluster的替代品和 influxdb-proxy2 哪个您那边更加倾向呢,有一些对比的资料嘛?

简单对比如下:

InfluxDB Cluster v1.8.10-c1.1.2 正式发布,完全依照 InfluxDB Enterprise 实现,基于 InfluxDB v1.8.10 开发,支持集群(数据分片)、高可用(容错)、数据一致性(Raft,Hinted Handoff)、InfluxQL 和 Flux 查询、配套工具(扩缩容、数据同步等)等特性,已在生产环境运行数月

https://github.com/chengshiwen/influxdb-cluster

文档:https://github.com/chengshiwen/influxdb-cluster/wiki

关联项目:
Influx Proxy:InfluxDB 代理,18年开始维护,功能简单、稳定可靠(已在很多家金融客户生产环境长期运行达3-4年),与InfluxDB 完全解耦,易于维护,满足大多数场景,代理性能损失不到10%。缺点:只分库不分表(数据量很大时可能导致数据倾斜),部分复杂 InfluxQL 语句不支持,CQ 不支持
地址:https://github.com/chengshiwen/influx-proxy

谢谢!

influxdb v2 是对应 influx-proxy v3.x 的, 这个已经prod就绪了吗?

influxdb v2 是对应 influx-proxy v3.x 的, 这个已经prod就绪了吗?

这个有少部分用户在生产使用,目前没有反馈有任何问题,但因为 influx-proxy v3.x 支持功能有限,所以你可以测试看看

假如没有指定,这边有什么算法可以自己模拟一下我的表会落到哪个instance嘛?

@rainbowwiki 可以使用 influx-tool v0.4.0influx-tool hashdist 命令来进行模拟测试,例如:

单个 database 和 measurement 分布测试:

$ influx-tool hashdist -n 10 -d db1 -m cpu1
node total: 10, hash key: idx, shard key: %db,%mm, database: db1, measurement: cpu1
node index: 4

多个 database 和 measurement 分布测试:

$ head -n 3 table.csv
db1,cpu1
db1,cpu2
db1,cpu3
$ influx-tool hashdist -n 10 -f table.csv -D -
node total: 10, hash key: idx, shard key: %db,%mm, total hits: 40
node index: 0, hits: 4, percent: 10.0%, expect: 10.0%
node index: 1, hits: 5, percent: 12.5%, expect: 10.0%
node index: 2, hits: 6, percent: 15.0%, expect: 10.0%
node index: 3, hits: 4, percent: 10.0%, expect: 10.0%
node index: 4, hits: 5, percent: 12.5%, expect: 10.0%
node index: 5, hits: 4, percent: 10.0%, expect: 10.0%
node index: 6, hits: 4, percent: 10.0%, expect: 10.0%
node index: 7, hits: 4, percent: 10.0%, expect: 10.0%
node index: 8, hits: 1, percent:  2.5%, expect: 10.0%
node index: 9, hits: 3, percent:  7.5%, expect: 10.0%

influx-proxy v2.5.12 支持自定义 hash_keyshard_key 模板,可以控制数据应该写入到哪个 influxdb 实例,详见 Hash and Shard Key

您好, 感谢提醒,首先庆祝这个hash_key 以及shard_key 功能的发布! 感谢!

但是关于这个hash策略,没看明白具体怎么应用,能帮忙举个例子吗?

假设proxy 配置了如下配置, 那这个是如何控制数据写到哪里的?例如我有两个circle 每个circle有三个实例,

circle1
      instance1
      instance2
      instance3
circle2
      instance1
      instance2
      instance3

有这样的数据如下:

memory,host=host5 used=6471i
network,host=host2 bytes_recv=8707i
disk,host=host5 used_percent=89.37
cpu,host=host5 usage_user=0.2
disk,host=host1 read_bytes=7351i
memory,host=host3 free=8527i
network,host=host2 errors=645i
network,host=host5 bytes_recv=3984i
memory,host=host3 free=5408i
memory,host=host3 used=8950i
disk,host=host5 read_bytes=7076i

我应该怎么样配置可以让cpu这张表写到instance1 , memory 写到instance2,disk写到instance3 呢? 这个可以实现吗?