Skip to content

InfluxDB 集群安装

InfluxDB集群提供高可用性、横向扩展能力和更好的性能,适用于大规模时间序列数据场景。本文将详细介绍InfluxDB集群的安装流程和最佳实践。

集群架构规划

节点角色

InfluxDB集群包含以下节点角色:

  • 数据节点(Data Node):存储时间序列数据,处理写入和查询请求
  • 元数据节点(Meta Node):存储集群元数据,管理集群成员关系和数据分布
  • 协调节点(Coordinator Node):接收客户端请求,路由到相应的数据节点

集群规模建议

集群规模数据节点数量元数据节点数量协调节点数量适用场景
小型2-411测试环境、小型生产环境
中型5-832中型生产环境,中等数据量
大型9+33+大型生产环境,海量数据量

硬件配置建议

节点类型CPU内存磁盘网络
数据节点8+ 核32+ GBSSD 1TB+10Gbps
元数据节点4+ 核16+ GBSSD 500GB+10Gbps
协调节点4+ 核16+ GBSSD 200GB+10Gbps

节点准备

操作系统要求

  • Linux (推荐 CentOS 7/8, Ubuntu 18.04/20.04)
  • 64位系统
  • 内核版本 3.10+ (CentOS) 或 4.15+ (Ubuntu)

系统配置

1. 禁用SELinux和防火墙(可选)

bash
# 临时禁用SELinux
setenforce 0

# 永久禁用SELinux
vi /etc/selinux/config
# 将SELINUX=enforcing改为SELINUX=disabled

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

2. 配置内核参数

bash
vi /etc/sysctl.conf

# 添加以下内容
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
vm.swappiness = 10
vm.max_map_count = 262144

# 应用配置
sysctl -p

3. 配置文件描述符限制

bash
vi /etc/security/limits.conf

# 添加以下内容
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

4. 配置时间同步

bash
# 安装ntp
yum install -y ntp

# 启动并启用ntpd
systemctl start ntpd
systemctl enable ntpd

# 验证时间同步
timedatectl status

网络配置

  • 确保所有节点之间网络互通
  • 配置固定IP地址
  • 建议使用私有网络
  • 配置hosts文件,添加所有节点的主机名和IP映射
bash
vi /etc/hosts

# 添加节点信息
192.168.1.101 influxdb-meta-01
192.168.1.102 influxdb-meta-02
192.168.1.103 influxdb-meta-03
192.168.1.104 influxdb-data-01
192.168.1.105 influxdb-data-02
192.168.1.106 influxdb-data-03
192.168.1.107 influxdb-data-04
192.168.1.108 influxdb-coord-01
192.168.1.109 influxdb-coord-02

InfluxDB 集群安装

1. 下载安装包

bash
# 下载InfluxDB企业版(示例,根据实际版本调整)
wget https://dl.influxdata.com/enterprise/releases/influxdb-enterprise_1.10.0-c1.10.0_amd64.deb

# 或CentOS版本
yum install -y https://dl.influxdata.com/enterprise/releases/influxdb-enterprise-1.10.0_c1.10.0.x86_64.rpm

2. 安装InfluxDB

Ubuntu/Debian

bash
dpkg -i influxdb-enterprise_1.10.0-c1.10.0_amd64.deb

CentOS/RHEL

bash
yum localinstall -y influxdb-enterprise-1.10.0_c1.10.0.x86_64.rpm

3. 配置元数据节点

在所有元数据节点上执行以下操作:

编辑元数据节点配置文件

bash
vi /etc/influxdb/influxdb-meta.conf

# 配置集群名称
[meta]
  dir = "/var/lib/influxdb/meta"
  bind-address = ":8091"
  retention-autocreate = true
  election-timeout = "1s"
  heartbeat-timeout = "1s"
  leader-lease-timeout = "500ms"
  cluster-tracing = false
  logging-enabled = true

# 配置HTTP接口
[http]
  enabled = true
  bind-address = ":8092"
  auth-enabled = false
  log-enabled = true
  write-tracing = false
  pprof-enabled = false
  https-enabled = false
  https-certificate = "/etc/ssl/influxdb.pem"
  shared-secret = ""
  max-row-limit = 10000
  realm = "InfluxDB Meta"

