前言
一个系统随着用户数增加,那么推送到kafka服务器的数据流量会增加。很有可能原有的服务器数量无法支撑更多的流量,接着就需要增加更多的服务来分摊流量。本篇接下来就会介绍,如何操作kafka数据在服务器之间迁移。
方法一:通过增加partition数量
通过增加partition数量的方式来迁移数据的方式是非常简单的,因为新建的partition肯定会均匀的分配到多节点上。首先准备三个kafka broker,创建一个topic,名称为demo1,partition为1,复制数为1,那么这个parition肯定在基本一台broker上。
一个topic使用一台服务器。如果我们想利用三台服务器来分摊原有的一台服务器,就需要先增加topic的partition数量。需要注意的是partition的数量只能增加,不能减少。
kafka-topics.sh --zookeeper localhost:2181 --alter --topic demo1 --partitions 3
可以看到kafka帮我们很顺利的,增加了partition数,并平均到了三台broker节点上。
方法二:通过重新分配partition
这次我们只开启一台broker,创建topic分配3个partition和一个复制数。
kafka-topics.sh --zookeeper localhost:2181 --create --topic demo2 --partitions 3 --replication-factor 1
可以看到3个partition全部在broker 0上。
生成partition配置文件
这里我们需要先添加一个文件topics.json,里面存放你需要重新分配的partition,注意格式一定要规范
接着输入以下命令,生成partition的配置文件
kafka-reassign-partitions.sh --zookeeper localhost:2181 --generate --broker-list 0,1,2 --topics-to-move-json-file topics.json
这里生成的分配方案是kafka建议的,我们可以调整一下broker id 和 partition id,修改成我们需要的方案
重新分配partition
将上面的生成的分配方案保存在reassignment.json文件中,这里我调整了一下broker id和partition id
执行下面命令后,开始对topic的partition进行重新分配,如果数据量比较大,会很慢。
kafka-reassign-partitions.sh --zookeeper localhost:2181 --execute --reassignment-json-file reassignment.json
查看任务状态
检查partition的再分配任务是否完成,如果完成,会显示成功。成功后,查看partition情况。
kafka-reassign-partitions.sh --zookeeper localhost:2181 --verify --reassignment-json-file reassignment.json
方法三:通过kafka manager进行分配
kafka manager 是yahoo的一个免费开源软件,它提供了一个web端,帮助我们很方便的查看kafka的基本信息和对kafka的一些基本操作
下载地址:https://github.com/yahoo/kafka-manager/releases 上面提供了release的zip包,我没有验证过不同操作系统和kafka版本的兼容性。如果出现兼容性问题,可以下载源代码,自行编译打包。本人在MacOS操作系统上,是自己通过源代码打包的方式安装的。
启动kafka manager
访问kafka manager页面
配置kafka参数
查看kafka信息
点击一个topic,进入详情
这里我们就可以通过鼠标,很容易的操作topic的partition了。操作很简单,Manual Partition Assignments和Generate Partition Assignment都可以生成partition分配计划配置。然后,通过Reassign partitions来执行分配。
Generate Partition Assignments
Manual Partition Assignments
Reassign partitions
点击Reassign partitions按钮,就会执行你刚才配置的partition计划
总结
文章提供了三种迁移kafka数据的方法,使用kafka manager会比较容易,原理其实也就是我们在方法二使用的几个命令,生成和执行分配partition计划。