1.kafka為什么用到zookeeper
(1)Kafka集群通過Zookeeper來管理kafka的配置,選舉leader;
(2)在Consumer Group發生變化時進行rebalance
(3)所有的topic與broker的對應關系都由zk維護
2.kafka的哪些組件需要注冊到zookeeper
(1)Broker注冊到zk
(2)Topic注冊到zk
(3)Consumer注冊到zk
producer(生產者)不注冊到zookeeper是因為生產者的狀態是瞬間狀態,發送完消息就可以宕機了。
3.kafka和zookeeper的理解
kafka使用zookeeper來實現動態的集群擴展,不需要更改客戶端(producer和consumer)的配置。broker會在zookeeper注冊並保持相關的元數據(topic,partition信息等)更新。
但是發送給Topic本身的數據是不會發到Zk上的。
broker: 每個正在運行的kafka節點,部署kafka的服務器, 以broker.id來區分
producer:消息生產者
consumer:消息的消費者
consumer group:消費者組,同一個消費者組只能有一個consumer能消費消息
topic:主題, 主題中的每條消息包括key-value和timestamp。可以定義多個topic,每個topic又可以划分為多個分區
partition:topic下的消息分區,通過key取哈希后把消息映射分發到一個指定的分區,每個分區都映射到broker上的一個目錄。一般每個分區存儲在一個broker上
replica:副本, 每個分區按照生產者的消息達到順序存放。每個分區副本都有一個leader
leader replica:leader角色的分區副本,leader角色的分區處理消息的讀寫請求. Leader和follower位於不同的broker.
follower replica:follower角色的分區副本,負責從Leader拉取數據到本地,實現分區副本的創建
zookeeper主要負責協調管理並保存 Kafka 集群的所有元數據信息,比如集群都有哪些 Broker 在運行、創建了哪些 Topic,每個 Topic 都有多少分區以及這些分區的 Leader 副本都在哪些機器上等信息。
如下:
[cluster, controller_epoch, controller, brokers, zookeeper, admin, isr_change_notification, consumers, latest_producer_id_block, config]
其中,除了zookeeper,其余節點都和kafka有關
brokers 存放創建的主題和broker的id
如下:
[zk: localhost:2181(CONNECTED) 28] ls /brokers
[ids, topics, seqid]
topic 存放Controller的信息 controller_epoch:controller選舉次數 leader_epoch:leader副本選舉次數
[zk: localhost:2181(CONNECTED) 20] get /brokers/topics/t1/partitions/1/state
{"controller_epoch":13,"leader":1,"version":1,"leader_epoch":21,"isr":[2,3,1]}
[zk: localhost:2181(CONNECTED) 21] get /brokers/topics/t1/partitions/0/state
{"controller_epoch":13,"leader":3,"version":1,"leader_epoch":16,"isr":[2,3,1]}
[zk: localhost:2181(CONNECTED) 29] ls /brokers/ids
[1, 2, 3]
[zk: localhost:2181(CONNECTED) 30] ls /brokers/topics
[t1]
其中,Kafka存放id的文件是:/opt/module/kafka-2.11/datas/meta.properties
內容:broker.id=1
controller 存放的是kafka集群的master
如下:
[zk: localhost:2181(CONNECTED) 8] get /controller
{"version":1,"brokerid":1,"timestamp":"1606979310534"}
cZxid = 0x50000006e
ctime = Thu Dec 03 15:08:30 CST 2020
mZxid = 0x50000006e
mtime = Thu Dec 03 15:08:30 CST 2020
pZxid = 0x50000006e
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x100009e9e9a0007
dataLength = 54
numChildren = 0
consumers 存放消費者組的相關信息
如下:
[zk: localhost:2181(CONNECTED) 22] ls /consumers
[console-consumer-37119] --> 消費者組
[zk: localhost:2181(CONNECTED) 24] ls /consumers/console-consumer-37119
[ids, owners, offsets]
[zk: localhost:2181(CONNECTED) 25] ls /consumers/console-consumer-37119/offsets
[t1] --> 主題
[zk: localhost:2181(CONNECTED) 26] ls /consumers/console-consumer-37119/offsets/t1
[0, 1] --> 分區
[zk: localhost:2181(CONNECTED) 27] get /consumers/console-consumer-37119/offsets/t1/0
40 --> 消費者偏移量
cZxid = 0x500000047
ctime = Thu Dec 03 14:18:52 CST 2020
mZxid = 0x500000078
mtime = Thu Dec 03 16:10:51 CST 2020
pZxid = 0x500000047
cversion = 0
dataVersion = 9
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 2
numChildren = 0
如果要格式化zookeeper和kafka:
刪除kafka的logs文件
刪除zookeeper的:/opt/module/zookeeper-3.4.14/zkData/version-2 文件