「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」。
-
建立kafka集群:
-
bin目录下 启动zookeeper
-
启动kafka-server-start 配置文件
配置文件中可以指定端口,bokerid,日志目录(其实就是partition),partition数量
-
// 创建topic,并且他的partition数量是3个 sh kafka-topics.sh --zookeeper localhost:2181 --create --topic test1 --partitions 3 --replication-factor 1// 这条命令让我们看到创建的topic sh kafka-topics.sh --zookeeper localhost:2181 --describe --topic test1 -
// 创建一个消费者 sh kafka-console-consumer.sh --zookeeper localhost:2181 --topic test1 -
// 创建一个生产者,给指定broker和topic放入数据 sh kafka-console-producer.sh --broker-list localhost:9092 --topic test1
-
-
消息怎么知道去哪个partition呢?
有几个策略:在接口partitioner中实现
- 哈希一致算法,根据key的hash值来确定
- 循环,一个一个来。RoundRobin
-
同步的生产者和异步的生产者
- 同步:我把消息放到partition中,必须消费完,才能放入下一个,如果失败就是重试,超过三次就会抛出,好处就是低延迟但是吞吐量不高(当然我们可以一次性发送一组数据)。
- 异步反之。是有个队列,放在队列中。只有等到队列达到一定长度或者一定时间的时候,才会发送。
-
replica
-
个partition会有N个replica,这些replica会均匀分布在不同的broker中。绝对不再自己leader那个broker中
-
replica要解决的问题:
-
怎么如何将数据扩散出去
producer讲数据给到leader,follower是主动去拉取的,这和消费者主动去拉是相似的。
读操作也是读leader的数据
-
何时commit
commit是指什么时候告诉producer你的数据我已经保存了,这个时候kafka一定要保证这条数据是不能丢失的。我们首先讲一下同步复制和异步复制,同步复制就是等到follow全部复制leader的数据完成,才发送commit,异步就是leader得到了数据以后就发送commit。
kafka的策略呢?既有同步也有异步,他的leader维护了一个他所有follwer的列表ISR,如果这些follwer中有的落后太多(可以设置参数,可以是相差的时间,可以是相差的数据),就把这些follwer移除,另外如果这些follwer慢慢的恢复过来,就把他们重新加进来。当所有的follwer都给leader发送ack的时候,leader就commit。
-
-