# InfluxDB Cluster - InfluxDB Enterprise 集群的开源替代方案
InfluxDB Cluster - 一个开源分布式时间序列数据库,InfluxDB Enterprise 集群的开源替代方案
- GitHub:[chengshiwen/influxdb-cluster](https://github.com/chengshiwen/influxdb-cluster)
- Wiki 文档:[chengshiwen/influxdb-cluster/wiki](https://github.com/chengshiwen/influxdb-cluster/wiki)
- 下载地址:[chengshiwen/influxdb-cluster/releases](https://github.com/chengshiwen/influxdb-cluster/releases)
## 目录
- [简介](#简介)
- [特性](#特性)
- [架构](#架构)
- [概念](#概念)
- [Docker 快速开始](#docker-快速开始)
- [Kubernetes & Helm Chart](#kubernetes--helm-chart)
- [安装](#安装)
- [配置](#配置)
- [HTTP 接口](#http-接口)
- [管理指南](#管理指南)
## 简介
InfluxDB Cluster 是一个开源的 **时间序列数据库**,**没有外部依赖**。它对于记录指标、事件和执行分析很有用。
InfluxDB Cluster 启发于 [InfluxDB Enterprise](https://docs.influxdata.com/enterprise_influxdb/v1.8/)、[InfluxDB v1.8.10](https://github.com/influxdata/influxdb/tree/v1.8.10) 和 [InfluxDB v0.11.1](https://github.com/influxdata/influxdb/tree/v0.11.1),旨在替代 InfluxDB Enterprise。
InfluxDB Cluster 易于维护,可以与上游 [InfluxDB 1.x](https://github.com/influxdata/influxdb/tree/master-1.x) 保持实时更新。
## 特性
- 内置 [HTTP API](https://docs.influxdata.com/influxdb/latest/guides/writing_data/),无需编写任何服务器端代码即可启动和运行。
- 数据可以被标记 tag,允许非常灵活的查询。
- 类似 SQL 的查询语言。
- 集群支持开箱即用,因此处理数据可以水平扩展以。**集群目前处于生产就绪状态**。
- 易于安装和管理,数据写入查询速度快。
- 旨在实时应答查询。这意味着每个数据点在到来时都会被计算索引,并且在 < 100 毫秒内返回的查询中立即可用。
## 架构
InfluxDB Cluster 安装由两组独立的进程组成:Data 节点和 Meta 节点。集群内的通信如下所示:
![集群架构及通信](https://static.golangjob.cn/221022/d3e24421a3600e3b82e039c17eb70947.png)
网络架构图:
![网络架构图](https://static.golangjob.cn/221022/eb64126fb0fc6e23d2478b869229c462.png)
Meta 节点通过 TCP 协议和 Raft 共识协议相互通信,默认都使用端口 `8089`,此端口必须在 Meta 节点之间是可访问的。默认 Meta 节点还将公开绑定到端口 `8091` 的 HTTP API,`influxd-ctl` 命令使用该 API。
Data 节点通过绑定到端口 `8088` 的 TCP 协议相互通信。Data 节点通过绑定到 `8091` 的 HTTP API 与 Meta 节点通信。这些端口必须在 Meta 节点和 Data 节点之间是可访问的。
在集群内,所有 Meta 节点都必须与所有其它 Meta 节点通信。所有 Data 节点必须与所有其它 Data 节点和所有 Meta 节点通信。
## 概念
### 集群
请参考: [集群 / Clustering](https://docs.influxdata.com/enterprise_influxdb/v1.8/concepts/clustering/)。特别地,注意
- [数据存储位置 / Where data lives](https://docs.influxdata.com/enterprise_influxdb/v1.8/concepts/clustering/#where-data-lives)
- [最佳服务器数量 / Optimal server counts](https://docs.influxdata.com/enterprise_influxdb/v1.8/concepts/clustering/#optimal-server-counts)
- [在集群中写入 / Writes in a cluster](https://docs.influxdata.com/enterprise_influxdb/v1.8/concepts/clustering/#writes-in-a-cluster): [Shard groups](https://docs.influxdata.com/enterprise_influxdb/v1.8/concepts/clustering/#shard-groups), [Write consistency](https://docs.influxdata.com/enterprise_influxdb/v1.8/concepts/clustering/#write-consistency), [Hinted handoff](https://docs.influxdata.com/enterprise_influxdb/v1.8/concepts/clustering/#hinted-handoff)
- [在集群中查询 / Queries in a cluster](https://docs.influxdata.com/enterprise_influxdb/v1.8/concepts/clustering/#queries-in-a-cluster)
### 术语
请参考: [术语 / Glossary](https://docs.influxdata.com/enterprise_influxdb/v1.8/concepts/glossary/)。特别地,注意
- [副本因子 / replication factor](https://docs.influxdata.com/enterprise_influxdb/v1.8/concepts/glossary/#replication-factor)
## Docker 快速开始
### 使用 docker compose 启动集群
下载 [docker-compose.yml](https://github.com/chengshiwen/influxdb-cluster/tree/master/docker/quick/docker-compose.yml),然后通过 `docker-compose` 启动 3 个 Meta 节点和 2 个 Data 节点:
```
docker-compose up -d
docker exec -it influxdb-meta-01 bash
influxd-ctl add-meta influxdb-meta-01:8091
influxd-ctl add-meta influxdb-meta-02:8091
influxd-ctl add-meta influxdb-meta-03:8091
influxd-ctl add-data influxdb-data-01:8088
influxd-ctl add-data influxdb-data-02:8088
influxd-ctl show
```
停止并移除它们,当它们不再被使用时:
```
docker-compose down -v
```
> **注**: 要持久化容器中的数据,请务必挂载所有 Meta 和 Data 节点的 `/etc/influxdb` 和 `/var/lib/influxdb` 目录。
### 创建 database
```
curl -XPOST "http://influxdb-data-01:8086/query" --data-urlencode "q=CREATE DATABASE mydb WITH REPLICATION 2"
```
### 写入一些数据
```
curl -XPOST "http://influxdb-data-01:8086/write?db=mydb" \
-d 'cpu,host=server01,region=uswest load=42 1434055562000000000'
curl -XPOST "http://influxdb-data-02:8086/write?db=mydb&consistency=all" \
-d 'cpu,host=server02,region=uswest load=78 1434055562000000000'
curl -XPOST "http://influxdb-data-02:8086/write?db=mydb&consistency=quorum" \
-d 'cpu,host=server03,region=useast load=15.4 1434055562000000000'
```
> **注**: `consistency=[any,one,quorum,all]` 设置点的写一致性。如果没有指定,`consistency` 默认为 `one`。有关每个一致性选项的详细说明,请参阅 [写一致性 / Write consistency](https://docs.influxdata.com/enterprise_influxdb/v1.8/concepts/clustering/#write-consistency)。
>
> `any`: 一旦任何节点写入成功,或者接收节点已将数据写入其 hinted handoff 队列,就立即向客户端返回成功。
>
> `one`: 一旦任何节点写入成功,则立即向客户端返回成功,如果只是写入到 hinted handoff 队列中则不会返回。
>
> `quorum`: 当大多数节点(大于副本因子半数)返回成功时返回成功。此选项仅在副本因子大于 2 时才有用,否则等效于 `all`。
>
> `all`: 仅当所有节点都返回成功时才返回成功。
### 查询数据
```
curl -G "http://influxdb-data-02:8086/query?pretty=true" --data-urlencode "db=mydb" \
--data-urlencode "q=SELECT * FROM cpu WHERE host='server01' AND time < now() - 1d"
```
### 分析数据
```
curl -G "http://influxdb-data-02:8086/query?pretty=true" --data-urlencode "db=mydb" \
--data-urlencode "q=SELECT mean(load) FROM cpu WHERE region='uswest'"
```
## Kubernetes & Helm Chart
访问:https://github.com/influxtsdb/helm-charts/tree/master/charts/influxdb-cluster
下载 InfluxDB Cluster Helm chart,执行:
```
helm install influxdb-cluster ./influxdb-cluster
```
将会启动 1 个名为 influxdb-cluster 的 release。
> **注**: 要持久化容器中的数据,请务必挂载所有 Meta 和 Data 节点的 `/var/lib/influxdb` 目录至 PVCs。
## 安装
我们建议使用 [预构建版本](https://github.com/chengshiwen/influxdb-cluster/releases) 中的一个来安装 InfluxDB Cluster。
完成以下步骤以在您自己的环境中安装 InfluxDB 集群:
> **注**: InfluxDB Cluster 的安装与 InfluxDB Enterprise 的安装完全相同,可以参考 [安装 InfluxDB Enterprise 集群 / Install an InfluxDB Enterprise cluster](https://docs.influxdata.com/enterprise_influxdb/v1.8/install-and-deploy/production_installation/)。
### Meta 节点设置
#### 0. 要求
生产环境安装过程设置三个 Meta 节点,每个 Meta 节点在自己的服务器上运行。
InfluxDB Cluster 需要 **至少三个 Meta 节点** 和 **奇数个 Meta 节点** 以实现高可用和冗余。
> **注 1**:InfluxDB Cluster 不建议超过三个 Meta 节点,除非您的服务器之间的通信存在长期可靠性问题。
>
> **注 2**:强烈建议不要在同一服务器上部署多个 Meta 节点,因为如果该特定服务器无响应,它会产生更大的潜在故障。InfluxDB Cluster 建议在占用空间相对较小的服务器上部署 Meta 节点。
>
> **注 3**:要使用单个 Meta 节点启动集群,请在启动单个 Meta 节点时传递 `-single-server` 标志。
>
> 假设有三台服务器:`influxdb-meta-01`, `influxdb-meta-02` 和 `influxdb-meta-03`。
**端口**: Meta 节点通过端口 `8088`、`8089` 和 `8091` 进行通信。
#### 1. 为每个服务器添加适当的 DNS 条目
> **注**: 如果您只想使用 IP 地址而不是主机名,请跳过当前步骤并转到步骤 2。
确保将服务器的主机名和 IP 地址添加到网络的 DNS 环境中。
> **验证步骤**:
>
> 在继续安装之前,请在每台服务器上验证其他服务器是否可解析。下面是一组使用 `ping` 的 shell 命令示例:
> ```
> ping -qc 1 influxdb-meta-01
> ping -qc 1 influxdb-meta-02
> ping -qc 1 influxdb-meta-03
> ```
#### 2. 编辑配置文件
在 `/etc/influxdb/influxdb-meta.conf`:
* 取消注释 `hostname` 并设置为 Meta 节点的完整主机名。
```
hostname="influxdb-meta-0x"
```
> **注意**: 如果您只想使用 IP 地址而不是主机名,必须将 `hostname` 设置为 IP 地址。
#### 3. 启动 Meta 服务
分别在服务器 `influxdb-meta-01`、`influxdb-meta-02` 和 `influxdb-meta-03` 上启动 Meta 服务
```
/usr/bin/influxd-meta -config /etc/influxdb/influxdb-meta.conf
```
#### 4. 将 Meta 节点加入集群
在一个且仅一个 Meta 节点上,加入所有 Meta 节点,包括它自己。在我们的示例中,从 `influxdb-meta-01` 运行:
```
influxd-ctl add-meta influxdb-meta-01:8091
influxd-ctl add-meta influxdb-meta-02:8091
influxd-ctl add-meta influxdb-meta-03:8091
```
预期的输出是:
```
Added meta node x at influxdb-meta-0x:8091
```
> **验证步骤**:
>
> 在任何 Meta 节点上发出以下命令:
> ```
> influxd-ctl show
> ```
> 预期的输出是:
> ```
> Data Nodes
> ==========
> ID TCP Address Version
>
> Meta Nodes
> ==========
> ID TCP Address Version
> 1 influxdb-meta-01:8091 1.8.10-c1.1.1
> 2 influxdb-meta-02:8091 1.8.10-c1.1.1
> 3 influxdb-meta-03:8091 1.8.10-c1.1.1
> ```
### Data 节点设置
#### 0. 要求
生产环境安装过程设置两个 Data 节点,每个 Data 节点在自己的服务器上运行。
InfluxDB Cluster 需要 **至少两个 Data 节点** 才能实现高可用性和冗余。
> **注 1**:没有要求每个 Data 节点都运行在自己的服务器上。但是,最佳实践是将每个 Data 节点部署在专用服务器上。
>
> **注 2**:InfluxDB Cluster 不能用作负载均衡器。您需要配置自己的负载均衡器以将客户端流量发送到端口 `8086`([HTTP API](https://docs.influxdata.com/influxdb/v1.8/tools/api/) 的默认端口)。
>
> 假设有两台服务器:`influxdb-data-01` 和 `influxdb-data-02`。
**端口**: Data 节点通过端口 `8088`、`8089` 和 `8091` 进行通信。
#### 1. 为每个服务器添加适当的 DNS 条目
> **注**: 如果您只想使用 IP 地址而不是主机名,请跳过当前步骤并转到步骤 2。
确保将服务器的主机名和 IP 地址添加到网络的 DNS 环境中。
> **验证步骤**:
>
> 在继续安装之前,请在每台服务器上验证其他服务器是否可解析。下面是一组使用 `ping` 的 shell 命令示例:
> ```
> ping -qc 1 influxdb-data-01
> ping -qc 1 influxdb-data-02
> ```
#### 2. 编辑配置文件
在 `/etc/influxdb/influxdb.conf`:
* 取消注释 `hostname` 并设置为 Data 节点的完整主机名。
```
hostname="influxdb-data-0x"
```
> **注意**: 如果您只想使用 IP 地址而不是主机名,必须将 `hostname` 设置为 IP 地址。
#### 3. 启动 Data 服务
分别在服务器 `influxdb-data-01` 和 `influxdb-data-02` 上启动 Data 服务
```
/usr/bin/influxd -config /etc/influxdb/influxdb.conf
```
> **注**: Data 节点在未被加入集群之前,出现 `Failed to create storage`,`failed to store statistics` 或 `meta service unavailable` 日志是正常情况。
#### 4. 将 Data 节点加入集群
> 只有在添加全新节点时才应将 Data 节点加入集群,无论是在集群的初始创建期间还是在增加 Data 节点数量时。
> 如果您要使用 `influxd-ctl update-data` 替换现有 Data 节点,请跳过本步骤的其余部分。
对要加入集群的每个 Data 节点运行一次且仅一次的 `add-data` 命令:
```
influxd-ctl add-data influxdb-data-01:8088
influxd-ctl add-data influxdb-data-02:8088
```
预期的输出是:
```
Added data node y at influxdb-data-0x:8088
```
> **验证步骤**:
>
> 在任何 Meta 节点上发出以下命令:
> ```
> influxd-ctl show
> ```
> 预期的输出是:
> ```
> Data Nodes
> ==========
> ID TCP Address Version
> 4 influxdb-data-01:8088 1.8.10-c1.1.1
> 5 influxdb-data-02:8088 1.8.10-c1.1.1
>
> Meta Nodes
> ==========
> ID TCP Address Version
> 1 influxdb-meta-01:8091 1.8.10-c1.1.1
> 2 influxdb-meta-02:8091 1.8.10-c1.1.1
> 3 influxdb-meta-03:8091 1.8.10-c1.1.1
> ```
## 配置
### 配置集群
请参考
- [配置 InfluxDB 集群](https://github.com/chengshiwen/influxdb-cluster/wiki/Configure-Clusters)
- [配置 InfluxDB 集群 Data 节点](https://github.com/chengshiwen/influxdb-cluster/wiki/Configure-Data-Nodes)
- [配置 InfluxDB 集群 Meta 节点](https://github.com/chengshiwen/influxdb-cluster/wiki/Configure-Meta-Nodes)
> **注**: InfluxDB Cluster 的配置项几乎和 InfluxDB Enterprise 完全一样,
> 唯一的差别是,InfluxDB Cluster 使用 `[coordinator]` 配置项, 而 InfluxDB Enterprise 使用 `[cluster]`。
### 尚未支持的配置项
相比于 InfluxDB Enterprise,下列配置项目前尚未支持,未来将逐渐得到支持。
Data 节点:
```
[coordinator]
shard-reader-timeout
[monitor]
remote-collect-interval
[hinted-handoff]
retry-concurrency
batch-size
[anti-entropy]
max-fetch
max-sync
auto-repair-missing
```
Meta 节点:
```
[meta]
ldap-allowed
consensus-timeout
```
## HTTP 接口
### Data 节点 HTTP 接口
#### /query HTTP 接口
请参考: [/query HTTP endpoint](https://docs.influxdata.com/influxdb/v1.8/tools/api/#query-http-endpoint)
#### /write HTTP 接口
请参考: [/write HTTP endpoint](https://docs.influxdata.com/influxdb/v1.8/tools/api/#write-http-endpoint)
#### /api/v2/query HTTP 接口
请参考: [/api/v2/query/ HTTP endpoint](https://docs.influxdata.com/influxdb/v1.8/tools/api/#apiv2query-http-endpoint)
#### /api/v2/write HTTP 接口
请参考: [/api/v2/write/ HTTP endpoint](https://docs.influxdata.com/influxdb/v1.8/tools/api/#apiv2write-http-endpoint)
## 管理指南
### 迁移 InfluxDB OSS 到 InfluxDB Cluster
请参考: [迁移 InfluxDB OSS 到 InfluxDB Cluster / Migrate InfluxDB OSS instances to InfluxDB Cluster clusters](https://docs.influxdata.com/enterprise_influxdb/v1.8/guides/migration/)
### 更换集群节点
请参考: [更换集群节点 / Replace InfluxDB Cluster cluster meta nodes and data nodes](https://docs.influxdata.com/enterprise_influxdb/v1.8/guides/replacing-nodes/)
### 重新平衡集群
请参考: [重新平衡集群 / Rebalance InfluxDB Cluster clusters](https://docs.influxdata.com/enterprise_influxdb/v1.8/guides/rebalance/)
### 硬件数量评估指南
请参考: [硬件数量评估指南 / Hardware sizing guidelines](https://docs.influxdata.com/enterprise_influxdb/v1.8/guides/hardware_sizing/)
### 开启 HTTPS
请参考: [开启 HTTPS / Enable HTTPS for InfluxDB Cluster](https://docs.influxdata.com/enterprise_influxdb/v1.8/guides/https_setup/)
### 管理安全
请参考: [管理安全 / Manage security in InfluxDB Cluster](https://docs.influxdata.com/enterprise_influxdb/v1.8/administration/security/)
### 管理集群
> **注意:有限支持**,`influxd-ctl` 已经支持 13 个命令,剩余 6 个命令 `backup`, `restore`, `copy-shard-status`, `kill-copy-shard`, `entropy`, `ldap` 尚不支持
请参考: [管理集群](https://github.com/chengshiwen/influxdb-cluster/wiki/Manage-Clusters)
### 使用反熵(Anti-entropy)服务
> **注意:尚不支持**
请参考: [使用反熵(Anti-entropy)服务 / Use Anti-Entropy service in InfluxDB Cluster](https://docs.influxdata.com/enterprise_influxdb/v1.8/administration/anti-entropy/)
### 备份和还原
> **注意:有限支持**,备份和还原 (`influxd-ctl backup`, `influxd-ctl restore`) 尚不支持
请参考: [备份和还原 / Back up and restore InfluxDB Cluster clusters](https://docs.influxdata.com/enterprise_influxdb/v1.8/administration/backup-and-restore/)
> **注意:导出和导入已支持** (`influx_inspect export`, `influx -import`)
请参考: [导出和导入数据 / Exporting and importing data](https://docs.influxdata.com/enterprise_influxdb/v1.8/administration/backup-and-restore/#exporting-and-importing-data)
### 日志和跟踪
请参考: [日志和跟踪 / Log and trace InfluxDB Cluster operations](https://docs.influxdata.com/enterprise_influxdb/v1.8/administration/logs/)
### 重命名主机
请参考: [重命名主机 / Rename hosts in InfluxDB Cluster](https://docs.influxdata.com/enterprise_influxdb/v1.8/administration/renaming/)
有疑问加站长微信联系(非本文作者))