Kafka -入门学习

kafka

1. 介绍

官网 http://kafka.apache.org/

介绍 http://kafka.apache.org/intro

2. 快速开始

1. 安装

路径: http://kafka.apache.org/downloads

wget https://archive.apache.org/dist/kafka/0.11.0.3/kafka_2.11-0.11.0.3.tgz

sudo tar -zxvf kafka_2.11-0.11.0.3.tgz -C /opt/software/

cd /opt/software/kafka_2.11-0.11.0.3/config/

sudo chown -C admin:admin /opt/software/kafka_2.11-0.11.0.3/

vim server.properties  修改配置信息
# The id of the broker. This must be set to a unique integer for each broker.
broker.id=1
delete.topic.enable=true
log.dirs=/opt/software/kafka_2.11-0.11.0.3/logs

zookeeper.connect=localhost:2181
多个节点配置最好是 hadoop1 , hadoop2 , hadoop3 ,kafka依赖于zookeeper的,集群配置如下
zookeeper.connect=hadoop1:2181,hadoop2:2181,hadoop3:2181


创建日志文件
前提是你zk启动好了

kafka启动 就下面 (最好配置下环境变量) ,记住给其他几台机器穿文件时注意 broker.id=1记得修改.
kafka-server-start.sh -daemon /opt/software/kafka_2.11-0.11.0.3/config/server.properties

启动成功就是
[admin@localhost kafka_2.11-0.11.0.3]$ jps
2880 Jps
2804 Kafka
2185 QuorumPeerMain


修改 bin 下的 kafka-server-stop.sh 文件
PIDS=$(ps ax | grep -i 'kafka\.Kafka' | grep java | grep -v grep | awk '{print $1}')
修改后:
PIDS=$(ps ax | grep -i 'Kafka' | grep java | grep -v grep | awk '{print $1}')

就可以使用了 kafka-server-stop.sh关闭


群启动脚本

2. 客户端CRUD 使用

1. 增加
kafka-topics.sh --zookeeper localhost:2181 --create --topic myfirsttopic --partitions 1 --replication-factor 1
意思就是: 执行zk地址 创建topic 指定topic名字  创建1个分区 创建一个副本

此时 zkCli查看
[zk: localhost:2181(CONNECTED) 6] ls /
[app, cluster, controller, controller_epoch, brokers, zookeeper, admin, isr_change_notification, consumers, latest_producer_id_block, config]
[zk: localhost:2181(CONNECTED) 7] ls /brokers
[ids, topics, seqid]
[zk: localhost:2181(CONNECTED) 8] ls /brokers/topics
[myfirsttopic] (这里多了一个topic节点)
[zk: localhost:2181(CONNECTED) 9] 

2.查看全部信息
kafka-topics.sh --zookeeper localhost:2181 --list

查看某个节点信息
kafka-topics.sh --zookeeper localhost:2181 --describe --topic myfirsttopic

[admin@localhost kafka_2.11-0.11.0.3]$ kafka-topics.sh --zookeeper localhost:2181 --describe --topic myfirsttopic
Topic:myfirsttopic	PartitionCount:1	ReplicationFactor:1	Configs:
	Topic: myfirsttopic	Partition(分区从0开始): 0	Leader(所位于的broker-id): 0	Replicas(副本所在的broker-id位置): 0	Isr(和leader保持同步的副本集合): 0

3. 删除
kafka-topics.sh --zookeeper localhost:2181 --delete --topic myfirsttopic

4.改(alter)
kafka-topics.sh --zookeeper localhost:2181 --alter --topic myfirsttopic --patication 2(修改后的分区只能增加不能减少)



5.启动生产者消费者
kafka-console-producer.sh --topic myfirsttopic --broker-list localhost:9092(可以指定多个)

第一种方式
kafka-console-consumer.sh --topic myfirsttopic --bootstrap-server localhost:9092

第二种方式
kafka-console-consumer.sh --topic myfirsttopic --bootstrap-server localhost:9092 --from-beginning(从头开始消费,涉及到offset)

3. Kafka整体架构和角色

1. 整体架构模型

最开始的模型 P - T - C 模型 , 消费者将自己发布的主题发给Broker,然后存入Broker中,等待消费者使用 , 此时会发现啥问题 ,单点问题, 一个Topic ,那么写入效率会很低, 而且容易宕机

继续 , 进步,完善上面写入较慢的问题 : , 我们发现,此时消费者这边读就麻烦了 , 我要三个都读一遍 , 无语 ,继续改进 ....

此时到了我们第三种架构 , 你有几个 partition ,我去消费的时候, 就派三个人去消费 ,此时就引入了下面的架构 :

但是此时又有一个问题 , 玩意我哪个Topic-Partition 挂掉了咋办呢 ? ,此时就需要建立 副本(duplicate) ,因此引入下面架构 : ,每一个分片都会有相同的副本 ,所以不怕挂掉一个 ,有副本可以接管 .

所以以上架构模型 , 使得 Kafka的 读写 吞吐量 都是特别高的 , 具体细节实现就不讲解了 .么那本事 .

2. 角色分工

1)Producer 消息生产者,就是向kafka broker发消息的客户端;

2)Consumer 消息消费者,向kafka broker取消息的客户端;

3)Consumer Group 消费者组,由多个consumer组成。消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者

4)Broker 一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。

5)Topic 可以理解为一个队列,生产者和消费者面向的都是一个topic

6)Partition:可以理解过分片 , 为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列;

7)Replicate: 副本,为保证集群中的某个节点发生故障时,该节点上的partition数据不丢失,且kafka仍然能够继续工作,kafka提供了副本机制,一个topic的每个分区都有若干个副本,一个leader和若干个follower

8)leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是leader。

9)follower:每个分区多个副本中的“从”,实时从leader中同步数据,保持和leader数据的同步。leader发生故障时,某个follower会成为新的follower。

4. 工作流程 & 存储机制

1. 整个工作流程 , 讲解侧重于读

我们主要关注一个点就是偏移量(offset) ,读写全部取决于offset

那么问题来了 ,offset是啥 ,在哪 , 此时就引出了落盘操作 ,在一个log日志文件里, 他的每一条插入记录都有一个offset , 消费者消费数据,只用拿着 offset(前提是他得自个拿个本本记着,我这次看到哪了)去查找就行了 .

但是我们知道如果一个Topic的分片partition全部让一个日志文件去写的话,会造成,这个日志文件很大 ,查起来也不方便 , 难受 ,此时就引入了 再分片segment , 和 索引 index .

根据上面那张图 , 我们差不多可以看清一个topic的架构了 .

先说文件是怎么存储的把 , 因为任何一个抽象的概念都对应这一个物理概念 .,不然找个就空的 .

首先一个Topic名为 TName的 , 此时他的分区名字叫做 TName-0,TName-1,TName-2 的三个文件夹 , 举个栗子 TName-0 文件夹里 ,会对应着3个segment ,每一个segment会是一个 偏移量.index偏移量.log的文件 ,所以一共6个文件 , 三个log ,三个index .

再看看 indexlog 究竟是啥吧 :

其中 , 我们比如说拿着一个offset =3 的去找 ,会先找到 segment-1 ,然后去找0.index,去里面找偏移量为3的 ,然后找到一个物理偏移值 ,拿着这个值 我们又去了 0.log 文件, 终于找到了我们想要的数据 .

2. 分区策略

我们将一个信息 发出去 ,这个信息主要包含

posted @ 2020-01-29 20:39  Anthony-Dong  阅读(277)  评论(1编辑  收藏  举报