启动元数据节点

bash
systemctl start influxdb-meta
systemctl enable influxdb-meta

# 验证服务状态
systemctl status influxdb-meta

4. 配置数据节点

在所有数据节点上执行以下操作:

编辑数据节点配置文件

bash
vi /etc/influxdb/influxdb.conf

# 配置元数据节点连接
[meta]
  dir = "/var/lib/influxdb/meta"
  retention-autocreate = true
  logging-enabled = true
  meta-auth-enabled = false
  meta-ssl-enabled = false
  meta-tls-insecure-skip-verify = false

# 配置数据存储
[data]
  dir = "/var/lib/influxdb/data"
  wal-dir = "/var/lib/influxdb/wal"
  query-log-enabled = false
  cache-max-memory-size = 10737418240  # 10GB
  cache-snapshot-memory-size = 262144000  # 250MB
  cache-snapshot-write-cold-duration = "10m0s"
  compact-full-write-cold-duration = "4h0m0s"
  max-series-per-database = 1000000
  max-values-per-tag = 100000
  index-version = "inmem"
  trace-logging-enabled = false

# 配置HTTP接口
[http]
  enabled = true
  bind-address = ":8086"
  auth-enabled = false
  log-enabled = true
  write-tracing = false
  pprof-enabled = false
  https-enabled = false
  https-certificate = "/etc/ssl/influxdb.pem"
  max-row-limit = 0
  realm = "InfluxDB"
  unix-socket-enabled = false
  bind-socket = "/var/run/influxdb.sock"

# 配置UDP
[[udp]]
  enabled = false
  bind-address = ":8089"
  database = "udp"
  retention-policy = ""
  batch-size = 5000
  batch-timeout = "1s"
  batch-pending = 10
  read-buffer = 0

# 配置监控
[monitor]
  store-enabled = true
  store-database = "_internal"
  store-interval = "10s"

# 配置集群
[cluster]
  shard-writer-timeout = "5s"
  write-timeout = "10s"
  max-remote-write-connections = 100
  remote-read-buffer-size = 0
  remote-read-timeout = "60s"
  remote-write-buffer-size = 0
  remote-write-timeout = "60s"
  gzip-compress = true
  gzip-level = 4
  disable-remote-shards = false
  shard-replication = 1

启动数据节点

bash
systemctl start influxdb
systemctl enable influxdb

# 验证服务状态
systemctl status influxdb

5. 配置协调节点

在所有协调节点上执行以下操作:

编辑协调节点配置文件

bash
vi /etc/influxdb/influxdb.conf

# 配置元数据节点连接
[meta]
  dir = "/var/lib/influxdb/meta"
  retention-autocreate = true
  logging-enabled = true
  meta-auth-enabled = false
  meta-ssl-enabled = false
  meta-tls-insecure-skip-verify = false

# 禁用数据存储,仅作为协调节点
[data]
  enabled = false
  dir = "/var/lib/influxdb/data"
  wal-dir = "/var/lib/influxdb/wal"

# 配置HTTP接口
[http]
  enabled = true
  bind-address = ":8086"
  auth-enabled = false
  log-enabled = true
  write-tracing = false
  pprof-enabled = false
  https-enabled = false
  https-certificate = "/etc/ssl/influxdb.pem"
  max-row-limit = 0
  realm = "InfluxDB"

# 配置集群
[cluster]
  shard-writer-timeout = "5s"
  write-timeout = "10s"
  max-remote-write-connections = 100
  remote-read-buffer-size = 0
  remote-read-timeout = "60s"
  remote-write-buffer-size = 0
  remote-write-timeout = "60s"
  gzip-compress = true
  gzip-level = 4
  disable-remote-shards = false
  shard-replication = 1

启动协调节点

bash
systemctl start influxdb
systemctl enable influxdb

# 验证服务状态
systemctl status influxdb

初始化InfluxDB集群

1. 创建元数据集群

在任意一台元数据节点上执行以下命令,创建元数据集群:

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 show-meta

2. 添加数据节点到集群

