消息中间件kafka基础篇
kafka安装
kafka依赖于zookeeper,安装分为zookeeper安装和kafka安装,本文都针对单机版本的安装。
zookeeper的安装
zookeeper官方下载链接: https://zookeeper.apache.org/releases.html#download.
本文以 zookeeper-3.4.6 版本为例,上传到/opt目录下面,
解压
tar -zxvf zookeeper-3.4.6.tar.gz
启动
cd /opt/zookeeper-3.4.6/bin
./zkServer.sh start
查看是否启动
netstat -anp | grep 2181
端口被占用说明启动成功。
kakfa的安装
kafka官方下载链接:
http://kafka.apache.org/downloads.
本文以kafka_2.12-2.5.0 版本为例,上传到/opt目录下面,
解压
tar -zxvf kafka_2.12-2.5.0.tgz
启动
cd /opt/kafka_2.12-2.5.0/
nohup sh bin/kafka-server-start.sh config/server.properties &
查看是否启动
netstat -anp | grep 9092
端口被占用说明启动成功。
如果是集群安装请参考网上其他文章。
kakfa命令行使用
创建topic
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 6 --topic test
–replication-factor 副本数
–partitions 分区数
–topic test topic名称
生产者
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
发送消息
消费者
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
–from-beginning 从offset为0处开始消费
接收消息
查看topic详情
./kafka-topics.sh --zookeeper localhost:2181 --topic test --describe
可以查看topic的分区和副本情况。
查看topic的消费组列表
./kafka-consumer-groups.sh -bootstrap-server localhost:9092 --list
查看具体消费组的情况
./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group console-consumer-87937 --describe
可以查询某个topic具体消费组消费的情况。
查看当前topic的每个分区的最大offset
kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list node169:9092 -topic profile_test_basic_local_performance --time -1
删除topic
使用命令行删除topic只是删除的zookeeper上面的数据信息
./kafka-topics.sh --delete --zookeeper localhost:2181 --topic test
看数据文件发现kafka的数据文件还在
cd /tmp/kafka-logs
再创建topic test发现已经存在了
如果要完全删除topic需要把zookeeper上面的topic信息也删除掉
zkCli.sh -server localhost:2181
rmr /brokers/topics/test
再把kafka日志目录下面的文件删除掉
这时再创建test topic已经可以创建了
kafka相关的数据目录结构
/zookeeper目录结构
ls /
以上与kafka有关的节点为
1.controller_epoch
2.controller
3.brokers
4.admin
5.isr_change_notification
6.consumers
7.log_dir_event_notification
8.latest_producer_id_block
9.config
/controller_epoch
controller_epoch
记录kafka的控制器情况,
初始为0,每次重新选举后+1,用于防止broker脑裂,无视epoch更低的请求,确保事务的一致性。
controller
集群中第一个启动的broker通过在zk创建一个临时节点/controller成为控制器。如果控制器被关闭或者与zk断开连接,这个节点会消失
/brokers
ls /brokers
kafka节点的注册信息
ls /brokers/ids
记录了broker注册的一些配置信息。
ls /brokers/topics
{“controller_epoch”: 表示kafka集群中的中央控制器选举次数,“leader”: 表示该partition选举leader的brokerId,“version”: 版本编号默认为1,
“leader_epoch”: 该partition leader选举次数,“isr”: [同步副本组brokerId列表]}
/clusters
ls /cluster
kakfa集群的唯一标识。
/consumers
新版本的消费者的offset等信息已经迁移到kafka自己的log目录里面去了。
/admin
可以查看kafka删除的topic信息
如果设置了delete.topic.enable=true,那么执行删除命令
./kafka-topics.sh --delete --zookeeper localhost:2181 --topic test之后,会在/admin/delete_topics节点下面建立要删除的topic,controller在/admin/delete_topics节点下面注册了监听器,监听到要删除的topic的时候执行具体的删除逻辑。
/config
topic的配置信息
/isr_change_notification
ISR为所有leader与副本保持一致的副本集合,当ISR 集合发生变更时还会将变更后的记录缓存到isrChangeSet 中,isr-change-propagation任务会周期性(固定值为2500ms)地检查isrChangeSet,如果发现isrChangeSet中有ISR集合的变更记录,那么它会在ZooKeeper的/isr_change_notification路径下创建一个以isr_change_开头的持久顺序节点(比如/isr_change_notification/isr_change_0000000000),并将isrChangeSet中的信息保存到这个节点中。Kafka控制器controller为/isr_change_notification添加了一个Watcher,当这个节点中有子节点发生变化时会触发Watcher的动作,以此通知控制器更新相关元数据信息并向它管理的broker节点发送更新元数据的请求,最后删除/isr_change_notification路径下已经处理过
/latest_producer_id_block
kafka为了保证生产者producer的幂等性,不重复发送,以几个维度作为唯一性的判断依据:
1.PID:每个Producer在初始化时都会被分配一个唯一的PID。
2.sequence numbers:发送者发送每条消息都会生成一个递增的数字,区分发送数据的事务。
3.topic
4.partition
PID + sequence numbers + topic + partition作为u唯一性依据,如果发现重复,则说明消息已经发送过了。
PID生成规则为从zookeeper的 /latest_producer_id_block节点下面PID段(block_start-block_end)获取取值范围。
PID段默认长度为1000,当第一次申请的时候,为0-999,第二次获取的时候拿到block_end(999),在999后获取1000-1999这个段,生成自己的PID,再将1000-1999这个段写入/latest_producer_id_block节点,依次类推,由此保证PID的唯一性,保证kafka生产者生产数据的幂等性。
kafka数据的目录结构
cd /tmp/kafka-logs
其中以__consumer_offset开头的记录的是消费者的offset的topic,test-0代表test这个topic分区为0的数据分区。
cd test-0
.index(物理索引),
.timeindex(时间索引)记录topic分区的索引信息
.log存储的是kafka的具体消息
leader-epoch-checkpoint,保存了每一任leader开始写入消息时的offset 会定时更新
follower被选为leader时会根据这个确定哪些消息可用