Kafka

Kafka简介

Kafka用于各个子系统(微服务)的数据交换。
每个子系统从Kafka读取数据。

 

Kafka原理

 

Kafka介绍

用于缓存数据存储,可重复读。
消息接收者称为:Consumer	kafka集群由多个Kafka实例组成。每个实例称为brokr。
无论是kafka集群还是consumer都依赖Zookeeper集群来保存一些meta信息,来保证系统的高可用性。

生产者:向broker发送消息。
消费者:consumer 向broker读取消息,消费者跟。
TOPIC:主题
消费者组:每一个组由一个或多个消费者组成,多个消费者,可实现拆分读取数据。组与组之间都可重复读取数据。
Partiton:将数据拆分,算法是通过取模的方式。
leader:数据存储和读取
follower:数据备份

  

Kafka安装

安装包下载:https://archive.apache.org/dist/kafka/0.11.0.2/kafka_2.11-0.11.0.2.tgz
kafka_2.11-0.11.0.2.tgz 2.11为开发语言版本,0.11.0.2 kafka版本。

tar zxf kafka_2.11-0.11.0.2.tgz -C /opt/module
cd /opt/module
mv kafka_2.11-0.11.0.2 kafka

cd kafka/
mkdir logs

egrep -v "#|^$" /opt/module/kafka/config/server.properties 
	#系统唯一不看重复
	broker.id=1
	#开启删除topic功能,物理删除
	delete.topic.enable=true
	
	host.name=172.168.1.61
	listeners=PLAINTEXT://172.168.1.61:9092
	advertised.listeners=PLAINTEXT://172.168.1.61:9092

	num.network.threads=3
	num.io.threads=8
	socket.send.buffer.bytes=102400
	socket.receive.buffer.bytes=102400
	socket.request.max.bytes=104857600
	#不紧放日志还要放数据。
	log.dirs=/opt/module/kafka/logs/
	num.partitions=1
	num.recovery.threads.per.data.dir=1
	offsets.topic.replication.factor=1
	transaction.state.log.replication.factor=1
	transaction.state.log.min.isr=1
	log.retention.hours=168
	log.segment.bytes=1073741824
	log.retention.check.interval.ms=300000
	
	#zookeeper的集群地址
	zookeeper.connect=172.168.1.61:2181,172.168.1.62:2181,172.168.1.63:2181
	zookeeper.connection.timeout.ms=6000
	group.initial.rebalance.delay.ms=0



scp kafka2020-03-16.tar.gz 172.168.1.62:/opt/module
scp kafka2020-03-16.tar.gz 172.168.1.62:/opt/module

#172.168.1.62节点
cd /opt/module/
tar zxf kafka2020-03-16.tar.gz 
vim /opt/module/kafka/config/server.properties 
broker.id=2

#172.168.1.63节点
cd /opt/module/
tar zxf kafka2020-03-16.tar.gz 
vim /opt/module/kafka/config/server.properties 
broker.id=3

  

启动kafka前需要先启动所有zookeeper集群

/opt/module/zookeeper-3.4.14/bin/zkServer.sh start

启动kafka所有节点

/opt/module/kafka/bin/kafka-server-start.sh /opt/module/kafka/config/server.properties &
或
/opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties

  

Kafka命令操作

创建topic

/opt/module/kafka/bin/kafka-topics.sh --zookeeper 172.168.1.61:2181 --create --topic first --partitions 3 --replication-factor 2
	
	--zookeeper 172.168.1.61:2181  #连接到zookeeper
	--create --topic first  创建  名称first
	--partitions 3	 #定义分区的数量
	--replication-factor 2 #副本数

  

查看topic

/opt/module/kafka/bin/kafka-topics.sh --zookeeper 172.168.1.61:2181 --list

 

查看topic详情

/opt/module/kafka/bin/kafka-topics.sh --zookeeper 172.168.1.61:2181 --describe --topic first 

Topic:first     PartitionCount:3        ReplicationFactor:2     Configs:
    Topic: first    Partition: 0    Leader: 1       Replicas: 1,2   Isr: 1,2
    Topic: first    Partition: 1    Leader: 2       Replicas: 2,3   Isr: 2,3
    Topic: first    Partition: 2    Leader: 3       Replicas: 3,1   Isr: 3,1

  

删除topic

/opt/module/kafka/bin/kafka-topics.sh --zookeeper 172.168.1.61:2181 --delete --topic first

  

创建数据,创建数据前需要先创建topic

创建生产者

/opt/module/kafka/bin/kafka-console-producer.sh --broker-list 172.168.1.61:9092 --topic first

  

创建消费者

/opt/module/kafka/bin/kafka-console-consumer.sh  --zookeeper 172.168.1.61:2181 --topic first --from-beginning 

  

当kafka集群的某个节点故障线下后,重新加入集群,数据会存在不平衡现象,通过命令可重新分配。

/opt/module/kafka/bin/kafka-preferred-replica-election.sh --zookeeper 172.168.1.61:2181

  

Kafka写入流程

peoducer采用push模式将消息发布到broker,每条消息都被追加到分区patition中,属于顺序写磁盘。

kafka高吞吐量   

kafka顺序写数据。
kafka零复制 不读取数据,kafka直接通过sendfile指令,从操作系统直接发送数据到用户,不用再将数据读取到应用层。
kafka分段日志,数据拆分成多个文件,需要读取数据时,直接将一块数据读取,不需要再将整个数据读取。
kafka预读,将相邻的数据一起读取出来。
kafka后写, kafka直接将数据交给操作系统的缓存,操作系统定时将数据写入磁盘,不需要将数据存放到buffer中。

 

 

kafka分区

topic+分区

Partition:分区 类似于分片,将数据拆分到不同kafka节点上。可指定

topic:主题 不同用户读取不同的主题。

 

kafka工作流程

1.客户端连接kafka。
2.kafka从zookeeper中获取kafka的leader信息
3.leader会将数据写入logs中。
4.followers从leader获取pull数据。并将数据写入log,成功后返回ack到leader。

 

kafka应答机制

ack=0 不关心Kafka是否接受到数据,直接发送下一条数据,丢失数据的几率非常大。
ack=1 接受leader的确认,并保证leader数据写入log,但不保证leader的数据写入follower上。但leader传输过程中leader重新故障,数据全丢(默认模式)。
ack=-1(all) 接受集群的节点都写入log上,再返回ACK,生产者才能发送下一条数据,最安全,但效率最低。

 

posted @ 2020-03-17 23:36  西瓜瓢  阅读(190)  评论(0)    收藏  举报