前言
在生产环境下,kafka集群中发现遇到了性能瓶颈,主要体现在现有的集群下,某个topic的分区存储不够用了,生产者生产消息量太大,或者消费端消费速度跟不上生产进度,导致分区数据大量堆积;
在这种情况下,为缓解集群压力,可以考虑动态扩容kafka集群,也叫做服役新节点,本篇演示下如何基于现有的kafka集群快速服役一台新的kafka节点(或实例)
环境准备
1、虚拟机一台,并安装centos7的系统(或者阿里云等云服务器),4核8G 2、kafka_2.12-2.7.0 安装包,以及zookeeper安装包

kafka集群搭建
为演示后面的效果,需要提前搭建好kafka集群,这里演示下单机模式下的3节点kafka伪集群搭建过程
1、解压安装包
tar -zxvf kafka_2......
2、创建一个data目录,并在data目录下创建4个子目录
这些目录分别用于存储集群中各个kafka实例的数据 
3、进入kafka主目录下的config目录
将该目录下的server.properties 再复制出3份,伪集群模式,只需要启动的时候指明配置文件即可 
4、修改第3步中的4个配置文件
以server.properties为例进行说明,只需要修改其中几个关键的参数即可,参考如下配置
broker.id=1
listeners=PLAINTEXT://IP:9092
advertised.listeners=PLAINTEXT://IP:9092
log.dirs=/usr/local/soft/kafka/datas/data1
zookeeper.connect=IP:2181
其他的几个配置文件,只需要修改各自的 brokerId数字、端口号,数据存放目录即可,再次强调: brokerId数字,端口号和数据存放目录一定要改正确,避免出现各种意想不到的问题,这里我们规划的端口号分别是:9092,9093,9094,9095
5、启动kafka集群
先启动zookeeper服务,然后进入kafka的主目录下,依次执行下面的命令,先启动3个实例,留下一个实例用于后面的节点服役实验
./bin/kafka-server-start.sh -daemon ./config/server.properties
./bin/kafka-server-start.sh -daemon ./config/server1.properties
./bin/kafka-server-start.sh -daemon ./config/server2.properties
6、检查服务状态
可以看到,kafka集群已经启动了 
如果不放心,可以去zk中检查下node节点状况,通过命令行客户端检查ids节点下的kafka各个节点,如果出现下面的状态,说明集群中3个实例已经正常可以使用了

7、创建一个测试用的topic
./kafka-topics.sh --zookeeper IP:2181 --create --topic zcy222 --partitions 3 --replication-factor 3
然后可以使用下面的命令进行查看topic列表
./kafka-topics.sh --zookeeper IP:2181 --list

然后,使用下面的命令查看下上面创建的这个 zcy222这个主题的情况 
通过上面的主题信息展示情况,可以清楚的看到分区、副本的纯粹情况,到这里,集群搭建完成,同时,前置的准备工作也已经基本完成
接下来,将演示下服役新节点的完整步骤
服役新节点过程
所谓服役新节点,即在现有的集群基础上,动态扩展一个或多个新的节点,即将新的kafka实例加入到现有的集群节点中,从而起到分摊存储或增强集群吞吐能力的目的
在上面搭建集群的过程中,我们启动了3个实例,形成了3节点的kafka集群,另外还有一个server3.properties的配置文件,就是接下来要使用的启动第四个实例的配置文件
1、再启动一个kafka实例
进入kafka主目录,执行下面的命令
./bin/kafka-server-start.sh -daemon ./config/server3.properties
这时可以看到4个kafka实例全部存在了 
2、在bin目录下添加一个即将用于均衡的主题配置文件
配置内容如下,如果主题有多个,在后面继续追加,用逗号分割即可
{
"topics": [
{"topic": "zcy222"}
],
"version": 1
}
3、生成一个负载均衡的计划
进入binm目录下,执行下面的命令,生成一个即将进行分配的计划
./kafka-reassign-partitions.sh --zookeeper IP:2181 --topics-to-move-json-file topics-to-move.json --broker-list "1,2,3,4" --generate
执行完毕后得到下面的内容提示,得到即将分配的计划内容 
4、创建increase-replication-factor.json文件
即创建执行副本的文件,用于下面生成新的分配计划
在bin目录下创建increase-replication-factor.json 文件,将第三步中的计划内容拷贝到该文件中 
5、执行第四步中的副本计划
执行下面的命令
./kafka-reassign-partitions.sh --zookeeper IP:2181 --reassignment-json-file increase-replication-factor.json --execute
 从上面的输出日志看到对副本计划成功做了执行
6、验证第五步中的副本存储计划
执行下面的命令进行验证
./kafka-reassign-partitions.sh --zookeeper IP:2181 --reassignment-json-file increase-replication-factor.json --verify
可以看到 broker上面这时候存在了1,2,3,4个节点,即节点4也被加入到当前主题的分区中 
7、查看当前主题的分区以及副本描述信息
./kafka-topics.sh --zookeeper IP:2181 --describe --topic zcy222
对比上文中第一次执行该命令时候的展示内容,可以发现这时候 isr信息已经发生了变化 
也可以进入到zookeeper的客户端窗口,查看broker的信息,已经发生了变化 
通过上面的演示,我们成功将一个新节点动态服役到原来的集群下
|