大数据系列之Kafka集群环境部署

本文简要介绍Kafka基本概念、Kafka集群架构和Topic设计以及Kafka集群环境的配置部署,并且测试生产端和消费端的消息处理,加强对Kafka消息队列设计理念的理解。


1、Kafka基本概念

Kafka是一种分布式的,基于发布/订阅的消息系统。主要设计目标如下:

  • 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能
  • 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输
  • 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输
  • 同时支持离线数据处理和实时数据处理

Zookeeper是一种在分布式系统中被广泛用来作为:分布式状态管理、分布式协调管理、分布式配置管理、和分布式锁服务的集群。Kafka增加和减少服务器都会在Zookeeper节点上触发相应的事件kafka系统会捕获这些事件,进行新一轮的负载均衡,客户端也会捕获这些事件来进行新一轮的处理。

1.1 一些基本概念

Kafka中有些基本名词如下所示:

  • 消费者(Consumer):从消息队列中请求消息的客户端应用程序
  • 生产者(Producer) :向broker发布消息的应用程序
  • AMQP服务端(broker):用来接收生产者发送的消息并将这些消息路由给服务器中的队列,便于kafka将生产者发送的消息,动态的添加到磁盘并给每一条消息一个偏移量,所以对于kafka一个broker就是一个应用程序的实例
  • 主题(Topic):Topic在逻辑上可以被认为是一个queue。每条消费都必须指定它的topic,可以简单理解为必须指明把这条消息放进哪个queue里
  • 分区(Partition):为了使得Kafka的吞吐率可以水平扩展,物理上把topic分成一个或多个partition,每个partition在物理上对应一个文件夹,分区是kafka消息队列组织的最小单位,一个分区可以看作是一个FIFO( First Input First Output的缩写,先入先出队列)的队列

kafka分区是提高kafka性能的关键所在,当你发现你的集群性能不高时,常用手段就是增加Topic的分区,分区里面的消息是按照从新到老的顺序进行组织,消费者从队列头订阅消息,生产者从队列尾添加消息。

1.2 Kafka架构

1)Kafka集群架构
在这里插入图片描述如上图所示,一个典型的kafka集群中包含若干producer(可以是web前端产生的page view,或者是服务器日志,系统CPU、memory等),若干broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干consumer group,以及一个Zookeeper集群。Kafka通过Zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息。

2)Kafka Topic结构
Kafka集群中的消息,是通过Topic(主题)来进行组织的,如下图所示:

在这里插入图片描述
因为每条消息都被append到该partition中,是顺序写磁盘,因此效率非常高(经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)。每一条消息被发送到broker时,会根据paritition规则选择被存储到哪一个partition。如果partition规则设置的合理,所有消息可以均匀分布到不同的partition里,这样就实现了水平扩展。(如果一个topic对应一个文件,那这个文件所在的机器I/O将会成为这个topic的性能瓶颈,而partition解决了这个问题)

2、基础环境配置

服务器环境配置信息如下表所示:

角色主机名IP系统
Kafka集群tango-centos01192.168.112.101Centos7-X86_64
Kafka集群tango-centos02192.168.112.102Centos7-X86_64
Kafka集群tango-centos03192.168.112.103Centos7-X86_64
Zookeeper集群tango-centos01192.168.112.101Centos7-X86_64
Zookeeper集群tango-centos02192.168.112.102Centos7-X86_64
Zookeeper集群tango-centos03192.168.112.103Centos7-X86_64
3、Kafka集群环境部署
3.1 配置zookeeper集群环境

1)解压安装包到指定目录

[root@tango-centos01 src-install]# tar -xzvf kafka_2.11-1.1.0.tgz  -C /usr/local/elk

2)配置zookeeper集群,修改配置文件zookeeper.properties