在任意一台元数据节点上执行以下命令,添加数据节点:

bash
influxd-ctl add-data influxdb-data-01:8088
influxd-ctl add-data influxdb-data-02:8088
influxd-ctl add-data influxdb-data-03:8088
influxd-ctl add-data influxdb-data-04:8088

# 查看数据节点状态
influxd-ctl show-data

3. 查看集群状态

bash
influxd-ctl show

配置集群认证

1. 生成共享密钥

bash
shared_secret=$(openssl rand -hex 16)
echo $shared_secret

2. 更新配置文件

在所有节点上更新配置文件,添加共享密钥:

bash
# 元数据节点
vi /etc/influxdb/influxdb-meta.conf
[http]
  shared-secret = "$shared_secret"

# 数据节点和协调节点
vi /etc/influxdb/influxdb.conf
[meta]
  meta-shared-secret = "$shared_secret"
[http]
  auth-enabled = true

3. 重启服务

bash
# 元数据节点
systemctl restart influxdb-meta

# 数据节点和协调节点
systemctl restart influxdb

4. 创建管理员用户

bash
influx -host influxdb-coord-01 -port 8086

> CREATE USER admin WITH PASSWORD 'StrongPassword' WITH ALL PRIVILEGES
> exit

集群测试

1. 写入测试数据

bash
influx -host influxdb-coord-01 -port 8086 -username admin -password StrongPassword -execute "CREATE DATABASE test"
influx -host influxdb-coord-01 -port 8086 -username admin -password StrongPassword -database test -execute "INSERT cpu,host=server01,region=us-west value=0.64"
influx -host influxdb-coord-01 -port 8086 -username admin -password StrongPassword -database test -execute "SELECT * FROM cpu"

2. 测试查询分发

bash
# 在不同协调节点执行相同查询,验证结果一致性
influx -host influxdb-coord-01 -port 8086 -username admin -password StrongPassword -database test -execute "SELECT COUNT(*) FROM cpu"
influx -host influxdb-coord-02 -port 8086 -username admin -password StrongPassword -database test -execute "SELECT COUNT(*) FROM cpu"

3. 测试高可用性

bash
# 停止一个数据节点
systemctl stop influxdb@data-01

# 验证仍能查询数据
influx -host influxdb-coord-01 -port 8086 -username admin -password StrongPassword -database test -execute "SELECT * FROM cpu"

# 启动数据节点
systemctl start influxdb@data-01

集群监控

1. 启用内部监控

确保所有节点的监控配置已启用:

bash
[monitor]
  store-enabled = true
  store-database = "_internal"
  store-interval = "10s"

2. 监控关键指标

bash
# 查看集群状态
influx -host influxdb-coord-01 -port 8086 -username admin -password StrongPassword -database _internal -execute "SELECT * FROM cluster_health WHERE time > now() - 5m"

# 查看节点状态
influx -host influxdb-coord-01 -port 8086 -username admin -password StrongPassword -database _internal -execute "SELECT * FROM runtime WHERE time > now() - 5m"

# 查看写入性能
influx -host influxdb-coord-01 -port 8086 -username admin -password StrongPassword -database _internal -execute "SELECT * FROM write WHERE time > now() - 5m"

# 查看查询性能
influx -host influxdb-coord-01 -port 8086 -username admin -password StrongPassword -database _internal -execute "SELECT * FROM query WHERE time > now() - 5m"

3. 配置告警

使用InfluxDB的告警功能或集成第三方监控工具(如Grafana、Prometheus)配置告警规则,监控以下关键指标:

  • 集群健康状态
  • 节点可用性
  • 写入成功率
  • 查询响应时间
  • 磁盘使用率
  • 内存使用率
  • CPU使用率

集群维护

1. 节点扩容

添加数据节点

bash
influxd-ctl add-data influxdb-data-05:8088

重新平衡分片

bash
influxd-ctl rebalance

2. 节点缩容

移除数据节点

bash
# 迁移节点上的分片
influxd-ctl remove-data influxdb-data-01:8088

# 验证节点已移除
influxd-ctl show-data

3. 备份集群元数据

