原创|互联网公司必备利器Kafka终极入门,最后一篇

点击上方“Python与算法社区”,选择“星标”公众号


640

Kafka原创系列教程往期:

老朱:Kafka入门教程(1)

Kafka入门教程(2): 我是 Zookeeper

深入浅出Kafka(3):我的生命是如何运转的?

640?wx_fmt=png


1

Kafka分布式集群搭建


基于第一节教程中配置的dcoker kafka 镜像,基于kakfa镜像创建容器。创建3台kafka容器,同样将容器指定backend桥接网络,这样做的好处是容器都处于一个局域网中,且你可以通过主机名或者容器名称直接访问,不需要知道IP地址。


如果不指定自定义的桥接网络,而使用模型的网络,你可能需要使用docker的links命令,使得他们之间可以通过容器名称互连。


640?wx_fmt=png


在第二节的zookeeper教程的基础上,我启动了3个zookeeper节点。分别命名为zk1,zk2,zk3。


同样首先基于kafka镜像启动容器,指定桥接网络,与主机名、容器名方便我们操作。


dockerrun -it -d –networkbackend –name kafka1 –hostnamekafka1 kafka:1.2


使用上面的命令,分别创建kafka1,kafka2,kafka3三个容器,奇怪的是我的kafka容器无法与三个容器通信。如果你能够通信的话恭喜你,如果不能的话尝试我下面的做法。


使用dockerinspect 容器名称  命令查看容器的状态

dockerinspect zk1


640?wx_fmt=png


很奇怪我没有创建过这个桥接网络啊,使用docker network ls


640?wx_fmt=png

发现还真有,真是奇怪的很,因此我重新启动kafka容器使得他们处于同一个桥接网络中。


docker run -it -d –network docker_backend–name kafka1 –hostname kafka1kafka:1.2


成功通信。进入到容器内部查看目录结构


640?wx_fmt=png



新建一个data目录负责存放kafka数据,并配置config中的server.properties

修改配置文件中的两项,broker.id是唯一的,用来标识不同的broker,配置监听器,标识borker将会监听来自9092端口的请求。


640?wx_fmt=png


配置zookeeper


640?wx_fmt=png



同理,按照这种配置,在其他两台kafka中相同的步骤来配置,id号分别为2,3。监听器主机名需要对应的修改。

 

2

启动三台kafka


分别启动三台kafka

./bin/kafka-server-start.shconfig/server.properties &

 

创建分区,指定zookeeper,设置3个分区,为每个分区配置3个副本

./bin/kafka-topics.sh--create --zookeeper zk1:2181 --replication-factor  3--partitions 3 --topic testopic

创建完成之后,


640?wx_fmt=png


进入data目录里面查看可以看到testopic三个分区,有意思的是另外两个kafka的data目录里面也是同样的。也就是说创建三个副本,这个三个副本不存在同一个broker中。仔细想一下,如果在同一个broker中,这个副本毫无意义,当broker挂掉的时候,这个副本也将不能提供任何服务。


640?wx_fmt=png


3个broker每个分区指定3个副本,那如果指定4个呢?会存在partition与其副本在同一个broker中

640?wx_fmt=png


报错了,提示副本数不能大于broker。也就明了我的猜想,partition不会与其副本在同一个broker中,因为这样毫无意

 

者程序


640?wx_fmt=png


入到data目,并打印log文件,可以看到生者生的消息。


640?wx_fmt=png


启动消费者命令

bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092--from-beginning --topic testopic


从命令来看并没有指定zookeeper地址。那么offset如何协调呢?实际上在新版kafka中offset以topic的形式存放在kafka中,老版本的kafka是将offset存放在zookeeper中,consumer消费消息需要指定zookeeper地址,kafka地址,新版本后消费者将不再依赖zookeeper。实际上offset的存放的地址,依赖kafka consumer的版本,如果consumer是新版本,则offset会以topic的形式存放在kafka中。


进入到zookeeper中查看


640?wx_fmt=png


生成了一个名__consumer_offsets的topic。

入到zookeeper中 get /brokers/topics/testopic


640?wx_fmt=png


以“2”:[2,3,1]例,表示partition2分别存在broker2,broker3,broker1中,因副本数置的3。


再看一下__consumer_offsets的topic


640?wx_fmt=png


生成了50个partition,并且都没有副本,随机的分布在3台broker中。


到其中的一台broker中看data目生成了很多__consumer_offset 的partition

    

640?wx_fmt=png

打印partition的log文件


640?wx_fmt=png


3

总结


然而并没有找到我感兴趣的offset具体的,但是包含了consumer的信息,至少已经证明offset是存放在kafka中,而不是zookeeper中了,不是


老版本的consumer接口在消消息候,并不会每消一个消息就提交一次offsetzookeeper,因为这样容易造成zookeeper担太大(即使zookeeper也是一个强大的分布式写系),而是会消一部分消息后再提交。这样可能会致消者程序挂掉,offset没有提交,那么下次可能会到重复数据。将offset存放到kafka.


从上面的实验可以看到,我入了几条数据,但是生成了50个partition,也就是此刻kafka允有50个consumer来并行同不同partition中的消息,个吞吐量是很惊人的


虽然zookeeper很快,但是之前的文章提到,zookeeper数据可以从leader或者follower,但是写数据必由leader写,然后follower再同步leader中的数据。从网IO瓶比起来新版本kafka的做法允更多消者同工作,且更新offset理消息的batch size可以置的更小。


因此在接口开发过程中,者甚至感受不到zookeeper的存在,将更多的精力放在开发业务


熟悉kafka原理与配置方法,相信根据接口开务对于你来将会非常easy,kafka入教程更新到此,如果还对kafka有什么疑,可以提出来一起讨论

 

640?wx_fmt=png


Kafka原创系列教程

老朱:Kafka入门教程(1)

Kafka入门教程(2): 我是 Zookeeper

深入浅出Kafka(3):我的生命是如何运转的?



640640?wx_fmt=jpeg


原创干货在等你

长按扫码可关注 



点个在看smiley_66.png


发布了115 篇原创文章 · 获赞 40 · 访问量 10万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览