集群管理
集群扩容
开始之前,请停止将历史数据写入InfluxDB。历史数据具有过去任何时间的时间戳。在写入历史数据时执行重新平衡可能会导致数据丢失。
集群扩容包括两个步骤:
- 加入新的data节点
- 重新平衡集群
加入节点
加入节点请使用add-data
命令,且请仅对新加入的节点执行一次该命令
# Pattern
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret <internal-share-secret> add-data <data-node-tcp-bind-address>
# Example
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret 'someSecretKey' add-data enterprise-data-03:8088
若因故障、更改配置或其他原因需要更换、重新上线节点,请使用
update-data
命令。具体参照更换节点章节。
集群平衡
集群平衡有以下两个目标:
shards
在所有data
节点上均匀分布- 保证每个shard都具备
n
个副本,n
为复制因子
集群平衡从扩容的目的出发,有以下两个可选的平衡方案:
- 加入节点以扩充磁盘容量或增加写入吞吐量,选方案1
- 加入节点以提高数据可用性或增加查询吞吐量,选方案2
以下两个方案假设原data节点有
enterprise-data-01
和enterprise-data-02
两个,数据库的复制因子为2,新加入节点为enterprise-data-03
.
方案1
该方案保持复制因子不变,新加入节点起到扩充磁盘容量或增加写入吞吐量的作用。
步骤1:截断热分片
热分片指的是正在接收写入请求的分片。执行以下命令,集群将自动创建一个分布在所有data节点上的分片接收新写入的请求,除此之外的分片将变为冷分片:
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret 'someSecretKey' truncate-shards
预期输出:
Truncated shards.
执行该命令后,保证了数据的一致性,可对所有冷分片调整在集群节点上的分布情况,而任何热碎片或新碎片现在都均匀分布在集群中,不需要进一步干预。
步骤2:确认冷分片情况
在加入了新的data节点且复制因子不变的情况下,每个节点所拥有的分片需要进行调整。这一步需要确认哪些分片需要复制到新节点上,而哪些分片需要从旧节点上移除。
在这一步,没有具体的要求和算法规定哪些分片要迁移到新节点上,只需要在加入新节点后,冷分片数量在各个节点上分布大致均匀,或者根据机器性能差异,达到每个机器cpu、内存即可。
执行命令查看分片在集群的分布情况:
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret 'someSecretKey' show-shards
预期输出:
Shards
==========
ID Database Retention Policy Desired Replicas [...] End Owners
21 telegraf autogen 2 [...] 2017-01-26T18:00:00Z [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088}]
22 telegraf autogen 2 [...] 2017-01-26T18:05:36.418734949Z* [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088}]
24 telegraf autogen 2 [...] 2017-01-26T19:00:00Z [{5 enterprise-data-02:8088} {6 enterprise-data-03:8088}]
执行命令查看本地节点的分片信息:
find /var/lib/data/ -mindepth 3 -type d -exec du -h {} \;
步骤3:复制分片
执行命令:
# Pattern
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret <internal-share-secret> copy-shard <source_TCP_address> <destination_TCP_address> <shard_ID>
# Example
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret 'someSecretKey' copy-shard enterprise-data-01:8088 enterprise-data-03:8088 22
预期输出:
Copied shard <shard_ID> from <source_TCP_address> to <destination_TCP_address>
步骤4:确认已复制的分片
执行命令查看分片在集群的分布情况:
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret 'someSecretKey' show-shards
预期输出:
Shards
==========
ID Database Retention Policy Desired Replicas [...] End Owners
22 telegraf autogen 2 [...] 2017-01-26T18:05:36.418734949Z* [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088} {6 enterprise-data-03:8088}]
确认本地节点的分片文件,分片文件位于:
/var/lib/data/<database>/<retention_policy>/<shard_ID>
举个例子,查看22号分片文件信息:
# On the source data node (enterprise-data-01)
~# ls /var/lib/data/telegraf/autogen/22
000000001-000000001.tsm # 👍
# On the new data node (enterprise-data-03)
~# ls /var/lib/data/telegraf/autogen/22
000000001-000000001.tsm # 👍
分片复制后,需要同时确认show-shards命令和本地分片文件中被复制的分片信息正常,二者缺一不可。如果出现异常情况,需要再次执行步骤3.
步骤5:移除不必要的分片
这一步将原data节点不必要的分片移除,使分片副本数与复制因子保持一致,且分片分布大致均匀,以达到重平衡的目的。
执行命令:
influxd-ctl -auth-type jwt -secret <internal-share-secret> remove-shard <source_TCP_address> <shard_ID>
预期输出:
Removed shard <shard_ID> from <source_TCP_address>
步骤6:确认集群重平衡
全部分片迁移完毕后,执行命令:
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret 'someSecret' show-shards
预期输出:
Shards
==========
ID Database Retention Policy Desired Replicas [...] End Owners
22 telegraf autogen 2 [...] 2017-01-26T18:05:36.418734949Z* [{5 enterprise-data-02:8088} {6 enterprise-data-03:8088}]
可看到迁移的分片仅有两个owner,与复制因子保持一致。
方案2
该方案增加复制因子不变,新加入节点起到提高集群可用性或增加查询吞吐量的作用。
再次说明,假设原data节点有
enterprise-data-01
和enterprise-data-02
两个,数据库的复制因子为2,新加入节点为enterprise-data-03
.
步骤1:更新保留策略
在这一步,更新每个保留策略,将复制因子从2变为3,保证系统自动将新创建的分片分布在3个data节点上。
执行命令:
curl -XPOST "http://enterprise-data-02:8086/query" --header 'Authorization: Bearer someToken' --data-urlencode "q=ALTER RETENTION POLICY autogen ON telegraf REPLICATION 3"
查看更改后的结果:
curl -XPOST "http://enterprise-data-02:8086/query" --header 'Authorization: Bearer someToken' --data-urlencode "q=SHOW RETENTION POLICIES ON telegraf"
预期输出:
{"results":[{"statement_id":0,"series":[{"columns":["name","duration","shardGroupDuration","replicaN","default"],"values":[["autogen","0s","168h0m0s",3👍,true]]}]}]}
步骤2:截断热分片
热分片指的是正在接收写入请求的分片。执行以下命令,集群将自动创建一个分布在所有data节点上的分片接收新写入的请求,除此之外的分片将变为冷分片:
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret 'someSecretKey' truncate-shards
预期输出:
Truncated shards.
执行该命令后,保证了数据的一致性,可对所有冷分片调整在集群节点上的分布情况,而任何热碎片或新碎片现在都均匀分布在集群中,不需要进一步干预。
步骤3:确认冷分片情况
在加入了新的data节点且复制因子不变的情况下,每个节点所拥有的分片需要进行调整。这一步需要确认哪些分片需要复制到新节点上,而哪些分片需要从旧节点上移除。
在这一步,没有具体的要求和算法规定哪些分片要迁移到新节点上,只需要在加入新节点后,冷分片数量在各个节点上分布大致均匀,或者根据机器性能差异,达到每个机器cpu、内存即可。
因为方案2更改了复制因子,冷分片数量需要和复制因子保持一致,因此以下步骤仅需要复制冷分片到新节点上,不需要从原节点移除。
执行命令查看分片在集群的分布情况:
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret 'someSecretKey' show-shards
预期输出:
Shards
==========
ID Database Retention Policy Desired Replicas [...] End Owners
21 telegraf autogen 3 [...] 2017-01-26T18:00:00Z [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088}]
22 telegraf autogen 3 [...] 2017-01-26T18:05:36.418734949Z* [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088}]
24 telegraf autogen 3 [...] 2017-01-26T19:00:00Z [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088} {6 enterprise-data-03:8088}]
执行命令查看本地节点的分片信息:
find /var/lib/data/ -mindepth 3 -type d -exec du -h {} \;
步骤4:复制分片
执行命令:
# Pattern
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret <internal-share-secret> copy-shard <source_TCP_address> <destination_TCP_address> <shard_ID>
# Example
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret 'someSecretKey' copy-shard enterprise-data-01:8088 enterprise-data-03:8088 22
预期输出:
Copied shard <shard_ID> from <source_TCP_address> to <destination_TCP_address>
步骤5:确认集群重平衡
执行命令查看分片在集群的分布情况:
./influxd-ctl -bind "localhost:8091" -auth-type jwt -secret 'someSecretKey' show-shards
预期输出:
Shards
==========
ID Database Retention Policy Desired Replicas [...] End Owners
22 telegraf autogen 3 [...] 2017-01-26T18:05:36.418734949Z* [{4 enterprise-data-01:8088} {5 enterprise-data-02:8088} {6 enterprise-data-03:8088}]
确认本地节点的分片文件,分片文件位于:
/var/lib/data/<database>/<retention_policy>/<shard_ID>
举个例子,查看22号分片文件信息:
# On the source data node (enterprise-data-01)
~# ls /var/lib/data/telegraf/autogen/22
000000001-000000001.tsm # 👍
# On the new data node (enterprise-data-03)
~# ls /var/lib/data/telegraf/autogen/22
000000001-000000001.tsm # 👍
分片复制后,需要同时确认show-shards命令和本地分片文件中被复制的分片信息正常,二者缺一不可。如果出现异常情况,需要再次执行步骤4.
可以看到,复制后的冷分片副本数量和复制因子保持一致,集群达到了重平衡。
更换节点
参考
wiki: Home · chengshiwen/influxdb-cluster Wiki · GitHub