概念:kafka是一个基于zookeeper协调的一个发布订阅模式的消息中间件
应用场景:
1.日志存放
2.消息的缓存(在高并发场景下)
3.运营监控,用来记录各种运营监控数据,做数据的统计分析
特点
1.高并发
2.高吞吐量、低延迟(每秒可以处理几万条数据)
3.容错性
(允许集群中节点失败(若副本数量为n,则允许n
系统默认随机指定其中一个borker为第0个分区 然后在这个broker的基础上加1则分配为分区1 以此类推
副本的分配法则是当broker1节点指定为分区1的leader,则boker2节点指定为分区1的follower。
计算公式
前提条件是不一定第0个broker则就会指定 为第0个分区 (防止前几个broker节点服务器压力太大)
将全部N Broker和待分配的m个Partition排序.
将第m个Partition分配到第(m mod n)个Broker上.
将第m个Partition的第j个副本分配到第((m+ j) mod n)个Broker上.
s://img-blog.csdnimg.cn/20210504161602512.png)
1.如果指定分区值 就按分区的值来分区
2.如果没有指定分区值,指定key的值,就按key的hash值与topic分区的数量取余得到的值则指定为分区的值
3.如果既没有指定分区的值也没有指定key的值,则第一次调用时随机生成一个整数,将该值与topic分区的总数取余得到partition的值
consumer (消息消费者) 主动拉取消息的模式
range
n = 分区数量 / 消费者数量
m = 分区数量 % 消费者数量
解释:
前m个消费者消费n+1个
剩余消费者消费n个
将分区数量和消费者数量进行取模位于之前的+1,(7/3=2)即c0会消费前三个(p0,p1,p2), c1即p3和p4 ,c2即p5和p6
RoundRobin轮询策略
: 将消费组内所有消费者以及消费者所订阅的所有topic的partition按照字典序排序,在通过轮询方式逐个将分区以此分配给每个消费者。
consumer group (消费者组 注意的是 一个分区中的一条消息只能被同一个消费者组中的一个消费者进行消费)
topic(主题)
指的是当你生产消息的时候,需要创建一个主题,并划分分区(partition),且一个topic可以创建多个分区,也体现了kafka的特性 高并发。创建完成之后消费者去分区中拉取消息进行消费。
主题中的分区数量一般是和消费者组中的消费者数量是一致的,且创建的分区应该是broker数量的2~3倍。具体情况具体对待。
leader(负责读写消息)
follower(负责消息数据备份)
replication
每个partition可以在其他的kafka broker节点上存副本,以便某个kafka broker节点宕机不会影响这个kafka集群。存replica副本的方式是按照kafka broker的顺序存。例如有5个kafka broker节点,某个topic有3个partition,每个partition存2个副本,那么partition1存broker1,broker2,partition2存broker2,broker3。。。以此类推(replica副本数目不能大于kafka broker节点的数目,否则报错。这里的replica数其实就是partition的副本总数,其中包括一个leader,其他的就是copy副本)。这样如果某个broker宕机,其实整个kafka内数据依然是完整的。但是,replica副本数越高,系统虽然越稳定,但是回来带资源和性能上的下降;replica副本少的话,也会造成系统丢数据的风险。
副本分配规则 类似轮询的规则进行分配
采用的是将全部N Broker和待分配的i个Partition排序.
将第i个Partition分配到第(i mod n)个Broker上.
将第i个Partition的第j个副本分配到第((i + j) mod n)个Broker上.
partition
- 消息投递可靠性
Kafka提供了三种模式:-
第一种是啥都不管,发送出去就当作成功,这种情况当然不能保证消息成功投递到broker;
-
第二种模型,即只要Master确认收到消息就算投递成功;实际使用时,根据应用特性选择,绝大多数情况下都会中和可靠性和性能选择第
-
第三种是Master-Slave模型,只有当Master和所有Slave都接收到消息时,才算投递成功,这种模型提供了最高的投递可靠性,但是损伤了性能;
Partition ack:
ack=1,表示producer写partition leader成功后,broker就返回成功,无论其他的partition follower是否写成功。
ack=2,表示producer写partition leader和其他一个follower成功的时候, broker就返回成功,无论其他的partition follower是否写成功。
ack =-1 表示只有producer全部写成功的时候,才算成功,kafka broker才返回成功信息。
这里需要注意的是 ,如果ack=1的时候,一旦有个broker宕机导致partition的follower和leader切换,会导致丢数据。
-
新增消费者、新增主题、主题中新增分区就会出现rebalance 行为
而rebalance行为会导致消费者停止消费,等rebalance之后才会继续消费数据
一个主题 6个分区 一个消费者组 6个实例 6个消费者
一个主题 6个分区 一个消费者组 6个实例 6个消费者
个人觉得:多个主题 多个分区 就需要定义多个消费者组 分区的数量和消费者的数量是一对一的最好
demo:
关键代码
/**
* @author xiaofeng
* @version V1.0
* @title: TestKafkaConsumer2.java
* @package: com.example.demo.kafka.consumer
* @description: kafka消费者
* @date 2018/4/2 0002 下午 3:31
*/
@Component
public class TestKafkaConsumer {
Logger logger = LoggerFactory.getLogger(getClass());
/**
* topics: 配置消费topic,以数组的形式可以配置多个
* groupId: 配置消费组为”xiaofeng1“
*
* @param message
*/
@KafkaListener(topics = {"${kafka.test.topic}"},groupId = "xiaofeng1")
public void consumer(String message) {
logger.info("groupId = xiaofeng1, message = " + message);
}
}
问题一
The Cluster ID xxx doesn't match stored clusterId Some(xxx) in meta.properties. The broker is trying
ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
kafka.common.InconsistentClusterIdException: The Cluster ID 5wuVzKv8ST-yi888x5F5kg doesn't match stored clusterId Some(b6IB_--tRdml_53SAMp_sA) in meta.properties. The broker is trying to join the wrong cluster. Configured zookeeper.connect may be wrong.
at kafka.server.KafkaServer.startup(KafkaServer.scala:218)
at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:44)
at kafka.Kafka$.main(Kafka.scala:84)
at kafka.Kafka.main(Kafka.scala)
问题二(客户端工具连接失败listeners配置)
意思是集群id跟元数据meta.properties中存储的不一致,导致启动失败。
因此去查看meta.properties文件中的元数据信息。这个文件的存储路径是通过/config/server.properties配置文件中的log.dirs属性配置的。所以通过配置文件找到meta.properties,修改里面的cluster.id即可。
但是不知道为什么会出现这个集群id不一致的问题,可能是很久没有启动服务器导致出现了什么数据异常。。。
kafka端口号
https://www.cnblogs.com/acme6/p/11508209.html
官方中文文档
官方英文文档
链接
https://www.it610.com/article/1282308947549634560.htm 具体看这个就懂了
命令
kafka 脚本启动 -daemon 表示后台守护进程
[atguigu@hadoop102 kafka]$ bin/kafka-server-start.sh -daemon config/server.properties
[atguigu@hadoop103 kafka]$ bin/kafka-server-start.sh -daemon config/server.properties
[atguigu@hadoop104 kafka]$ bin/kafka-server-start.sh -daemon config/server.properties
停止kafka
bin/kafka-server-stop.sh stop
通过kafka-producer-perf-test.sh模拟生产数据, 此时我调用了两次,总共生产了10万数据
bin/kafka-producer-perf-test.sh --topic IDENTITYDEATH --throughput -1 --num-records 50000 --record-size 100 --producer-props bootstrap.servers=localhost:9092 ack=-1
通过kafka-console-consumer.sh 建立两个消费者
bin/kafka-console-consumer.sh --bootstrap-server=localhost:9092 --topic BankCard --from-beginning --consumer-property group.id=lym1
当kafka-producer-perf-test.sh模拟的500万数据生产完后, 准备调用第二次时创建test_group2从最新位移开始消费, 这样就是从5000000开始消费, test_group2最终只能消费5000000, 而test-group1会消费10000000万数据.
bin/kafka-console-consumer.sh --bootstrap-server=localhost:9092 --topic BankCard --consumer-property group.id=lym2
1. 创建topic
linux: > bin/kafka-topics.sh --create --zookeeper localhost:2182 --replication-factor 1 --partitions 1 --topic test
2.查看消费组的信息
bin/kafka-consumer-groups.sh --bootstrap-server 192.168.64.141:9092,192.168.64.143:9092,192.168.64.146:9092 --describe --group lym1
查看 所有主题 : bin/kafka-topics.sh --zookeeper 127.0.0.1:2182 --list
查看 分区 副本情况 : ./kafka-topics.sh --zookeeper 127.0.0.1:2181 --describe --topic BankCard
创建 副本3 分区6 topic:
bin/kafka-topics.sh --create --zookeeper localhost:2182 --replication-factor 3 --partitions 1 --topic BankCard
bin/kafka-topics.sh --create --zookeeper localhost:2182 --replication-factor 3 --partitions 1 --topic IDENTITY
bin/kafka-topics.sh --create --zookeeper localhost:2182 --replication-factor 3 --partitions 1 --topic INVOICEVERIFYRECORD
bin/kafka-topics.sh --create --zookeeper localhost:2182 --replication-factor 3 --partitions 1 --topic IDENTITYDEATH
bin/kafka-topics.sh --create --zookeeper localhost:2182 --replication-factor 3 --partitions 1 --topic MOBILETHREEELEMENT
bin/kafka-topics.sh --create --zookeeper localhost:2182 --replication-factor 3 --partitions 1 --topic PHONE
查看主题的详细信息指令
./bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic 主题名称
#demo
./kafka-topics.sh --zookeeper localhost:2181 --describe --topic IDENTITYDEATH
修改主题的分区消息指令
./bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic 主题名称 --partitions 分区数量
#demo
bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic BankCard --partitions 6
bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic IDENTITY --partitions 6
bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic PHONE --partitions 6
bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic IDENTITYDEATH --partitions 6
删除主题 top ic
bin/kafka-topics.sh hadoop102:2181 --delete --topic first
重新分配副本以及扩容
前提条件得新建一个需要重新分区的json文件
# demo
https://blog.csdn.net/forrest_ou/article/details/79141391
https://www.it610.com/article/1282308947549634560.htm 具体看这个就懂了
1、generate模式,给定需要重新分配的Topic,自动生成reassign plan(并不执行)
2、execute模式,根据指定的reassign plan重新分配Partition
3、verify模式,验证重新分配Partition是否成功
第一步 bin/kafka-reassign-partitions.sh --zookeeper localhost:2182 --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2" --generate
第二步 bin/kafka-reassign-partitions.sh --zookeeper localhost:2182 --reassignment-json-file result.json --execute
第三步 bin/kafka-reassign-partitions.sh --zookeeper localhost:2182 --reassignment-json-file result.json --verify
查看消费情况
[kafka查看消费数据](https://www.cnblogs.com/szy13037-5/articles/12451611.html)
在老版本中,使用kafka-run-class.sh 脚本进行查看。但是对于最新版本,kafka-run-class.sh 已经不能使用,必须使用另外一个脚本才行,它就是kafka-consumer-groups.sh
1.要想查询消费数据,必须要指定组。那么线上运行的kafka有哪些组呢?使用以下命令:
bin/kafka-consumer-groups.sh --bootstrap-server kafka-1.default.svc.cluster.local:9092 --list
2.查看消费情况
bin/kafka-consumer-groups.sh --describe --bootstrap-server kafka-1.default.svc.cluster.local:9092 --group usercenter
参数解释:
--describe 显示详细信息
--bootstrap-server 指定kafka连接地址
--group 指定组。
注意:--group指定的组必须存在才行!可以用上面的--list命令来查看