1. InfluxDB Cluster高可用架构解析

第一次接触InfluxDB Cluster时,很多人会疑惑它和单机版有什么区别。简单来说,Cluster版本就像是把多个单机版InfluxDB用"绳子"绑在一起,让它们能够协同工作。这根"绳子"就是集群的元数据服务(Meta Service),它负责记录哪些数据存放在哪个节点上。

高可用性的核心在于冗余设计。想象你有个重要文件,如果只存在一个U盘里,U盘丢了文件就没了。但如果你同时拷贝到三个U盘,就算丢一个也不影响。InfluxDB Cluster也是这个原理,通过至少三个Meta节点和两个Data节点的配置,确保任何单台机器宕机时,系统仍能正常运行。

关键组件分工很明确:

  • Meta节点:相当于集群的"大脑",存储分片位置、用户权限等元数据。建议用配置一般的服务器即可,因为它的数据量不大但要求高可用。
  • Data节点:真正的"苦力",负责存储时序数据和查询计算。需要根据数据量配置高性能服务器,特别是SSD硬盘对写入性能提升明显。

我在实际部署中发现,很多新手容易混淆端口用途。这里有个记忆技巧:

  • 8091是Meta节点的API端口(好比管理后台入口)
  • 8089是Meta节点间的私密热线(内部通信专用)
  • 8088是Data节点的内部通讯端口
  • 8086是Data节点对外的服务端口(应用连接这个)

2. 部署前的关键准备工作

2.1 硬件与网络规划

去年给某物联网平台部署集群时,曾因网络延迟导致同步异常。后来我们用ping测试所有节点间延迟,确保都在2ms以内。建议提前做好这些检查:

  1. 服务器规格

    • Meta节点:2核4GB起步(实测3节点集群每小时处理约50MB元数据)
    • Data节点:根据数据量配置,通常8核32GB起步,需要SSD存储
  2. 网络要求

    # 测试节点间延迟(所有节点互相测试)
    ping -c 10 node2
    # 测试带宽(在node1执行)
    iperf -s
    # 在node2执行
    iperf -c node1 -t 20
    
  3. 磁盘规划

    # 建议的目录结构
    mkdir -p /influx/{meta,data,wal,hh}
    chown -R influxdb:influxdb /influx
    
    • data目录存放TSM引擎数据文件
    • wal目录存放预写日志
    • hh目录用于 hinted handoff 临时存储

2.2 软件版本选择

官方社区版和企业版功能差异较大,我们选择的是chengshiwen维护的开源集群版。这里有个坑要注意:v1.8.10-c1.1.2存在meta节点重启后无法自动加入集群的问题,推荐使用v1.8.10-c1.2.0修复版。

下载安装包时注意架构匹配:

# AMD64架构
wget https://github.com/chengshiwen/influxdb-cluster/releases/download/v1.8.10-c1.2.0/influxdb-cluster_1.8.10-c1.2.0_linux_amd64.tar.gz

# ARM架构
wget https://github.com/chengshiwen/influxdb-cluster/releases/download/v1.8.10-c1.2.0/influxdb-cluster_1.8.10-c1.2.0_linux_arm64.tar.gz

3. Meta节点集群搭建实战

3.1 基础配置

三节点是最小高可用配置,这里以node1、node2、node3为例。每台机器都需要修改配置文件:

# influxdb-meta.conf关键配置
bind-address = ":8091"
hostname = "node1"  # 各节点修改为对应主机名

[meta]
dir = "/influx/meta"
bind-address = ":8089"
http-bind-address = ":8091"

启动命令建议用systemd管理:

# /etc/systemd/system/influxdb-meta.service
[Unit]
Description=InfluxDB Meta Node

[Service]
ExecStart=/usr/bin/influxd-meta -config /etc/influxdb/influxdb-meta.conf
Restart=always

[Install]
WantedBy=multi-user.target

3.2 集群初始化

在node1上执行初始化(仅第一次需要):

influxd-ctl add-meta node1:8091
influxd-ctl add-meta node2:8091 
influxd-ctl add-meta node3:8091

验证集群状态时,常见问题有:

  1. 端口未开放:检查防火墙 firewall-cmd --list-ports
  2. 主机名解析失败:确保/etc/hosts包含所有节点IP映射
  3. 时间不同步:安装ntpdate同步时间

