docker-compose 搭建 InfluxDB Cluster
InfluxDB Cluster 官网
GitHub:https://github.com/chengshiwen/influxdb-cluster
Wiki 文档:https://github.com/chengshiwen/influxdb-cluster/wiki
下载地址:https://github.com/chengshiwen/influxdb-cluster/releases
架构
InfluxDB Cluster 安装由两组独立的进程组成:Data 节点和 Meta 节点。集群内的通信如下所示:
网络架构图
端口说明
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 节点通信。
服务器说明
IP | 角色 |
---|---|
172.16.16.119 | influxdb-meta-01 |
172.16.16.120 | influxdb-meta-02, influxdb-data-01 |
172.16.16.121 | influxdb-meta-03, influxdb-data-02 |
1.Meta 节点要求
InfluxDB Cluster 需要 至少三个 Meta 节点 和 奇数个 Meta 节点 以实现高可用和冗余。不建议超过三个 Meta 节点,除非您的服务器之间的通信存在长期可靠性问题。
2.Data 节点要求
InfluxDB Cluster 需要 至少两个 Data 节点 才能实现高可用性和冗余。您需要配置自己的负载均衡器以将客户端流量发送到端口 8086(HTTP API 的默认端口)。
部署前准备
# 3台服务器都需要做如下准备
1. 安装 docker
2. 安装 docker-compose
3. 同步时间
4. 关闭防火墙
5. 关闭 selinux
6. 添加 hosts 解析 (重要)
cat >> /etc/hosts << EOF
172.16.16.119 influxdb-meta-01
172.16.16.120 influxdb-meta-02 influxdb-data-01
172.16.16.121 influxdb-meta-03 influxdb-data-02
EOF
部署 Meta 节点
# 在 172.16.16.119 上 部署 influxdb-meta-01
mkdir -p /data/docker-compose/influxdb-meta-01
cd /data/docker-compose/influxdb-meta-01
cat >> docker-compose.yml << EOF
version: "3.5"
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
deploy:
resources:
limits:
cpus: '2'
memory: 3G
network_mode: "host"
volumes:
- ./data:/var/lib/influxdb
EOF
docker-compose up -d
# 在 172.16.16.120 上 部署 influxdb-meta-02
mkdir -p /data/docker-compose/influxdb-meta-02
cd /data/docker-compose/influxdb-meta-02
cat >> docker-compose.yml << EOF
version: "3.5"
services:
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
deploy:
resources:
limits:
cpus: '2'
memory: 3G
network_mode: "host"
volumes:
- ./data:/var/lib/influxdb
EOF
docker-compose up -d
# 在 172.16.16.121 上 部署 influxdb-meta-03
mkdir -p /data/docker-compose/influxdb-meta-03
cd /data/docker-compose/influxdb-meta-03
cat >> docker-compose.yml << EOF
version: "3.5"
services:
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
deploy:
resources:
limits:
cpus: '2'
memory: 3G
network_mode: "host"
volumes:
- ./data:/var/lib/influxdb
EOF
docker-compose up -d
部署 Data 节点
# 在 172.16.16.120 上 部署 influxdb-data-01
mkdir /data/docker-compose/influxdb-data-01
cd /data/docker-compose/influxdb-data-01
cat >> docker-compose.yml << EOF
version: "3.5"
services:
influxdb-data-01:
image: chengshiwen/influxdb:1.8.10-c1.1.1-data
container_name: influxdb-data-01
hostname: influxdb-data-01
restart: unless-stopped
deploy:
resources:
limits:
cpus: '2'
memory: 3G
network_mode: "host"
volumes:
- ./data:/var/lib/influxdb
EOF
docker-compose up -d
# 在 172.16.16.121 上 部署 influxdb-data-02
mkdir /data/docker-compose/influxdb-data-02
cd /data/docker-compose/influxdb-data-02
cat >> docker-compose.yml << EOF
version: "3.5"
services:
influxdb-data-02:
image: chengshiwen/influxdb:1.8.10-c1.1.1-data
container_name: influxdb-data-02
hostname: influxdb-data-02
restart: unless-stopped
deploy:
resources:
limits:
cpus: '2'
memory: 3G
network_mode: "host"
volumes:
- ./data:/var/lib/influxdb
EOF
docker-compose up -d
启动集群
# 在 172.16.16.119 上操作
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
测试
# 在 172.16.16.119 上操作
# 创建数据库
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'
# 查询数据
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'"