1、什么是Kafka
Kafka是一个分布式流处理平台,有以下三种特性:
1)可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。
2)可以储存流式的记录,并且有较好的容错性。
3)可以在流式记录产生时就进行处理。
它可以用于两大类别的应用:
构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)
构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka stream topic和topic之间内部进行变化)
1.1、Kafka架构
Producer:Kafka的生产者,包括前端(埋点数据传送),后台服务(直接往kafka的集群里扔数据)以及数据库的事务表日志变化捕获等,这里在开发生产者代码时要考虑负载均衡,将数据均匀分到各个分区中。
Broker:Kafka Server被称为broker,一般一台机器部署一个broker,称为Kafka集群的一个节点。
Topic: Topic 就是数据主题,是数据记录发布的地方,可以用来区分业务系统。Kafka中的topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。对于每一个topic, Kafka集群都会维持一个分区日志。
Partition: 每个分区都是有序且顺序不可变的记录集,并且不断地追加到结构化的commit log文件。一个topic可以有一个或多个分区,若是想保持所有记录顺序读写,只能是一个分区。
Replica: partition的副本,保障kafka的高可用。
Leader: 每个topic的相同分区只会有一个leader,并且生产者数据的读写,消费者数据的读写都是和leader进行的。
Follower: follower跟随leader,所有写请求都通过leader路由,数据变更会广播给所有follower,follower与leader保持数据同步。如果leader失效,则从follower中选举出一个新的leader(这里需要注意ISR机制)。
Controller:controller负责管理Kafka集群,由broker竞选上任,第一个抢到在zookeeper上面到临时节点的broker即为controller,并且如果因为GC或者什么原因导致两个controller情况下,Kafka会有一个变量用来记录最新的controller,集群所有节点只听最新的controller发送的指令。
Consumer:消费者,从Kafka中消费消息的终端、服务或者数据库。consumer数量大于partition则有consumer空闲;consumer数量小于partition,则一个consumer消费多个patition;consumer数量等于partition,则一对一。
Consumer Group: 每个consumer都属于一个consumer group,同一个partition只能被同一个consumer group中的一个consumer消费,同一个partition可以被不同consumer group中的多个不同consumer消费。同一个消费者组的多个消费者消费同一个topic的同一个分区就会可能导致数据重复消费(这个需要为消费者指定topic的分区才会导致,一般为消费者指定topic即可,就会自动为同一个消费者组中的消费者分配对应的partition)。
Zookeeper: kafka通过zookeeper来存储集群的元数据信息,包括生产者需要知道topic的各个分区leader在哪些服务器上,kafka集群的controller需要在zk上创建临时节点,消费者需要知道上次消费的offset,以及topic的各个分区leader在哪些服务器上。
Offset:分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset用来唯一的标识分区中每一条记录。在每一个消费者中唯一保存的元数据是offset(偏移量)即消费在log中的位置.偏移量由消费者所控制:通常在读取记录后,消费者会以线性的方式增加偏移量,但是实际上,由于这个位置由消费者控制,所以消费者可以采用任何顺序来消费记录。例如,一个消费者可以重置到一个旧的偏移量,从而重新处理过去的数据;也可以跳过最近的记录,从"现在"开始消费。
Ack: Ack为1的时候只要Leader副本确认收到了生产者数据即可认为数据发送成功,Ack为-1就是在所有副本和Leader完成数据同步都收到了数据后才确认数据发送成功,Ack为0就是生产者不管发送是否成功只管发送。
ISR:多副本机制能保证kafka的高可用,但不能保证数据不丢失。leader宕机时,数据还没有被同步到其他follower,即使选举了新的leader,也会丢失没有同步部分的数据。ISR(in-sync replica)机制主要是为了保证数据的不丢失,ISR列表中存放和leader数据完全同步的follower,只有处于ISR列表中的follower才可以在leader宕机之后被选举为新的leader,因为在这个ISR列表里代表他的数据跟leader是同步的。
2、环境准备
ip | 安装软件 | 内存 | 磁盘空间 |
192.168.80.130 | jdk1.8、zookeeper3.4.10、centos7、kafka2.11-0.11.0.2 | 4G | 20G |
192.168.80.131 | jdk1.8、zookeeper3.4.10、centos7、kafka2.11-0.11.0.2 | 4G | 20G |
192.168.80.132 | jdk1.8、zookeeper3.4.10、centos7、kafka2.11-0.11.0.2 | 4G | 20G |
3、配置hosts
‘
4、创建对应的目录和文件
首先下载kafka的包,并且解压后改名字为kafka,放在/opt/software/下面。
mkdir /opt/software/kafka/log
在/opt/software/kafka路径下创建文件夹logs。
4.1、修改配置文件
vim /opt/software/kafka/config/server.properties
输入以下内容:
# The id of the broker. This must be set to a unique integer for each broker.
# 对于kafka而言,一个broker即对应集群中的一个机器,broker.id这个参数是为了唯一
# 标识集群中的机器。
broker.id=0
# Switch to enable topic deletion or not, default value is false
# 该参数为true才能将kafka对应的topic删除。
delete.topic.enable=true
# The number of threads that the server uses for receiving requests from the network and sending responses to the network
num.network.threads=3
# The number of threads that the server uses for processing requests, which may include disk I/O
num.io.threads=8
# The send buffer (SO_SNDBUF) used by the socket server
socket.send.buffer.bytes=102400
# The receive buffer (SO_RCVBUF) used by the socket server
socket.receive.buffer.bytes=102400
# The maximum size of a request that the socket server will accept (protection against OOM)
socket.request.max.bytes=104857600
# A comma seperated list of directories under which to store log files
log.dirs=/opt/software/kafka/log
# 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=1
# The number of threads per data directory to be used for log recovery at startup and flushing at shutdown.
# This value is recommended to be increased for installations with data dirs located in RAID array.
num.recovery.threads.per.data.dir=1
log.retention.hours=168
zookeeper.connect=worker1:2181,worker2:2181,worker3:2181
4.2、配置环境变量
vim /etc/profile
进入文件后修改添加内容如下:
#KAFKA_HOME
export KAFKA_HOME=/opt/software/kafka
export PATH=$PATH:$KAFKA_HOME/bin
将配置好的文件kafka分发到kafka集群其他节点上,并修改对应的broker.id配置值。
分发命令如下所示:
scp -r /opt/software/kafka/ root@192.168.80.131:/opt/software/
scp -r /opt/software/kafka/ root@192.168.80.132:/opt/software/
我这里的另外两台机器分别改为了1和2。
在192.168.80.131机器上配置如下所示:
# 标识集群中的机器。
broker.id=1
在192.168.80.132机器上配置如下所示:
# 标识集群中的机器。
broker.id=2
5、启动测试kafka集群
在192.168.80.130机器上启动如下命令:
nohup sh /opt/software/kafka/bin/kafka-server-start.sh /opt/software/kafka/config/server.properties &
在192.168.80.131机器上启动如下命令:
nohup sh /opt/software/kafka/bin/kafka-server-start.sh /opt/software/kafka/config/server.properties &
在192.168.80.132机器上启动如下命令:
nohup sh /opt/software/kafka/bin/kafka-server-start.sh /opt/software/kafka/config/server.properties &
5.1、关闭kafka集群
在192.168.80.130机器上启动如下命令:
sh /opt/software/kafka/bin/kafka-server-stop.sh stop
在192.168.80.131机器上启动如下命令:
sh /opt/software/kafka/bin/kafka-server-stop.sh stop
在192.168.80.132机器上启动如下命令:
sh /opt/software/kafka/bin/kafka-server-stop.sh stop
6、参考链接
https://blog.csdn.net/a3125504x/article/details/108128795
https://cloud.tencent.com/developer/article/1446017
https://www.w3cschool.cn/apache_kafka/apache_kafka_cluster_architecture.html