kafka集群搭建
一、安装多节点ZooKeeper集群
下面就是在本机一台机器上安装3个节点的ZooKeeper集群,在多台机器上安装的方法和一台机器上是一样的,就是配置文件有微小的调整。
1.下载ZooKeeper包
https://www-us.apache.org/dist/zookeeper/stable/
下载带bin的tar.gz文件,目前是apache-zookeeper-3.5.6-bin.tar.gz
解压
tar -zxvf apache-zookeeper-3.5.6-bin.tar.gz |
把解压文件移动到/usr/local
sudo mv apache-zookeeper-3.5.6-bin /usr/local/ |
2.创建配置文件
在ZooKeeper的conf目录下创建3个配置文件zoo1.cfg,zoo2.cfg,zoo3.cfg,如果是在多台服务器上安装ZooKeeper集群可以取相同的配置文件名字。
zoo1.cfg
tickTime=2000 dataDir=/home/xl/zookeeper/data_logs/zookeeper1 clientPort=2181 initLimit=5 syncLimint=2 server.1=localhost:2888:3888 server.2=localhost:2889:3889 serve.3=localhost:2890:3890 |
zoo2.cfg
tickTime=2000 dataDir=/home/xl/zookeeper/data_logs/zookeeper2 clientPort=2182 initLimit=5 syncLimint=2 server.1=localhost:2888:3888 server.2=localhost:2889:3889 serve.3=localhost:2890:3890 |
zoo3.cfg
tickTime=2000 dataDir=/home/xl/zookeeper/data_logs/zookeeper3 clientPort=2183 initLimit=5 syncLimint=2 server.1=localhost:2888:3888 server.2=localhost:2889:3889 serve.3=localhost:2890:3890 |
关键参数:
-tickTime:zookeeper最小的时间单位,用于丈量心跳时间和超时时间等。通常设置成默认值2秒即可。 -dataDire:非常重要的参数!ZooKeeper会在内存中保存系统快照,并定期写入该路径指定的文件夹中。生产环境中需要注意该文件夹的磁盘占用情况。这个文件夹需要自己提前生成,不会根据配置文件自动生成。 -clientPort:ZooKeeper监听客户端连接的端口,一般设置为默认值2181即可。如果是多机器安装方案,可以指定相同的端口号,只要确保没有端口冲突就行,包括配置文件中所有端口没有冲突。 -initLimit:指定follower节点初始时连接leader节点的最大tick次数。假设是5,表示follower必须要在5×tickTime时间内连接上leader,否则被视为超时。 -syncLimit:设定了follower节点与leader节点进行同步的最大时间。也是以tickTime为单位。 -server.x=host:port:port:x必须是一个全局唯一的整数,且需要与myid文件中数字相对应,范围为1~255。第一个端口用于使follower节点连接leader节点,第二个端口用于leader选举。 |
3.创建myid文件
myid文件必须位于配置文件中的dataDir中,具体命令如下:
echo "1" > /home/xl/zookeeper/data_logs/zookeeper1/myid echo "2" > /home/xl/zookeeper/data_logs/zookeeper2/myid echo "3" > /home/xl/zookeeper/data_logs/zookeeper3/myid |
4.启动ZooKeeper
在ZooKeeper目录下执行命令:
bin/zkServer.sh start conf/zoo1.cfg bin/zkServer.sh start conf/zoo2.cfg bin/zkServer.sh start conf/zoo3.cfg |
5.检查集群状态
bin/zkServer.sh status conf/zoo1.cfg bin/zkServer.sh status conf/zoo2.cfg bin/zkServer.sh status conf/zoo3.cfg |
会显示出leader和follower:
ZooKeeper JMX enabled by default |
ZooKeeper JMX enabled by default |
ZooKeeper JMX enabled by default |
表明broker2是整个集群的leader,其他两个broker是follower,表明ZooKeeper集群启动成功。
也可以用jsp命令查看:
$jsp |
7104 Jps |
ZooKeeper的主进程名是QuorumPeerMain。如果是在多台机器上搭建ZooKeeper集群,那么每台机器上都至少应该有一个这样的进程被启动。
二、安装多节点kafka集群
使用一台机器模拟一个3节点的kafka集群的搭建。
1.下载kafka安装包
https://www-us.apache.org/dist/kafka/2.3.0/
下载kakfa_2.11-2.3.0.tgz,其中2.11是相应的Scala版本。
解压
tar -zxvf kafka_2.11-2.3.0.tgz |
把解压文件移动到/usr/local下
sudo mv kafka_2.11-2.3.0 /usr/local/ |
2.创建配置文件
conf/server1.properties
broker.id=0 listeners=PLAINTEXT://localhost:9092 log.dirs=/home/xl/kafka/data_logs/kafka1 zookeeper.connect=localhost:2181,localhost:2182,localhost:2183 zookeeper.connection.timeout.ms=6000 delete.topic.enable=true unclean.leader.election.enable=false |
conf/server2.properties
broker.id=1 listeners=PLAINTEXT://localhost:9093 log.dirs=/home/xl/kafka/data_logs/kafka2 zookeeper.connect=localhost:2181,localhost:2182,localhost:2183 zookeeper.connection.timeout.ms=6000 delete.topic.enable=true unclean.leader.election.enable=false |
conf/server3.properties
broker.id=2 listeners=PLAINTEXT://localhost:9094 log.dirs=/home/xl/kafka/data_logs/kafka3 zookeeper.connect=localhost:2181,localhost:2182,localhost:2183 zookeeper.connection.timeout.ms=6000 delete.topic.enable=true unclean.leader.election.enable=false |
重要参数:
-broker.id:整个集群中必须是唯一的整数,给每台服务器指定不同的broker id。 -listeners:broker监听器的csv列表,格式是[协议]://[主机名]:[端口]。该参数主要用于客户端连接broker使用,可以认为是broker端开放给clients的监听端口。如果不指定主机名,则表示绑定默认网卡;如果主机名是0.0.0.0,表示绑定所有网卡。kafka当前支持的协议类型包括PLAINTEXT、SSL及SASL_SSL等。对于未启动安全的kafka集群,使用PLAINTEXT足矣。如果启用了安全认证,可以考虑使用SSL或SASL_SSL协议。 -zookeeper.connection:必须同时指定所有的ZooKeeper节点。 -log.dirs:非常重要的参数!指定了kafka持久化消息的目录。必须设定,必须提前生成。若待保存的消息数量非常多,那么最好确保该文件夹下有充足的磁盘空间。该参数可以设置多个目录,以逗号分隔。在实际使用过程中,指定多个目录的做法是被推荐的,这样kafka可以把负载均匀地分配到多个目录下。 -unclean.leader.election.enable:false表示在ISR为空而此时leader又宕机了,kafka不允许从剩下存活的非ISR副本中选择一个当leader。 -delete.topic.enable:是否允许kafka删除topic。 |
3.启动kafka服务器
bin/kafka-server-start.sh config/server1.properties bin/kafka-server-start.sh -daemon config/server2.properties bin/kafka-server-start.sh -daemon config/server3.properties |
-daemon:表示启动后的kafka服务器后台运行。
查看kafka的logs目录下的server.log可以确认kafka broker是否已经成功启动。
也可以用jps命令:
$jps |
12240 Kafka |
kafka的主进程名是Kafka。
如果需要为集群增加更多的broker节点,只需要配置一份类似的配置文件,然后利用该文件直接运行启动命令即可。
三、验证部署
1.测试topic创建与删除
topic能够正确地创建与删除才能说明kafka集群在正常工作,因为通常它都表明了kafka的控制器controller已经被成功地选举出来并开始履行自身的职责。
创建一个topic,名为test-topic,3个分区,每个分区都分配3个副本:
bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 --create --topic test-topic --partitions 3 --replication-factor 3 |
Created topic test-topic.表明创建成功。
验证:
$bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 -list |
test-topic |
$bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 --describe --topic test-topic |
Topic:test-topic PartitionCount:3 ReplicationFactor:3 Configs: |
删除topic:
$bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 --delete --topic test-topic |
Topic test-topic is marked for deletion. |
这仅仅表示该topic被成功地标记为“待删除”,至于topic是否会被真正删除取决于broker端参数delete.topic.enable。
验证是否删除了:
$bin/kafka-topics.sh --zookeeper localhost:2181,localhost:2182,localhost:2183 -list |
输出就没有test-topic了。
2.测试消息发送与消费
打开两个终端,一个用于发送消息,另一个用于接受消息:
bin/kafka-console-producer.sh --broker-list localhost:9092,localhost:9093,localhost:9094 --topic test-topic |
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092,localhost:9093,localhost:9094 --topic test-topic --from-beginning |
3.生产者吞吐量测试
$bin/kafka-producer-perf-test.sh --topic test-topic --num-records 500000 --record-size 200 --throughput -1 --producer-props bootstrap.servers=localhost:9092,localhost:9093,localhost:9094 acks=-1 |
311727 records sent, 62345.4 records/sec (11.89 MB/sec), 1680.5 ms avg latency, 2362.0 ms max latency. |
表明这台机器上运行一个kafka producer的平均吞吐量是13MB/s,即占用104Mb/s,评价每秒能发送72432条消息,平均延时是1.69秒,最大延时是2.36秒,平均有50%的消息发送需要花费1.79秒。
4.消费者吞吐量测试
$bin/kafka-consumer-perf-test.sh --broker-list localhost:9092,localhost:9093,localhost:9094 --fetch-size 2000 --messages 500000 --topic test-topic |
start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec |
表明该环境中consumer在2秒多的时间内总共消费了95MB的消息,吞吐量为42MB/s。