参考: https://github.com/chengshiwen/influxdb-cluster/wiki
简介
- InfluxDB Cluster 是一个开源的时间序列数据库,没有外部依赖。它对于记录指标、事件和执行分析很有用。
- InfluxDB Cluster 启发于 InfluxDB Enterprise、InfluxDB v1.8.10 和 InfluxDB v0.11.1,旨在替代 InfluxDB Enterprise。
- InfluxDB Cluster 易于维护,可以与上游 InfluxDB 1.x 保持实时更新。
特性
- 内置 HTTP API,无需编写任何服务器端代码即可启动和运行。
- 数据可以被标记 tag,允许非常灵活的查询。
- 类似 SQL 的查询语言。
- 集群支持开箱即用,因此处理数据可以水平扩展以。集群目前处于生产就绪状态。
- 易于安装和管理,数据写入查询速度快。
- 旨在实时应答查询。这意味着每个数据点在到时都会被计算索引,并且在 < 100 毫秒内返回的查询中立即可用。
架构
InfluxDB Cluster 安装由两组独立的进程组成:Data 节点和 Meta 节点。集群内的通信如下所示:
Meta 节点
元节点持有以下所有的元数据:
- 集群中的所有节点和它们的角色。
- 集群中存在的所有数据库和保留策略。
- 所有分片和分片组,以及它们存在于哪些节点上。
- 集群用户和他们的权限。
- 所有的连续查询。
Data 节点
数据节点持有所有的原始时间序列数据和元数据,包括:
- 测量值
- 标签键和值
- 字段键和值
说明
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 节点通信。
集群搭建
集群要求
Meta 要求
生产环境安装过程设置三个 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
进行通信。
Data 要求
生产环境安装过程设置两个 Data 节点,每个 Data 节点在自己的服务器上运行。
InfluxDB Cluster 需要 至少两个 Data 节点 才能实现高可用性和冗余。
注 1:没有要求每个 Data 节点都运行在自己的服务器上。但是,最佳实践是将每个 Data 节点部署在专用服务器上。
注 2:InfluxDB Cluster 不能用作负载均衡器。您需要配置自己的负载均衡器以将客户端流量发送到端口
8086
(HTTP API 的默认端口)。假设有两台服务器:
influxdb-data-01
和influxdb-data-02
。
端口: Data 节点通过端口 8088
、8089
和 8091
进行通信。
集群配置文件
下载 docker-compose.yml 集群配置文件
下载地址:https://github.com/chengshiwen/influxdb-cluster/blob/master/docker/quick/docker-compose.yml
version: "3.9" services: influxdb-meta-01: image: chengshiwen/influxdb:1.8.10-c1.1.1-meta container_name: influxdb-meta-01 hostname: influxdb-meta-01 restart: unless-stopped networks: - influxdb-cluster influxdb-meta-02: image: chengshiwen/influxdb:1.8.10-c1.1.1-meta container_name: influxdb-meta-02 hostname: influxdb-meta-02 restart: unless-stopped networks: - influxdb-cluster influxdb-meta-03: image: chengshiwen/influxdb:1.8.10-c1.1.1-meta container_name: influxdb-meta-03 hostname: influxdb-meta-03 restart: unless-stopped networks: - influxdb-cluster influxdb-data-01: image: chengshiwen/influxdb:1.8.10-c1.1.1-data container_name: influxdb-data-01 hostname: influxdb-data-01 ports: - 8186:8086 restart: unless-stopped networks: - influxdb-cluster influxdb-data-02: image: chengshiwen/influxdb:1.8.10-c1.1.1-data container_name: influxdb-data-02 hostname: influxdb-data-02 ports: - 8286:8086 restart: unless-stopped networks: - influxdb-cluster networks: influxdb-cluster:
启动集群
docker-compose up -d
注:要持久化容器中的数据,请务必挂载所有 Meta 和 Data 节点的 /etc/influxdb 和 /var/lib/influxdb 目录。
关闭集群并清理相关数据
# 关闭集群 docker-compose down # 关闭集群,并清除数据 docker-compose down -v
初始化集群
使用 docker exec 进入任意一个 **meta容器(必须是 meta 容器,不能使用 data 容器)**中执行如下命令即可:
# 添加 meta 节点 influxd-ctl add-meta influxdb-meta-01:8091 influxd-ctl add-meta influxdb-meta-02:8091 influxd-ctl add-meta influxdb-meta-03:8091
# 添加 data 节点 influxd-ctl add-data influxdb-data-01:8088 influxd-ctl add-data influxdb-data-02:8088
# 查看集群节点 influxd-ctl show
进入任意 data 节点执行测试:
# 创建库 $ create database history # 写入数据 $ insert cpu,name=m1 year=2022 # 查询数据 $ select * from cpu