扩容kafka之后,针对扩容之前的topic进行重新平衡leader,Replicas,Isr
【kafka运维】你真的懂数据迁移吗?
分区副本重分配+注意事项+LogiKM简化迁移流程(1)
Kafka的灵魂伴侣Logi-KafkaManger(4)之运维管控–集群运维(数据迁移和集群在线升级)
生成分配计划获取kafka推荐的重分配策略
{
“topics”: [{
“topic”: “test10”
}],
“version”: 1
}
bin/kafka-reassign-partitions.sh --zookeeper zk01.td.com:2181 \
–topics-to-move-json-file topics-to-move.json \
–broker-list “0,1” \
–generate
结果入下图,生成了两条信息,第一条为现在的分配情况,第二条为计划更改的内容
把计划修改的结果复制,放在第二个json文件中,这里取名为reassignment-json-file.json
3.根据推荐执行分配计划
运行kafka-reassign-partition.sh命令根据上述执行计划生成的结果进行分配,命令如下:
bin/kafka-reassign-partitions.sh \
–zookeeper zk01.td.com:2181 \
–reassignment-json-file reassignment-json-file.json \
–execute
**
迁移的过称的思想是,增加副本,同步数据,删除原来的副本
迁移的过程是先把原来的分区日志文件标记为删除状态进行删除,同时在要迁移的位置新建文件日志,其实就是在要迁移的位置新建一个副本,同步完成之后,再把原来的位置的日志文件删掉**
查看topic,已经重新分配
1.1版本正式支持分区在不同路径间的迁移
为什么线上Kafka机器各个磁盘间的占用不均匀,经常出现“一边倒”的情形?这是因为Kafka只保证分区数量在各个磁盘上均匀分布,但它无法知晓每个分区实际占用空间,故很有可能出现某些分区消息数量巨大导致占用大量磁盘空间的情况。在1.1版本之前,用户对此毫无办法,因为1.1之前Kafka只支持分区数据在不同broker间的重分配,而无法做到在同一个broker下的不同磁盘间做重分配。1.1版本正式支持副本在不同路径间的迁移
在一台Broker上用多个路径存放分区
在kafka/conf/server.properties
log.dirs=kafka-logs-5,kafka-logs-6,kafka-logs-7,kafka-logs-8
注意同一个Broker上不同路径只会存放不同的分区,而不会将一个分区的多个副本存放在同一个Broker; 不然那副本就没有意义了(容灾)
迁移的json文件示例
{
"version": 1,
"partitions": [{
"topic": "test_create_topic4",
"partition": 2,
"replicas": [0],
"log_dirs": ["/Users/xxxxx/work/IdeaPj/source/kafka/kafka-logs-5"]
}, {
"topic": "test_create_topic4",
"partition": 1,
"replicas": [0],
"log_dirs": ["/Users/xxxxx/work/IdeaPj/source/kafka/kafka-logs-6"]
}]
}
bin/kafka-reassign-partitions.sh --zookeeper xxxxx --reassignment-json-file config/reassignment-json-file.json --execute --bootstrap-server
xxxxx:9092 --replica-alter-log-dirs-throttle 10000
数据量太大,需要将过期的.log数据保存时间临时缩小
减少迁移的数据量: 如果要迁移的Topic 有大量数据(Topic 默认保留7天的数据),可以在迁移之前临时动态地调整retention.ms 来减少数据量,比如下面命令改成1小时; Kafka 会主动purge 掉1小时之前的数据;
动态修改topic的日志保留时间:
增删改 配置 --alter
删除配置: --delete-config k1=v1,k2=v2
添加/修改配置: --add-config k1,k2
选择类型: --entity-type (topics/clients/users/brokers/broker-
loggers) # 如果针对topic级别的修改 --entity-type topics
类型名称: --entity-name # 如果上面的选择类型(--entity-type topics)针对topic级别的修改 ,需要指定topic的名字 --entity-name topicName
Topic添加/修改动态配置
–add-config
bin/kafka-configs.sh --bootstrap-server xxxxx:9092 --alter --entity-type topics --entity-name test_create_topic1 --add-config file.delete.delay.ms=3000,retention.ms=36000
数据过期删除后,开始执行迁移
迁移完成前删除配置
Topic删除动态配置
–delete-config
sh bin/kafka-configs.sh --bootstrap-server xxxxx:9092 --alter --entity-type topics --entity-name test_create_topic1 --delete-config file.delete.delay.ms,retention.ms
迁移过程注意流量陡增对集群的影响 ,Kafka提供一个broker之间复制传输的流量限制,限制了副本从机器到另一台机器的带宽上限,这个限制主要是显示副本之间的数据同步
当重新平衡集群,引导新broker,添加或移除broker时候,这是很有用的。因为它限制了这些密集型的数据操作从而保障了对用户的影响、 例如我们上面的迁移操作加一个限流选项-- throttle 50000000 #单位 B/s
注意:限流也会限制其他没有参加迁移的分区副本之间的限流,需要计算好正常的副本间同步流量,不要小于此值
执行迁移脚本时,增加限流
bin/kafka-reassign-partitions.sh --zookeeper xxxxx:2181 --reassignment-json-file config/reassignment-json-file.json --execute -- throttle 50000000
在后面加上一个—throttle 50000000 参数, 那么执行移动分区的时候,会被限制流量在50000000 B/s 加上参数后你可以看到
需要注意的是,如果你迁移的时候包含 副本跨路径迁移(同一个Broker多个路径)那么这个限流措施不会生效,你需要再加上 --replica-alter-log-dirs-throttle 这个限流参数,它限制的是同一个Broker不同路径直接迁移的限流;
如果你想在重新平衡期间修改限制,增加吞吐量,以便完成的更快。你可以重新运行execute命令,用相同的reassignment-json-file