[root@tango-centos01 config]# pwd
/usr/local/elk/kafka_2.11-1.1.0/config
[root@tango-centos01 config]# vi zookeeper.properties 
# the directory where the snapshot is stored.
dataDir=/usr/local/elk/kafka-data/zookeeper
# the port at which the clients will connect
clientPort=2181
# disable the per-ip limit on the number of connections since this is a non-production config
maxClientCnxns=0
tickTime=2000
initLimit=20
syncLimit=10
server.1=192.168.112.101:2888:3888
server.2=192.168.112.102:2888:3888
server.3=192.168.112.103:2888:3888
  • tickTime: 这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳
  • nitLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 5*2000=10 秒
  • syncLimit:这个配置项标识 Leader 与Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是5*2000=10秒
  • clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求
  • server.1 这个1是服务器的标识也可以是其他的数字, 表示这个是第几号服务器,用来标识服务器,这个标识要写到快照目录下面myid文件里
  • 192.168.112.101为集群里的IP地址,第一个端口是master和slave之间的通信端口,默认是2888,第二个端口是leader选举的端口,集群刚启动的时候选举或者leader挂掉之后进行新的选举的端口默认是3888
    3)创建zookeeper所需的目录
[root@tango-centos01 kafka-data]# mkdir zookeeper
[root@tango-centos01 kafka-data]# ls
zookeeper

4)在/data/zookeeper目录下创建myid文件,里面的内容为数字,用于标识主机,如果这个文件没有的话,zookeeper是没法启动的

[root@tango-centos01 zookeeper]# echo "1" > myid
[root@tango-centos01 zookeeper]# ls
myid
[root@tango-centos01 zookeeper]# cat myid
1

5)另外2个节点的zookeeper配置相同,除了修改myid文件

[root@tango-centos02 zookeeper]# cat myid
2
[root@tango-centos03 zookeeper]# cat myid
3

6)启动zookeeper集群,其中2机被选中为Leader

[root@tango-centos01 kafka_2.11-1.1.0]# nohup ./bin/zookeeper-server-start.sh  ./config/zookeeper.properties &
[root@tango-centos02 kafka_2.11-1.1.0]# nohup ./bin/zookeeper-server-start.sh ./config/zookeeper.properties  &
[root@tango-centos03 kafka_2.11-1.1.0]# nohup ./bin/zookeeper-server-start.sh ./config/zookeeper.properties  &

7)Zookeeper服务检查

[root@tango-centos01 kafka_2.11-1.1.0]# netstat -nlpt | grep -E "2181|2888|3888"
tcp6       0      0 192.168.112.101:3888    :::*       LISTEN      1318/java           
tcp6       0      0 :::2181                 :::*       LISTEN      1318/java
[root@tango-centos02 kafka_2.11-1.1.0]# netstat -nlpt | grep -E "2181|2888|3888"
tcp6       0      0 192.168.112.102:3888    :::*           LISTEN      1131/java           
tcp6       0      0 :::2181                 :::*           LISTEN      1131/java           
tcp6       0      0 192.168.112.102:2888    :::*            LISTEN      1131/java
[root@tango-centos03 kafka_2.11-1.1.0]# netstat -nlpt | grep -E "2181|2888|3888"
tcp6       0      0 192.168.112.103:3888    :::*         LISTEN      1126/java           
tcp6       0      0 :::2181                 :::*         LISTEN      1126/java
3.2 配置Kafka集群环境

1)修改Kafka配置文件config/server.properties

# The id of the broker. This must be set to a unique integer for each broker.
broker.id=1
#
listeners=PLAINTEXT://192.168.112.101:9092
advertised.listeners=PLAINTEXT://192.168.112.101:9092
# A comma separated list of directories under which to store log files
log.dirs=/usr/local/elk/kafka-data/kafka-logs
# The default number of log partitions per topic. More partitions allow greater
# parallelism for consumption, but this will also result in more files across
# the brokers.
num.partitions=4
# Zookeeper connection string (see zookeeper docs for details).
# This is a comma separated host:port pairs, each corresponding to a zk
# server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002".
# You can also append an optional chroot string to the urls to specify the
# root directory for all kafka znodes.
zookeeper.connect=192.168.112.101:2181,192.168.112.102:2181,192.168.112.103:2181

2)配置其它节点的kafka,修改以下,其它保持相同:

  • 节点2:
broker.id=2
listeners=PLAINTEXT://192.168.112.102:9092
advertised.listeners=PLAINTEXT://192.168.112.102:9092
  • 节点3:
broker.id=3
listeners=PLAINTEXT://192.168.112.103:9092
advertised.listeners=PLAINTEXT://192.168.112.103:9092

3)创建kafka所需的目录