4. Data节点集群配置详解

4.1 多节点部署

Data节点建议至少部署2个实现冗余。配置文件关键参数:

# influxdb.conf
bind-address = ":8088"
hostname = "node1"

[http]
bind-address = ":8086"
auth-enabled = true  # 建议开启认证

[data]
dir = "/influx/data"
wal-dir = "/influx/wal"

[hinted-handoff]
dir = "/influx/hh"

启动后需要将节点加入集群:

influxd-ctl add-data node1:8088
influxd-ctl add-data node2:8088

4.2 权限控制实践

生产环境一定要配置JWT认证。分享一个自动化脚本生成token:

import jwt
import time

secret = "your_shared_secret"
payload = {
    "username": "admin",
    "exp": int(time.time()) + 3600  # 1小时过期
}
token = jwt.encode(payload, secret, algorithm="HS256")
print(token.decode())

测试API访问:

curl -G "http://node1:8086/query" \
  --data-urlencode "q=SHOW DATABASES" \
  --header "Authorization: Bearer $TOKEN"

5. 负载均衡与生产调优

5.1 Nginx负载均衡配置

InfluxDB Cluster本身没有LB功能,推荐用Nginx做四层负载:

upstream influx_backend {
    least_conn;  # 最少连接算法
    server node1:8086 max_fails=3 fail_timeout=30s;
    server node2:8086 max_fails=3 fail_timeout=30s;
    check interval=3000 rise=2 fall=3 timeout=1000;
}

server {
    listen 8086;
    location / {
        proxy_pass http://influx_backend;
        proxy_set_header Host $host;
    }
}

5.2 性能调优经验

根据线上运行经验,这些参数值得关注:

  1. 写入优化

    [data]
    cache-snapshot-memory-size = "256m"  # 默认16MB太小
    series-id-set-cache-size = 100
    
  2. 查询优化

    [coordinator]
    query-timeout = "300s"  # 复杂查询超时时间
    max-concurrent-queries = 50
    
  3. 监控指标

    # 查看写入性能
    SELECT * FROM "_internal".."write" WHERE time > now() - 1h
    
    # 查看查询耗时
    SELECT * FROM "_internal".."queryExecutor" WHERE time > now() - 1h
    

曾经处理过一个案例:某客户写入速度突然下降,最后发现是wal目录所在磁盘空间不足。现在我们会定期检查这些关键指标:

  • 磁盘剩余空间
  • 内存swap使用率
  • 网络重传率
  • 节点间时钟偏移

6. 常见故障处理手册

6.1 节点离线处理

当某个Data节点宕机时,集群会自动启用hinted handoff机制。恢复步骤:

  1. 检查hh目录积压数据:
    du -sh /influx/hh
    
  2. 启动节点后观察日志:
    journalctl -u influxdb -f
    
  3. 强制重新同步(必要时):
    influxd-ctl update-data node1:8088
    

6.2 脑裂问题处理

Meta节点网络分区可能导致脑裂。去年遇到一次,解决方案是:

  1. 停用所有节点
  2. 在多数派节点执行:
    influxd-meta -config influxdb-meta.conf -force-new-cluster
    
  3. 重新加入其他节点

重要数据操作前,建议先备份meta目录:

# 在线备份
influxd-ctl backup /backup/influx-meta

7. 生产环境最佳实践

经过多个项目验证,这些经验值得分享:

  1. 容量规划

    • 每百万数据点约占用1.5MB磁盘空间
    • 写入吞吐量建议控制在5万点/秒/节点以内
  2. 监控方案

    [monitor]
    store-enabled = true
    store-database = "_internal"
    store-interval = "10s"
    
  3. 备份策略

    # 全量备份
    influxd backup -portable -host node1:8088 /backup/full
    
    # 增量备份
    influxd backup -portable -host node1:8088 -start 2023-01-01T00:00:00Z /backup/incr
    
  4. 升级注意事项

    • 先升级Meta节点,再升级Data节点
    • 每个节点升级后观察30分钟再处理下一个
    • 保留回滚所需的旧版本二进制文件

有次升级差点翻车,幸亏提前做了这几点:

  1. 在测试环境验证过升级流程
  2. 备份了所有meta和data目录
  3. 选择业务低峰期操作
  4. 准备了回滚脚本
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