bash
# 备份元数据
influxd-ctl backup -host influxdb-meta-01:8091 /backup/influxdb-meta

4. 升级集群

升级前准备

  • 备份所有节点的配置文件和数据
  • 在测试环境验证升级流程
  • 制定回退方案

升级步骤

  1. 升级元数据节点
  2. 升级数据节点
  3. 升级协调节点
  4. 验证集群状态

常见问题(FAQ)

Q1: 元数据节点无法加入集群怎么办?

A1: 检查以下几点:

  • 确保所有元数据节点的时钟同步
  • 检查网络连接是否正常
  • 检查配置文件中的bind-address是否正确
  • 查看日志文件 /var/log/influxdb/influxdb-meta.log 寻找错误信息

Q2: 数据节点无法加入集群怎么办?

A2: 检查以下几点:

  • 确保数据节点可以连接到所有元数据节点
  • 检查数据节点的meta配置是否正确
  • 查看日志文件 /var/log/influxdb/influxdb.log 寻找错误信息
  • 验证元数据节点共享密钥是否一致

Q3: 集群写入性能不佳怎么办?

A3: 考虑以下优化措施:

  • 增加数据节点数量
  • 调整分片复制因子
  • 优化写入批处理大小
  • 检查磁盘I/O性能
  • 调整缓存配置参数

Q4: 集群查询性能不佳怎么办?

A4: 考虑以下优化措施:

  • 增加协调节点数量
  • 优化查询语句,添加适当的标签过滤
  • 调整数据保留策略和连续查询
  • 考虑使用Downsampling减少数据量
  • 检查网络连接和带宽

Q5: 如何处理节点故障?

A5: 处理节点故障的步骤:

  • 检查故障节点的状态和日志
  • 如果节点可以恢复,修复故障并重启服务
  • 如果节点无法恢复,使用 influxd-ctl remove-data 移除故障节点
  • 添加新节点替换故障节点
  • 执行分片重新平衡

Q6: 如何备份InfluxDB集群数据?

A6: InfluxDB集群数据备份建议:

  • 使用 influxd backup 命令备份单个数据库
  • 结合连续查询和保留策略,定期将数据归档到长期存储
  • 考虑使用文件系统快照或第三方备份工具

Q7: 集群认证配置后无法连接怎么办?

A7: 检查以下几点:

  • 确保所有节点的共享密钥一致
  • 验证用户名和密码是否正确
  • 检查HTTP请求是否包含认证信息
  • 查看日志文件寻找认证错误

Q8: 如何监控InfluxDB集群?

A8: 监控InfluxDB集群的方法:

  • 使用InfluxDB内部监控数据库 _internal
  • 集成Grafana或Chronograf进行可视化
  • 使用Prometheus和Telegraf收集指标
  • 配置告警规则,监控关键指标

Q9: 集群分片如何分布?

A9: InfluxDB集群自动分布分片:

  • 每个数据库和保留策略组合创建一个分片组
  • 分片组包含多个分片,分布在不同数据节点上
  • 分片复制因子决定每个分片的副本数量
  • 可以使用 influxd-ctl rebalance 重新平衡分片分布

Q10: 如何迁移现有单节点到集群?

A10: 单节点迁移到集群的步骤:

  • 安装并配置InfluxDB集群
  • 使用 influxd backup 备份单节点数据
  • 使用 influxd restore 将数据恢复到集群
  • 验证数据完整性
  • 切换应用程序连接到集群协调节点

集群最佳实践

  1. 元数据节点奇数部署:建议部署3或5个元数据节点,确保集群高可用性
  2. 数据节点扩容:根据数据量和写入负载,及时添加数据节点
  3. 监控先行:部署完善的监控和告警系统
  4. 定期备份:定期备份集群元数据和关键业务数据
  5. 合理配置分片:根据数据量和查询模式,调整分片数量和复制因子
  6. 使用协调节点:将协调节点与数据节点分离,提高查询性能
  7. 启用认证授权:保护集群安全,限制访问权限
  8. 定期维护:定期检查集群状态,优化配置参数
  9. 测试故障恢复:定期进行故障恢复演练
  10. 文档化配置:详细记录集群配置和操作流程