[root@tango-centos01 kafka-data]# ls
zookeeper
[root@tango-centos01 kafka-data]# mkdir kafka-logs
[root@tango-centos01 kafka-data]# ls
kafka-logs  zookeeper

4)启动Kafka集群

[root@tango-centos01 kafka_2.11-1.1.0]# nohup ./bin/kafka-server-start.sh  ./config/server.properties &
[root@tango-centos02 kafka_2.11-1.1.0]# nohup ./bin/kafka-server-start.sh  ./config/server.properties &
[root@tango-centos03 kafka_2.11-1.1.0]# nohup ./bin/kafka-server-start.sh  ./config/server.properties &

5)检查端口情况

  • 节点1:
[root@tango-centos01 kafka_2.11-1.1.0]# netstat -nlpt | grep -E "9092|2181"
tcp6       0      0 192.168.112.101:9092    :::*           LISTEN      1821/java           
tcp6       0      0 :::2181                 :::*           LISTEN      1407/java
  • 节点2:
[root@tango-centos02 kafka_2.11-1.1.0]# netstat -nlpt | grep -E "9092|2181"
tcp6       0      0 192.168.112.102:9092    :::*          LISTEN      1489/java           
tcp6       0      0 :::2181                 :::*          LISTEN      1160/java

  • 节点3:
[root@tango-centos03 kafka_2.11-1.1.0]# netstat -nlpt | grep -E "9092|2181"
tcp6       0      0 192.168.112.103:9092    :::*       LISTEN      1432/java           
tcp6       0      0 :::2181                 :::*       LISTEN      1099/java
3.3 Kafka验证测试

1)建立一个主题

[root@tango-centos01 kafka_2.11-1.1.0]# ./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 2 --partitions 1 --topic summer
Created topic "summer".

2)查看哪些主题已经创建

[root@tango-centos01 kafka_2.11-1.1.0]# ./bin/kafka-topics.sh --list --zookeeper localhost:2181
summer

3)查看summer主题详情

[root@tango-centos02 kafka_2.11-1.1.0]# ./bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic summer
Topic:summer    PartitionCount:1        ReplicationFactor:2     Configs:
        Topic: summer   Partition: 0    Leader: 2       Replicas: 2,1   Isr: 2,1

4)发送消息,使用的是生产者角色

[root@tango-centos01 kafka_2.11-1.1.0]# ./bin/kafka-console-producer.sh --broker-list 192.168.112.101:9092 --topic summer
>This is a Message
>Welcome to Kafka

5)接收消息,使用的是消费者角色

[root@tango-centos03 kafka_2.11-1.1.0]# ./bin/kafka-console-consumer.sh --zookeeper 192.168.112.103:2181 --topic summer --from-beginning
Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
This is a Message
Welcome to Kafka
3.4 Kafka常用命令

1)启动Kafka进程

nohup ./bin/kafka-server-start.sh  ./config/server.properties &

2)停止Kafka进程

./bin/kafka-server-stop.sh

3)检查服务状态

netstat -nlpt | grep -E "9092|2181"
ps -ef|grep kafka

4)创建Topic

./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 2 --partitions 4 --topic TestKafka

5)查看Topic情况

./bin/kafka-topics.sh --describe --zookeeper 192.168.112.101:2181
./bin/kafka-topics.sh --describe --zookeeper 192.168.112.101:2181 --topic TestKafka

6)查看消费组情况

./bin/kafka-consumer-groups.sh --new-consumer --bootstrap-server 192.168.112.101:9092 --list
./bin/kafka-consumer-groups.sh  --bootstrap-server 192.168.112.101:9092 --group TestKafka-consumer-group --describe

7)Shell方式生产端

./bin/kafka-console-producer.sh --broker-list 192.168.112.101:9092 --topic  TestKafka

8)Shell方式消费端

./bin/kafka-console-consumer.sh --zookeeper 25.1.34.37:2181 --topic TestKafka --from-beginning

./bin/kafka-console-consumer.sh --bootstrap-server 192.168.112.101:9092 --topic TestKafka --partition 0 --offset 26700

参考资料:

  1. 《Apache Kafka实战》-胡夕,电子工业出版社,2018.5

转载请注明原文地址:https://blog.csdn.net/solihawk/article/details/115901371
文章会同步在公众号“牧羊人的方向”更新,感兴趣的可以关注公众号,谢谢!
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值