Kafka可以看成一个流平台,这个平台上可以发布和订阅数据流,并把他们保存起来,进行处理。Kafka有点像消息系统,允许发布和订阅消息流,但是它和传统的消息系统有很大的差异,首先,Kafka是个现代分布式系统,以集群的方式运行,可以自由伸缩。其次,Kafka可以按照要求存储数据,保存多久都可以,第三,流式处理将数据处理的层次提示到了新高度,消息系统只会传递数据,Kafka的流式处理能力可以让我们用很少的代码就能动态地处理派生流和数据集。所以Kafka不仅仅是个消息中间件。
消息:Kafka里的数据单元,也就是我们一般消息中间件里的消息的概念。消息由字节数组组成。消息还可以包含键,用以对消息选取分区。
批次:为了提高效率,消息被分批写入Kafka。批次就是一组消息,这些消息属于同一个主题和分区。如果只传递单个消息,会导致大量的网络开销,把消息分成批次传输可以减少这开销。但是,这个需要权衡,批次里包含的消息越多,单位时间内处理的消息就越多,单个消息的传输时间就越长。如果进行压缩,可以提升数据的传输和存储能力,但需要更多的计算处理。
主题和分区:Kafka里的消息用主题进行分类,主题下有可以被分为若干个分区。分区本质上是个提交日志,有新消息,这个消息就会以追加的方式写入分区,然后用先入先出的顺序读取。但是因为主题会有多个分区,所以在整个主题的范围内,是无法保证消息的顺序的,单个分区则可以保证。
生产者:生产者默认情况下把消息均衡分布到主题的所有分区上,如果需要指定分区,则需要使用消息里的消息键和分区器。
消费者:消费者订阅主题,一个或者多个,并且按照消息的生成顺序读取。消费者通过检查所谓的偏移量来区分消息是否读取过。偏移量是一种元数据,一个不断递增的整数值,创建消息的时候,Kafka会把他加入消息。在一个分区里,每个消息的偏移量是唯一的。每个分区最后读取的消息偏移量会保存到Zookeeper或者Kafka上,这样分区的消费者关闭或者重启,读取状态都不会丢失。
多个消费者可以构成一个消费者群组。怎么构成?共同读取一个主题的消费者们,就形成了一个群组。群组可以保证每个分区只被一个消费者使用。消费者和分区之间的这种映射关系叫做消费者对分区的所有权关系,很明显,一个分区只有一个消费者,而一个消费者可以有多个分区。
Broker和集群:一个独立的Kafka服务器叫Broker。broker的主要工作是,接收生产者的消息,设置偏移量,提交消息到磁盘保存;为消费者提供服务,响应请求,返回消息。在合适的硬件上,单个broker可以处理上千个分区和每秒百万级的消息量。多个broker可以组成一个集群。每个集群中broker会选举出一个集群控制器。控制器会进行管理,包括将分区分配给broker和监控broker。集群里,一个分区从属于一个broker,这个broker被称为首领。但是分区可以被分配给多个broker,这个时候会发生分区复制。分区复制带来的好处是,提供了消息冗余。一旦首领broker失效,其他broker可以接管领导权。当然相关的消费者和生产者都要重新连接到新的首领上。
保留消息:在一定期限内保留消息是Kafka的一个重要特性,Kafka broker默认的保留策略是:要么保留一段时间,要么保留一定大小。到了限制,旧消息过期并删除。但是每个主题可以根据业务需求配置自己的保留策略。
优点
1)多生产者和多消费者。
2)基于磁盘的数据存储,换句话说,Kafka的数据天生就是持久化的。
3)高伸缩性,Kafka一开始就被设计成一个具有灵活伸缩性的系统,对在线集群的伸缩丝毫不影响整体系统的可用性。
4)高性能,结合横向扩展生产者、消费者和broker,Kafka可以轻松处理巨大的信息流,同时保证亚秒级的消息延迟。
zookeeper-3.4.5.tar.gz+kafka_2.12-2.0.0.tgz
1)解压zk
2) 修改配置文件
#进入目录修改文件
cd /usr/local/zookeeper-3.4.5/conf
vim zoo.cfg
#数据目录
dataDir=/usr/local/datas/zookeeper
#日志目录
dataLogDir=/usr/local/logs/zookeeper
#对应zk的节点id及本机ip
server.1=192.168.92.39:2888:3888
3)进入数据目录设置本zk的id
mkdir -p /usr/local/logs/zookeeper
cd /usr/local/datas/zookeeper
echo 1 > myid
1)解压kafaka
2)修改配置文件
cd /usr/local/kafka/config
vim server.properties
#新加配置文件
listeners=PLAINTEXT://192.168.92.39:9092
host.name=192.168.92.39
port=9092
#修改日志文件
log.dirs=/usr/local/logs/kafka/kafka-logs
#修改zk路径
zookeeper.connect=192.168.92.39:2181
3)创建日志路径
mkdir -p /usr/local/logs/kafka
#启动zk
/usr/local/zookeeper-3.4.5/bin/zkServer.sh start
#查看状态
/usr/local/zookeeper-3.4.5/bin/zkServer.sh status
#启动kafka
cd /usr/local/kafka
#前台启动
bin/kafka-server-start.sh config/server.properties
#后台启动
nohup bin/kafka-server-start.sh config/server.properties 1>kafka.start.log 2>&1 &
nohup bin/kafka-server-start.sh config/server.properties 1>/dev/null 2>&1 &
#创建主题,主题名 my-topic,1副本,3分区
./kafka-topics.sh --create --zookeeper 192.168.92.39:2181 --replication-factor 1 --partitions 3 --topic test
连接zk可以查看当前所有topics:
#查看所有主题
./kafka-topics.sh --list --zookeeper 192.168.92.39:2181
#查看所有主题的详情
./kafka-topics.sh --describe --zookeeper 192.168.92.39:2181
##增加分区,注意:分区无法被删除
./kafka-topics.sh --alter --zookeeper 192.168.92.39:2181 --topic test --partitions 5
#删除主题
./kafka-topics.sh --delete --zookeeper 192.168.92.39:2181 --topic test