chengshiwen / influx-proxy

InfluxDB Proxy with High Availability and Consistent Hash
https://github.com/chengshiwen/influx-proxy/wiki
MIT License
354 stars 112 forks source link
consistent-hash high-availability influx-proxy influxdb

InfluxDB Proxy

CN doc EN doc Go Report Card LICENSE Releases GitHub stars Docker pulls

This project adds a basic high availability and consistent hash layer to InfluxDB.

NOTE: influx-proxy must be built with Go 1.21+ with Go module support, don't implement udp.

NOTE: InfluxDB Cluster - open source alternative to InfluxDB Enterprise has been released, which is better than InfluxDB Proxy.

Why

We used InfluxDB Relay before, but it doesn't support some demands. We use grafana for visualizing time series data, so we need add datasource for grafana. We need change the datasource config when influxdb is down. We need transfer data across idc, but Relay doesn't support gzip. It's inconvenient to analyse data with connecting different influxdb. Therefore, we made InfluxDB Proxy. More details please visit https://github.com/shell909090/influx-proxy.

Forked from the above InfluxDB Proxy, after many improvements and optimizations, InfluxDB Proxy v1 has released, which no longer depends on python and redis, and supports more features.

Since the InfluxDB Proxy v1 is limited by the only ONE database and the KEYMAPS configuration, we refactored InfluxDB Proxy v2 with high availability and consistent hash, which supports multiple databases and tools to rebalance, recovery, resync and cleanup.

Features

Requirements

Usage

Quickstart by Docker

Download docker-compose.yml and proxy.json from docker/quick

$ docker-compose up -d

An influx-proxy container (port: 7076) and 4 influxdb containers will start.

Quickstart

$ git clone https://github.com/chengshiwen/influx-proxy.git
$ cd influx-proxy
$ make
$ ./bin/influx-proxy -config proxy.json

Usage

$ ./bin/influx-proxy -h
Usage of ./bin/influx-proxy:
  -config string
        proxy config file with json/yaml/toml format (default "proxy.json")
  -version
        proxy version

Build Release

$ # build current platform
$ make build
$ # build linux amd64
$ make linux
$ # cross-build all platforms
$ make release

Development

Before developing, you need to install and run Docker

$ ./script/setup.sh  # start 4 influxdb instances by docker
$ make run
$ ./script/write.sh  # write data
$ ./script/query.sh  # query data
$ ./script/remove.sh # remove 4 influxdb instances

Description

The architecture is fairly simple, one InfluxDB Proxy instance and two consistent hash circles with two InfluxDB instances respectively. The Proxy should point HTTP requests with db and measurement to the two circles and the four InfluxDB servers.

The setup should look like this:

        ┌──────────────────┐
        │ writes & queries │
        └──────────────────┘
                 │
                 ▼
        ┌──────────────────┐
        │                  │
        │  InfluxDB Proxy  │
        │   (only http)    │
        │                  │
        └──────────────────┘
                 │
                 ▼
        ┌──────────────────┐
        │  db,measurement  │
        │ consistent hash  │
        └──────────────────┘
          |              |
        ┌─┼──────────────┘
        │ └────────────────┐
        ▼                  ▼
     Circle 1          Circle 2
  ┌────────────┐    ┌────────────┐
  │            │    │            │
  │ InfluxDB 1 │    │ InfluxDB 3 │
  │ InfluxDB 2 │    │ InfluxDB 4 │
  │            │    │            │
  └────────────┘    └────────────┘

Proxy Configuration

The configuration file supports format json, yaml and toml, such as proxy.json, proxy.yaml and proxy.toml.

The configuration settings are as follows:

Hash and Shard Key

hash_key and shard_key together control which influxdb instance the data should be written to. hash_key is backend key for consistent hash, including idx, exi, name, url or template containing %idx (%idx is the index of the influxdb backend in the circle), like backend-%idx. shard_key is data shard key template for hash, which containing %db or %mm (%db and %mm are the database and measurement in the data respectively), like shard-%db-%mm.

To avoid data skew (i.e. uneven data distribution), both hash_key and shard_key need to be set appropriately. Before setting, influx-tool hashdist can help simulate and test the hash distribution. For example, execute

$ head -n 3 table.csv
db1,cpu1
db1,cpu2
db2,cpu3
$ influx-tool hashdist -n 6 -k backend-%idx -K shard-%db-%mm -f table.csv -D -
node total: 6, hash key: backend-%idx, shard key: shard-%db-%mm, total hits: 40
node index: 0, hits: 5, percent: 12.5%, expect: 16.7%
node index: 1, hits: 5, percent: 12.5%, expect: 16.7%
node index: 2, hits: 9, percent: 22.5%, expect: 16.7%
node index: 3, hits: 7, percent: 17.5%, expect: 16.7%
node index: 4, hits: 7, percent: 17.5%, expect: 16.7%
node index: 5, hits: 7, percent: 17.5%, expect: 16.7%

NOTE: Once one of hash_key and shard_key is changed, rebalance operation or influx-tool transfer is necessary.

Query Commands

Unsupported commands

The following commands are forbid.

Supported commands

Only support match the following commands.

HTTP Endpoints

HTTP Endpoints

Benchmark

There are three tools for benchmarking InfluxDB, which can also be applied to InfluxDB Proxy:

Tool

There is a tool for InfluxDB and InfluxDB Proxy:

License

MIT.